Linux道場ネットワーク編
第7回DNSの仕組みについて
はじめに
今回は、コンピュータネットワーク(インターネット)の根幹に位置するDNSについてとりあげたいと思います。
DNSの基本的な仕組みとLinux OSへのDNSモジュール(BIND)の導入と設定ファイルについて説明します。
「DNS」とは
はじめに「DNS」とは「Domain Name System」(ドメイン・ネーム・システム)を略した言葉です。
「DNS」とは、ホスト名とIPアドレスとの名前解決(ドメイン名(ホスト名))とIPアドレスとの結び付け)を行う機能、あるいは、サーバのことをいいます。
ホスト名とIPアドレスについて
(TCP/IP)コンピュータネットワークに接続される各ホストはIPアドレスで識別されます。コンピュータネットワークでは、IPアドレスを元に相手のホストを識別し通信を行うわけですが、人間(使用者)がIPアドレスのみで通信を行いたい対象のホストを識別するのは困難です。ホストの識別を人間に分かりやすくするために、IPアドレスとドメイン名(ホスト名)の関連づけを行う「名前解決」という考え方が誕生しました。
- ※ドメイン名ついての説明は後述、IPアドレスについては第3回ネットワークに関連する用語とコマンドを参照してください。
名前解決について
ホスト間通信で「名前解決」が行われている例を挙げてみます。通常、インターネット上のサイトを参照する場合、ブラウザ(Internet Explorer,FireFox等)のアドレス欄に参照したいサイトの「URL」を入力します。
- ※URL = Uniform Resource Locator:インターネット上のアドレスを表す「www.abc.co.jp」、「def.ghi.com」などの記述方式。
このURLには名前解決を行う(接続先)ホスト名が含まれています。またURLの代わりに対象ホストのIPアドレスを入力してもサイトを参照することができます。通信を行うとき、対象ホストの「IPアドレス」を識別して行うので参照できて当然なのですが、ホスト名を入力して対象のホストと通信が行えることから、「ホスト名」が「IPアドレス」と関連づけられて名前解決が行われていることが確認できます。例えば「www.sample.co.jp」というサイトを参照する場合、アドレス欄に「www.sample.co.jp」、またはwww.sample.co.jpの「IPアドレス」を入力しても参照できます。
- ※正確には「sample.co.jp」ドメイン内にある「www」というホストが「IPアドレス」と関連づけられ名前解決が行われています。
インターネット(コンピュータネットワーク)の初期の頃は、この名前解決をホスト名とIPアドレスの関連を記述したテキストファイルで行っていました。
しかし、インターネットの普及(登録を行うホスト数の増加)に伴い、テキストファイルでの管理を行うことが難しくなり、DNSという機能が誕生しました。
現在でも、ホスト名とIPアドレスの関連を記述したテキストファイル(Linux OSでは「hosts」、Windows OSでは「lmhosts」)を使用して名前解決を行う場合もあります。
- ※インターネットが誕生した頃は、開発者の一人がテキストファイルの更新を行い、各ホストの管理者に配布していたとのことです。
DNSの仕組み
DNSはドメイン名(ホスト名)とIPアドレスで名前解決を行う機能だと説明しました。DNSは具体的にどのような仕組みなのか説明していきます。「ドメイン」、「ゾーン」、「分散」、「キャッシュ」にわけて説明します。
ドメインとは
DNSで扱うドメインとは、ネットワーク上のコンピュータのグループ(集まり)を表す単位です。単位名としては「jp」、「com」、「org」などがあげられます。このドメインは階層構造(ツリー構造)になっており、頂点に「.」(ルートドメイン)が存在します。
この「.」(ルートドメイン)の下位に、「jp」、「com」、「org」など複数のドメインがあり、このドメインの下位にも複数のドメインが存在します。例にあげたドメインはドメインの中でもTLD (トップレベルドメイン)と呼ばれ、最上位ドメインの一つです。
図1はドメインの階層構造を図で表したものです。
ドメイン名とは、「.」(ルートドメイン)と各下位のドメイン、ホスト名を連結させたもの言います。ドメイン名にはホスト名も含まれます。ドメイン名:「www.lpi.or.jp.」は、「.」(ルートドメイン)に各ドメイン(「jp」,「or」,「lpi」)とホスト名「www」を連結させたものです。
図1.ドメインの階層構造
図1で各ドメインの下位ドメインは最大で3つにしか分岐していませんが、実際には3つ以上に分岐します。
- ※通常「.」(ルートドメイン)は省略されて表記されますが、ドメイン名の末尾には「.」があることを忘れないで下さい。
ゾーンとは
ゾーンとはドメイン名とIPアドレス情報の対応づけが行われている情報(データベース)をいいます。
(管理されている情報の範囲をゾーンと呼ぶ場合もあります。)
- ※ゾーンファイルの詳細については後述
DNSを利用した名前解決の仕組み
クライアントのブラウザのアドレス欄に「www.lpi.or.jp」を入力し、DNSで名前解決が行われ、LPI-Japanのサイトを参照するまでの手順を追ってみます。
- クライアントのブラウザは入力された「URL」から、対象のドメイン名を抽出する。
- クライアントは抽出されたドメイン名を、OSの名前解決機能に引き渡す。
- クライアントの名前解決機能は「ドメイン名」をネットワーク上のDNSに問い合わせを行う。
- DNSサーバは問い合わせに対する回答を保持している場合、クライアントに回答する。
- DNSサーバが回答を保持していない場合、さらに上位のDNSに問い合わせを行う。
- 上位DNSサーバがDNSサーバの問い合わせに対して回答する。
※回答を保持していない場合はさらに上位のDNSへ問い合わせ。 - DNSサーバは上位DNSサーバから得た回答をクライアントに回答し、自身のキャッシュに回答情報を保存する。
※キャッシュの説明は後述 - クライアントは取得したIPアドレスをブラウザに戻す。
- クライアントのブラウザはIPアドレスを参照し、サイトにアクセスする。
図2はDNSへの問い合わせの流れを表した図です。
図2.DNSへの問い合わせ
手順3の「ネットワーク上のDNSに問い合わせを行う」ですが、DNS情報を予め、OS(名前解決機能)に登録しておく必要があります。DNS情報の登録は手動やDHCPを利用した方法があります。
- ※DHCP =Dynamic Host Configuration Protocolの略で、ネットワークインターフェイスへのネットワーク接続環境(IPアドレス/サブネットマスク/デフォルトゲートウェイ/DNS サーバ)の自動割当(情報連絡)を行う機能(プロトコル)です。
- ※Linux OSでDNSサーバを手動で登録する場合、一般的に「/etc/resolv.conf」の「name server」に記述します。
問い合わせを受けたDNSは、(通常は)自身のゾーン情報を参照しドメイン名に該当するIPアドレス情報がないか確認します。該当する情報を保持している場合はその時点で問い合わせ元にIPアドレス情報を返します。(手順4)
しかし該当する情報を保持していない場合、DNSは上位のDNSサーバに問い合わせを行います。情報を保持していない場合上位のDNSに繰り返し問い合わせを行うことで情報の取得を行います。(手順5)
また、問い合わせのドメイン名に該当するIPアドレス情報がない(存在しない)場合は、「存在しない」という情報を回答します。ドメイン名をDNSサーバで(繰り返し)名前解決を行い、通信が行われます。
- ※ドメインは階層構造になっているので最終的にはドメインの最上位である「ルートドメイン」に問い合わせを行います。
「ルートドメイン」から各ドメイン名をたどることで情報の取得が行えます。
「FQDN」について
各ドメイン名(ルートサーバ「.」を除く)を省略せずに記述する場合、「Fully Qualified Domain Name」(完全修飾ドメイン名)と言います。例えば「www.lpi.or.jp」もFQDNです。
DNSの「分散」について
DNSは「階層型分散構造」のデータベースと表現されます。階層型は「.」(ルートサーバ)を頂点とした「ドメイン」単位による階層構造を指します。「分散」とはDNS情報(ゾーン情報)をネットワーク上に「分散」して管理していることを指しています。
DNS情報は基本的に各ドメイン単位(ゾーン情報の範囲)で分割され、ドメインごとに管理を行うDNSサーバが存在します。
情報の分散は、各ドメインに対して権限と責任の分散、情報の冗長性と各DNSサーバへの負荷(クライアントからのホスト情報の問い合わせ)を軽減します。ドメインの頂点である「.」(ルートドメイン)は、ルートドメインサーバに管理され、世界に13台(分散して)存在しています。(米国に10台、スウェーデン、英国、日本に1台)DNSの用語ではゾーン(ドメイン)を管理できる権限をもつことを「権威」といい、下位のDNSサーバに対してゾーンの管理を移すことを「委譲」といいます。
DNSのキャッシュについて
DNSはクライアントからの問い合わせに対して、ホスト情報を回答しています。(自身で管理していない情報については上位のDNSに問い合わせ) この問い合わせに対するホスト情報は、問い合わせが行われたDNS(サーバ)のキャッシュに保存されます。
この「キャッシュ」に保存する仕組みがDNSでは重要になります。過去のDNS情報をキャッシュに保存しておくことで同じ問い合わせに対しては、上位(権威のある)のDNS に問い合わせを行う必要なく、キャッシュに保存された情報から回答することができます。 この「キャッシュに保存する」仕組みがなければ、ネットワーク全体からルートドメインサーバに対して名前解決の問い合わせが殺到し、過剰な負荷により名前解決処理に支障をきたしてしまいます。
このキャッシュに保存する仕組みが、DNSサーバの負荷を軽減し、膨大な名前解決の問い合わせの処理を可能にしています。
特定のドメインを管理せず、キャッシュによる回答のみ専用に行うDNSサーバをキャッシュサーバと呼び、ドメイン(ゾーン)を管理するサーバをゾーンサーバと呼びます。
DNSの仕組みのまとめ
ホスト名とIPアドレスを関連付けした情報(ドメイン/ゾーン情報)を「.」(ルートドメイン)を頂点とした「ドメイン」単位の階層構造で管理、ネットワーク上に分散させ、各DNS(サーバ)で名前解決(自身ゾーンで管理/上位DNSへの問い合わせ/キャッシュによる回答)を行うのがDNSの仕組みです。
DNSの「マスターネームサーバ」と「スレーブネームサーバ」について
DNS(サーバ)は冗長性を持たせる(1台のDNSがダウンしても名前解決処理を継続させる)為、複数台で構成されています。
ドメイン名情報はゾーンファイルで管理されるわけですが、ゾーンファイルを所有するDNSサーバを「マスターネームサーバ」と呼び、マスターネームサーバのゾーンデータをコピーするDNSサーバを「スレーブネームサーバ」と呼びます。
またゾーンデータをコピーすることを「ゾーン転送」と呼びます。
Linux OSへのDNSの導入について
実際にLinux OSにDNS(キャッシュサーバ)の導入を行います。今回の例ではLinux OSのディストリビューションに「Cent OS 5.0」、DNSソフトウェアに「BIND」(バージョン 9)を使用します。BINDのプロセス名は「named」になります。
インターネットへの接続と「yum」、「resolv.conf」(nameserver)設定が正しく行われていることを前提とします。
「BIND」の導入
「Cent OS 5.0」に「BIND」を導入するには、管理者権限(root)になり、「yum install bind-*」を入力します。(図3参照)
BINDとBINDに必要なモジュールのインストールが行われます。BINDは一般的に「named」ユーザで起動します。
(今回の環境では事前に「named」ユーザが無くとも導入時に作成されました。)
図3.「yum」コマンドによるBINDのインストール
「chroot」について
「ps」コマンドで「named」プロセスを表示すると「/usr/sbin/named -u named -t /var/named/chroot」と表示されます。(図4参照)
この「chroot」は、ファイルシステムのルートディレクトリを変更する機能です。特定のプロセスに対して任意のディレクトリをルートディレクトリに見せかけることができます。「chroot」を行うと「chroot」したディレクトリより上位の階層を参照できなくなります。
BINDは一般的に「named」ユーザで「chroot」を使用して起動します。「chroot」を行う理由はDNS(BIND)の脆弱性をつかれ不正進入され、ユーザ権限を奪われたとしても、他の「コマンド」や「ライブラリ」を参照できなくし、被害を最小限に抑える為です。(行動を制限します。)
図4.「ps」コマンドによる「named」プロセスの表示
BINDの設定について
BINDの設定は「/etc/named.conf」(/etc/bind/named.conf)ファイルとゾーン(ドメイン)を管理するゾーンファイルから成り立ちます。
- ※ディストリビューションによっては、インストール時にnamed.confが作成されない(存在しない)場合やファイルの保存場所が違う場合があります。その時は手動で作成してください。
図5はnamed.confのサンプルです。named.confは複数のステートメントとオプションから構成され、末尾には「;」を記述します。「ルートネームサーバの指定」に記述されている「named.ca」ファイルにはルートネームサーバの一覧(ホスト名とIPアドレス)が記述されています。(今回の環境ではBIND導入時に自動で配置されました。)
- ※検証用に構築を行うのはドメインの管理を行わないキャッシュサーバなので図5にある「サンプルドメインの正引き設定と逆引き設定の記述は必要ありません。
- ※yumコマンドで導入を行った場合、named.confの記述を変更する必要は特にありません。インストール後に「named」ユーザで「chroot」した状態で起動します。
図5.named.confのサンプル
名前解決を行うコマンドについて
それでは実際に他のホストから BIND(DNS)を導入したサーバに問い合わせを行い、名前解決が行われるか確認してみます。問い合わせを行うホストのDNS設定にはBINDを導入したサーバを指定します。
;; /etc/resolv.conf ;;
nameserver <BINDを導入したサーバのIPアドレス>
名前解決を行うコマンドには「nslookup」「host」「dig」があります。
- ※「nslookup」コマンドについてはWindowsのコマンドプロンプト画面からでも使用できます。
下記に各コマンドの書式と「正引き」を行ったときの例を記述します。
「逆引き」(IPアドレスを指定)時の実行結果は省略します。実際に導入を行い、確認してみてください。
「nslookup」コマンドについて
「nslookup」コマンドの書式は「nslookup [ホスト名/ドメイン名/IPアドレス]」になります。
図6は「nslookup」コマンドで名前解決を行いたいホスト名に「testserver.co.jp」を指定したときの実行結果です。
正しくBINDが動作していれば図6のような回答を得ることができます。
- ※「testserver.co.jp」に対して権威あるDNSサーバに問い合わせを行った場合、「Non-authoritative answer」は表示されません。
図6.「nslookup」コマンドによる問い合わせ
「host」コマンドについて
「host」コマンドの書式は「host [オプション] [ホスト名/ドメイン名/IPアドレス] [問い合わせ先DNSサーバ]」になります。
図7は「host」コマンドで名前解決を行いたいホスト名に「testserver.co.jp」を指定したときの実行結果です。
ホスト名のIPアドレスが表示されます。
図7.「host」コマンドによる問い合わせ
「dig」コマンドについて
「dig」コマンドの書式は「dig [@問い合わせ先DNSサーバ] [ホスト名/ドメイン名/IPアドレス] [クエリタイプ]」になります。
「dig」コマンドは詳細な情報をDNSサーバから取得できます。(dig = Domain Information Groperの略です。)
図8は「dig」コマンドで名前解決を行いたいホスト名に「testserver.co.jp」を指定したときの実行結果です。
問い合わせを行ったホスト情報について「QUESTION SECTION」(問い合わせ内容)、「ANSWER SECTION」(問い合わせに対する回答)、「AUTHORITY SECTION」(問い合わせ先に権威がある場合に表示)、「ADDITIONAL SECTION」(回答したホストのIPアドレスなどの付属的な情報)の4つに項目に分類されて表示が行われます。
図8.「dig」コマンドによる問い合わせ
「ゾーンファイル」について
ゾーンファイルについて説明します。ゾーンファイルは「$ORIGIN」と「$TTL」ディレクティブ、リソースレコードから構成されます。
リソースレコードではゾーン情報を記述します。またリソースレコード内の「@」はドメイン自身を意味するのでSOAレコード(※説明は後述)内に管理者メールアドレスの記述を行うときは「@」の代わりに「.」で記述します。
また、ドメイン名はFQDN(ドメイン名末尾に「.」)で記述します。
図9は「sample.co.jp」ドメインの正引きゾーンファイル「sample.co.jp.zone」、図10は逆引きゾーンファイル「xxx.xxx.xxx.in-addr.arpa.zone」の中身です。
図9.「sample.co.jp」ドメインの正引きゾーンファイル(sample.co.jp.zone)
図10. 「sample.co.jp」ドメインの逆引きゾーンファイル(xxx.xxx.xxx.in-addr.arpa.zone)
表1ゾーンファイルの各項目と意味について記述した表です。
表1.ゾーンファイルの各項目と意味
終わりに
今回はコンピュータネットワーク(インターネット)の根幹である「DNS」の基本的な仕組みについて取り上げました。
BINDについては設定ファイルの説明のみになってしまいましたが、状況に応じてさらに細かい設定(DNSの問い合わせの制限、ゾーン情報転送の制限など)を行うことが可能です。次回は、 メールサーバ(電子メール)について取り上げます。
コラム執筆/森谷 仁
マイクロテクノロジー株式会社 管理本部 情報システム室
〒101-0021
東京都千代田区外神田5-1-2末広ビル
TEL 03-3833-8080