インターネットに接続されたマシンは、すべて 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 パソコンを例に、名前の解決の順序を説明してみよう。
ネームサーバはそれぞれが決められた範囲(ドメイン)だけを管理している。 知らないドメインについては、それを知っていそうなネームサーバへリクエストを回送する。 またネームサーバはキャッシュ機能も持っていて、一度解決できた名前を数時間から数日に渡って保存し、次回の解決のときに再利用することもできる。
最初に断っておくが、ドメインの管理者としてネームサーバを立ち上げる必要が生じたなら、こんないい加減な説明に頼らず、DNS & BIND を読んでほしい。
今では BIND ver.8 に対応した 3rd Edition の日本語訳が書店に並んでいるので、それを買って読めば間違いない。
オンラインの情報としては
ISC BIND がある。
さて、ネームサーバを立てると決めたからには、責任を持つべきドメインがあるからに違いない (既存のドメインから名前をもらうだけなら、管理者に頼んで名前を登録してもらえばいいだけで、自分でサーバを立てる必要はない)。 以下の説明では、例として以下のようなシチュエーションで設定を行うこととする。
設定すべき項目は4つある。
具体的な手順は次の通り。
設定ファイルの中で、設定すべき4つの項目ごとにファイルを指定する。 ファイル名は named.root、db.127.0.0、db.sample、そして db.192.168.64 だ。
// // 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
各行の意味はだいたい次の通り。
; ; 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
各行の意味はだいたい次の通り。
; ; 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
; ; 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
オプションは、named の実効 uid/gid を bind/bind に設定する。
named_enable="YES" named_program="/usr/sbin/named" named_options="-u bind -g bind"
rc.conf.local を変更したのなら、リブートするのもよい。
# /usr/sbin/named -u bind -g bind
# tail /var/log/messages
スレーブサーバとは、他のネームサーバからドメインに関する情報をコピーして利用するタイプのネームサーバのことだ。 このとき、元になる DNS 情報を提供してくれるサーバをマスタサーバと呼ぶ。 スレーブサーバは、データのバックアップや負荷の分散を目的としている。 また、ドメインを登録する際には2つ以上のネームサーバが必要となるので、実務上必要であるとも言える。
ドメイン登録の際にネームサーバを登録するとき、ネームサーバをプライマリ、セカンダリと呼んで区別することがある。 この呼び方は、NIC が紹介するサーバの順序を示しているに過ぎず、DNS のプライマリマスタサーバ、スレーブサーバとは関連がない。 たとえば NIC にプライマリサーバとして登録されているネームサーバが、実は別のマスタサーバのコピーにすぎない、ということも有り得る。
スレーブサーバの設定手順は次の通り。
# mkdir /etc/namedb/s # chown bind.bind /etc/namedb/s # chmod 750 /etc/namedb/s
// // 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
; ; 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
named_enable="YES" named_program="/usr/sbin/named" named_options="-u bind -g bind"
# /usr/sbin/named -u bind -g bind
# 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 に次のような行を追加すればよい。
ネットワークアドレスの指定はいくつでも並べることができるし、acl 記法によって次のように書くこともできる。
options { directory "/etc/namedb"; allow-transfer { 192.168.64.0/24; }; }
allow-transfer 以外にも、便利なオプションがあるので紹介しておこう。
acl nice-hosts { 192.168.64.0/24; 192.168.65.23; }; options { directory "/etc/namedb"; allow-transfer { nice-hosts; }; }
www や mail、ns といった名前は、外部にサービスを提供するためのホストなのだから、名前を公開するのが当然である。 一方ドメイン内部専用の、データベースサーバのホスト名などは、外部に名前を知らせても百害あって一利なしである。 そこですべてのホストをリストアップしたサーバとは別に外部向けのホストだけを提供するネームサーバを立てて、NIC にはそちらを登録する。 内部のホストは、すべてのホストが載っているネームサーバを使って名前の解決をすればよい。