DNS の設定
Last Modified: Tue Dec 27 00:06:02 JST 2011

目次

DNS の概要

インターネットに接続されたマシンは、すべて IP アドレスで識別される。 しかし IP アドレスは、192.168.64.1 のように一見意味不明な数字の列でできていて、いちいちこんなものを覚えておくのは面倒くさい。 そこで通常は、ホスト名というものをマシンに付けて区別するようになっている。 210.155.110.10 という IP アドレスよりも、www.srs.ne.jp という名前のほうがずっと分かりやすい。

しかしコンピュータ同士は、結局 IP アドレスを使ってアクセスを行わなければならない。 ホスト名を IP アドレスに変換してやらないとアクセスできないのである。 このような名前から IP アドレスへの変換を「名前の解決」と呼ぶ。 名前の解決を行うには、いくつか方法がある。 もっとも単純なのが、ホスト名と IP アドレスとの対応をテキストファイルに書いておく方法だ。 /etc/hosts というファイルが、実際にそういう目的のために用意されている。 普通にインストールされた FreeBSD マシンなら、/etc/hosts の内容はこんな感じになっているはずだ。


127.0.0.1	localhost
192.168.64.2	yourhost

形式はいたって単純で、IP アドレスと対応するホスト名を列挙するだけである。 解決したい名前と IP アドレスのペアをどんどん追加していけば、名前で引けるようになるというわけだ。

しかし、現在数百万のホストが参加しているとも言われるインターネットの世界では、こんなファイルによる方法ではとても管理していけない。 すべてのホストに対応する、数百万行に及ぶ hosts ファイルをメンテナンスしなければならないからだ。 そこで DNS (Domain Name System) という仕組みが考えられた。 DNS は分散データベースという手法でこの問題を解決している。 DNS はインターネットをドメイン単位に分割し、それぞれを管理するデータベースを立てることで膨大な量のリクエストを処理するのである。

解決のあらまし

まず、ダイアルアップ PPP でインターネット接続しているような、一般的な Windows パソコンを例に、名前の解決の順序を説明してみよう。

  1. インターネット接続可能な Windows パソコンならば、TCP/IP のプロパティで DNS サーバを指定しているはずだ。 それはおそらく、ダイアルアップ・プロバイダが提供しているネームサーバだと思う。
  2. web ブラウザで www.yahoo.com でも覗いてみよう。 あなたのパソコンは、www.yahoo.com という名前を IP アドレスに変換しようとする。 そのために、ネームサーバへ問い合わせを行う。
  3. 問い合わせを受けたネームサーバ は、まず自分がその名前をキャッシュしているか否かを調べる。 以前すでに問い合わせをしていて、それがキャッシュに残っていれば、回答としてそれを返す。 残っていなければ、ルートネームサーバと呼ばれる、インターネットのすべての DNS の親玉的存在へ問い合わせる。
  4. ルートネームサーバは、すべての名前を解決するわけではない。 ドメイン名を調べて、解決できそうなネームサーバを紹介するだけだ。 このケースでは、「com」を管理しているネームサーバへ要求をたらい回しにする。
  5. com を管理しているサーバでも、IP アドレスは分からない。 続いて「yahoo.com」を管理しているサーバへと要求を回す。
  6. 「yahoo.com」のネームサーバは、確かに「www.yahoo.com」という名前のホストを知っている。 ここで初めて IP アドレスが得られる。
  7. パソコンに IP アドレスが返され、ようやくアクセスが開始される。

ネームサーバはそれぞれが決められた範囲(ドメイン)だけを管理している。 知らないドメインについては、それを知っていそうなネームサーバへリクエストを回送する。 またネームサーバはキャッシュ機能も持っていて、一度解決できた名前を数時間から数日に渡って保存し、次回の解決のときに再利用することもできる。

設定と起動

最初に断っておくが、ドメインの管理者としてネームサーバを立ち上げる必要が生じたなら、こんないい加減な説明に頼らず、DNS & BIND を読んでほしい。 今では BIND ver.8 に対応した 3rd Edition の日本語訳が書店に並んでいるので、それを買って読めば間違いない。
オンラインの情報としては ISC BIND がある。

さて、ネームサーバを立てると決めたからには、責任を持つべきドメインがあるからに違いない (既存のドメインから名前をもらうだけなら、管理者に頼んで名前を登録してもらえばいいだけで、自分でサーバを立てる必要はない)。 以下の説明では、例として以下のようなシチュエーションで設定を行うこととする。

設定すべき項目は4つある。

  1. 管理するドメインの、ホスト名から IP アドレスへの対応。
  2. 管理する IP アドレスブロックの、IP アドレスからホスト名への対応。
  3. 上記以外のホスト名を解決するとき、問い合わせ先として利用するルートサーバのリスト。
  4. ループバックのための localhost の解決。

具体的な手順は次の通り。

  1. named.conf の作成
    /etc/namedb に named.conf というファイルを作成する (インストール時のデフォルトのままならサンプルがあるはずなので、コピーしてとっておく)。 このファイルが、ネームサーバ (named) の設定ファイルとなる。 内容は次の通り。

    //
    // named.conf
    //
    
    options {
    	directory "/etc/namedb";
    };
    
    zone "." in {                        // ルートサーバの指定
    	type hint;
    	file "named.root";
    };
    
    zone "0.0.127.in-addr.arpa" in {     // ローカルアドレス 127.0.0.1 のための設定
    	type master;
    	file "db.127.0.0";
    };
    
    zone "sample.domain.jp" in {         // ドメイン sample.domain.jp のための設定
    	type master;
    	file "db.sample";            // 名前はドメイン名から決める
    };
    
    zone "64.168.192.in-addr.arpa" in {  // アドレス 192.168.64 を逆引きするための設定
    	type master;
    	file "db.192.168.64";        // 名前はアドレスから決める
    };
    
    // named.conf
    設定ファイルの中で、設定すべき4つの項目ごとにファイルを指定する。 ファイル名は named.root、db.127.0.0、db.sample、そして db.192.168.64 だ。
  2. named.root の取得
    このファイルは自分で作るのではなく、最新のものをダウンロードする。 たとえば次の URL からダウンロードできる。
    ftp://ftp.rs.internic.net/domain/named.root
  3. db.sample の作成
    このファイルには、ホストから IP アドレスへ変換するための対応表を記述する。

    ;
    ;  db.sample
    ;
    
    ; Start of Authority
    @         IN     SOA     goblin.sample.domain.jp root.sample.domain.jp (
                             1999040701     ; Serial
                             86400          ; Refresh after 1 day
                             10800          ; Retry after 3 hours
                             604800         ; Expire after 1 week
                             259200         ; Minimum TTL of 3 days
                             )
    
    ; Name Server
              IN     NS      goblin.sample.domain.jp.
    
    ; Address
    localhost IN     A       127.0.0.1
    goblin    IN     A       192.168.64.129
    jackal    IN     A       192.168.64.130
    gridbug   IN     A       192.168.64.131
    
    ; db.sample
    各行の意味はだいたい次の通り。
  4. db.192.168.64 ファイルの作成
    このファイルには、IP アドレスからホスト名へ逆変換を行うためのデータを記述する。

    ; ; db.192.168.64 ; ; Start of Authority @ IN SOA goblin.sample.domain.jp root.sample.domain.jp ( 1999040701 ; Serial 86400 ; Refresh after 1 day 10800 ; Retry after 3 hours 604800 ; Expire after 1 week 259200 ; Minimum TTL of 3 days ) ; Name Server IN NS goblin.sample.domain.jp. ; Pointer 129 IN PTR goblin.sample.domain.jp. 130 IN PTR jackal.sample.domain.jp. 131 IN PTR gridbug.sample.domain.jp. ; db.192.168.64
    各行の意味はだいたい次の通り。
  5. db.127.0.0
    このファイルは、127.0.0.1 というローカルホストにつきものの IP アドレスを解決するためのものだ。

    ; ; db.127.0.0 ; ; Start of Authority @ IN SOA goblin.sample.domain.jp root.sample.domain.jp ( 1999040701 ; Serial 86400 ; Refresh after 1 day 10800 ; Retry after 3 hours 604800 ; Expire after 1 week 259200 ; Minimum TTL of 3 days ) ; Name Server IN NS goblin.sample.domain.jp. ; Pointer 1 IN PTR localhost. ; db.127.0.0
  6. rc.conf の変更
    /etc/rc.conf.local を変更して、起動時に named が立ち上がるようにする。

    named_enable="YES" named_program="/usr/sbin/named" named_options="-u bind -g bind"
    オプションは、named の実効 uid/gid を bind/bind に設定する。
  7. named の起動
    最後に named を起動する。 コマンドラインから次のように入力するだけでよい。

    # /usr/sbin/named -u bind -g bind
    rc.conf.local を変更したのなら、リブートするのもよい。
  8. エラーのチェック
    messages ファイルをチェックして、エラーが記録されていないことを確かめる。 もしエラーが出ていたら、メッセージに従って修正を加える。

    # tail /var/log/messages

スレーブサーバの設定

スレーブサーバとは、他のネームサーバからドメインに関する情報をコピーして利用するタイプのネームサーバのことだ。 このとき、元になる DNS 情報を提供してくれるサーバをマスタサーバと呼ぶ。 スレーブサーバは、データのバックアップや負荷の分散を目的としている。 また、ドメインを登録する際には2つ以上のネームサーバが必要となるので、実務上必要であるとも言える。

ドメイン登録の際にネームサーバを登録するとき、ネームサーバをプライマリ、セカンダリと呼んで区別することがある。 この呼び方は、NIC が紹介するサーバの順序を示しているに過ぎず、DNS のプライマリマスタサーバ、スレーブサーバとは関連がない。 たとえば NIC にプライマリサーバとして登録されているネームサーバが、実は別のマスタサーバのコピーにすぎない、ということも有り得る。

スレーブサーバの設定手順は次の通り。

  1. ディレクトリの作成
    スレーブサーバでは、設定ファイルをプライマリからコピーしてくる。 そのコピーしてきたファイルを保存するディレクトリを作成する。 ディレクトリは、named の実効 uid である bind が書き込めるようにしておかなければならない (普通 /etc/namedb ディレクトリは bind には書けない)。

    # mkdir /etc/namedb/s # chown bind.bind /etc/namedb/s # chmod 750 /etc/namedb/s
  2. named.conf の作成
    スレーブサーバとして、コピーしてくるゾーンの設定を記述する。

    // // named.conf // options { directory "/etc/namedb"; }; zone "." in { type hint; file "named.root"; }; zone "0.0.127.in-addr.arpa" in { type master; file "db.127.0.0"; }; zone "sample.domain.jp" in { // ドメイン sample.domain.jp のための設定 type slave; // 'slave' がスレーブサーバを意味する file "s/bak.sample"; // ディレクトリ s に保存する masters { 192.168.0.10; }; // マスタサーバのIPアドレス }; zone "64.168.192.in-addr.arpa" in { // アドレス 192.168.64 を逆引きするための設定 type slave; // 'slave' がスレーブサーバを意味する file "s/bak.192.168.64"; // ディレクトリ s に保存する masters { 192.168.0.10; }; // マスタサーバのIPアドレス }; // named.conf
  3. named.root の取得
    このファイルは自分で作るのではなく、最新のものをダウンロードする。 要するにプライマリマスタのときと同じだ。 たとえば次の URL からダウンロードできる。
    ftp://ftp.rs.internic.net/domain/named.root
  4. db.127.0.0
    このファイルもプライマリマスタのときと同じものだ。

    ; ; db.127.0.0 ; ; Start of Authority @ IN SOA goblin.sample.domain.jp root.sample.domain.jp ( 1999040701 ; Serial 86400 ; Refresh after 1 day 10800 ; Retry after 3 hours 604800 ; Expire after 1 week 259200 ; Minimum TTL of 3 days ) ; Name Server IN NS goblin.sample.domain.jp. ; Pointer 1 IN PTR localhost. ; db.127.0.0
  5. rc.conf の変更
    以下はプライマリの場合と同様だ。 /etc/rc.conf.local を変更して、起動時に named が起動するように設定する。

    named_enable="YES" named_program="/usr/sbin/named" named_options="-u bind -g bind"
  6. named の起動
    最後に named を起動する。 コマンドラインから次のように入力するだけでよい。

    # /usr/sbin/named -u bind -g bind
  7. エラーのチェック
    messages ファイルをチェックして、エラーが記録されていないことを確かめる。

    # tail /var/log/messages

セキュリティ対策

ネームサーバは、ドメインに所属するすべてのホストのリストを持っていると見なすことができる。 そのような情報は、ドメインを攻撃しようと企む者にとって、手軽で便利な情報と言えなくもない。 たとえば、nslookup を使えば、次のような方法でホストのリストを入手できる。


% nslookup - ns.target.domain Default Server: ns.target.domain Address: ###.###.###.### > ls -d target.domain [ns.target.domain] target.domain. @ 2D IN SOA ns root ( 1999040601 ; serial 1D ; refresh 2H ; retry 4w2d ; expiry 2D ) ; minimum 2D IN NS ns 2D IN NS ns2 2D IN MX 10 mail www 2D IN A ###.###.###.### rdbm 2D IN A ###.###.###.### : :

このような形で的を絞り込むのに使われたりするのは不愉快なので、何らかの対策を立てておく必要がある。

ゾーン転送の制限

nslookup や勝手なスレーブサーバ構築などに対処する方法として、ゾーン転送の制限がある。 ゾーン転送を制限してしまえば、ゾーン情報(具体的には db.sample のような定義ファイルの内容)を読み出すことができなくなる。 もちろん、従来の個々のホスト名の解決は問題なく行うことができるし、正規のスレーブサーバのためにゾーン転送を許可するホストを指定することもできる。

たとえば、ネットワーク 192.168.64.0 からのゾーン転送リクエストは許可するよう設定するなら、named.conf に次のような行を追加すればよい。


options { directory "/etc/namedb"; allow-transfer { 192.168.64.0/24; }; }
ネットワークアドレスの指定はいくつでも並べることができるし、acl 記法によって次のように書くこともできる。

acl nice-hosts { 192.168.64.0/24; 192.168.65.23; }; options { directory "/etc/namedb"; allow-transfer { nice-hosts; }; }
allow-transfer 以外にも、便利なオプションがあるので紹介しておこう。

外部向けと内部専用のネームサーバ

www や mail、ns といった名前は、外部にサービスを提供するためのホストなのだから、名前を公開するのが当然である。 一方ドメイン内部専用の、データベースサーバのホスト名などは、外部に名前を知らせても百害あって一利なしである。 そこですべてのホストをリストアップしたサーバとは別に外部向けのホストだけを提供するネームサーバを立てて、NIC にはそちらを登録する。 内部のホストは、すべてのホストが載っているネームサーバを使って名前の解決をすればよい。


[back to index]