DNSはちゃんと設定しよう

インターネットのコンテンツは、多分にDNS(ドメイン・ネーム・サービス)に依存しています。ウェブサーフィンも、メールのやりとりも、送り先の名前が分かっていても、IPアドレスが分からなければそのホストにたどり着くことすらできない。特に、メールのやりとりは、DNSにどっぷり依存しているといっても過言でない。最近は迷惑メール撲滅のために、DNSで引くことのできないアドレスからのメールは、受け取ってさえくれないようだ。というわけで、早速正しいDNSの設定に仕方です。(正しいかどうかは皆さんで調べてください(^^;;;)
最初はそのホストのネームサーバーデーモンの起動設定ファイルです。基本的に
/etc/named.boot
というファイルを使うことになっています。

directory                   /var/named
cache   .                   named.ca
primary  hoge.co.jp             hoge
primary  0.168.192.IN-ADDR.ARPA   hoge.rev
primary  0.0.127.in-addr.arpa       named.local.rev
primary  localhost             named.local

このファイルの設定により、ネームデーモンは次のような振る舞いをする。
  1. 設定ファイルは /var/namedというディレクトリに格納される。
  2. キャッシュの初期データは、named.caから読み出す。
  3. このサーバーは、hoge.co.jpに対してプライマリーサーバーになり、hogeというファイルからその「ゾーン」のホストに関するすべてのデータを読み出してくる。
  4. このサーバーは、0.168.192.in−addr.arpaに対してプライマリーサーバーとなり、hoge.revというファイルからそのゾーンに対する情報を読み出す。このゾーンは、アドレスから名前を逆引きする為に用意されている。(ゾーンの世界では、アドレスの記述は必ずホスト名を左に書き、ドメインのルートに向かって右に記述していくルールになっている。だから、192.168.0.11というホストをDNS風に書き換えると「11.0.168.192.in-addr.arpa」となる。このホストの名前はlinux1.hoge.co.jpと書いてやると分かると思う。)
  5. このサーバーは、127.0.0.というゾーンのプライマリサーバーとなる。これはローカルループバックというそのホストの中で完結するネットワークのアドレスのことである。
さて、このファイルを保存したら、/var/namedに移ってゾーンファイルを書いてやろう。
/var/named/hoge

@   IN   SOA    linux1.hoge.co.jp. root.hoge.co.jp. (
          1999051700 ; Serial
              28800 ; Refresh
              14400 ; Retry
             3600000 ; Expire
              86400 ) ; Minimum
             IN  NS     linux1
             IN  MX 10  linux1
linux1          IN  A     192.168.0.11
mail           IN CNAME  linux1
win1          IN  A     192.168.0.21

記号@から)までは、SOAである。そのホストの名前、管理者のメールアドレスを書き換える必要があるだけでほとんど決まり文句と言っていいでしょう。管理者メールアドレスは「@」マークを[.]に変えたものだといっても良いです。ただし、ドメイン名を最後まで書くときは、ドメインルートを表す[.]を忘れてはいけない。たとえば
bsd1.hoe.com.
等のように。その後の数字はデータの保持時間(秒)などで、ここら辺はこのままで良いでしょう。「Serial」と書いてあるところはデータのバージョンなので、データの書き換えが行われた時点で少し大きな数字に直す必要があるでしょう。それぞれの行の先頭にある名前がそのゾーンのそれぞれのデータの名前のフィールドで、この場合ホスト名ということになる。@はカレントオリジンなのでそのゾーン全体の情報ということになる。
で、このゾーンの「ネームサーバー」と、メールを送り込むべき「メール・エクスチェンジャー」は、「linux1」ですよと規定しているのが、NSとMXのある行です。ということは、このネームサーバーは、「hoge.co.jpというドメインにメールを送りたいときには、linux1.hoge.co.jpに送ってくださいねー。」といってくれるわけです。
さて、肝心のlinux1のアドレスは、というと、その名前の行の中にAと書いてある行のアドレスが適応されます。この場合192.168.0.11がインターネットアドレスです。(このときはルートからの書き順なんだよな。なんか釈然としないけど・・・ぶつぶつ)
CNAMEというのは、別名定義です。linux1というホストはある時は、mail.hoge.co.jpとも呼ばれることがある、というものです。これを使うと、みんなには、「メールサーバーは、mail.hoge.co.jpだからね。」と宣伝することができるわけです。
後は、
名前 IN A アドレス
という行を追加していけば良いわけですね。

次は逆引きアドレスです。
/var/named/hoge.rev

@   IN   SOA    linux1.hoge.co.jp. root.hoge.co.jp. (
          1999051700 ; Serial
              28800 ; Refresh
              14400 ; Retry
             3600000 ; Expire
              86400 ) ; Minimum
          IN     NS     linux1.hoge.co.jp.
11         IN     PTR    linux1.hoge.co.jp.
21         IN     PTR    win1.hoge.co.jp.

書き方は先ほどと同じですが、Aの代わりにPTRを使います。それから、ドメインルートの[.]を忘れずに。
ローカルアドレスのファイルです。
/var/named.local

@   IN   SOA    localhost. root.localhost. (
          1999051700 ; Serial
              28800 ; Refresh
              14400 ; Retry
             3600000 ; Expire
              86400 ) ; Minimum
          IN     NS     localhost.
localhost.     IN    A       127.0.0.1

/var/named.local.rev

@   IN   SOA    localhost. root.localhost. (
          1999051700 ; Serial
              28800 ; Refresh
              14400 ; Retry
             3600000 ; Expire
              86400 ) ; Minimum
          IN     NS     localhost.
1          IN     PTR    localhost.


今度は、ホスト名をlocalhost.とします。
最後に大切なキャッシュの設定です。標準で付属しているnamed.caは、世界のインターネットのドメイン名のルートサーバーのアドレスを引くように設定されています。もしも、このホストのネームサーバーが名前の解決ができないときには、このルートサーバーに名前の問い合わせに出かけてしまいます。もしルートサーバーに接続できない環境だったりすると名前の解決ができない、とか、なぜか1分ぐらい待たされることがある、などの不具合が出てきます。とりあえず、上流サイトのネームサーバーに問い合わせるように書き換えましょう。
/var/named/named.ca

.       99999999   IN    NS    ns.inaec.gr.jp.
ns.inaec.gr.jp.        IN    A     10.0.0.5

注意::
この例は、伊那EC実験のネットワークにアクセスできる環境であることが条件です。

設定がすんだら、サービスの設定ツールからネームサーバーを起動させましょう。エラーがあるときには
/var/log/messagesというファイルのおしまいの方にエラーメッセージが残るはずです。いったんサービスを止めてファイルを確認しましょう。エラーが出ないようなら。/etc/resolv.confを
search hoge.co.jp
nameserver 192.168.0.11
と記述します。さて動作確認です。
# nslookup
とコマンドを打ちます。「>」というプロンプトが出たら、ホスト名を入力します。そのホストのアドレスが正しき帰ってきたら、設定は成功です。お疲れさま。

ネームデータを外に漏らさない方法

さてこのように設定が済んだネームサーバーなのですが、問題があります。それは、このネームサーバーに登録されているローカルネットワークのアドレスなどの情報が外から見えてしまうということです。たとえば、ネームサーバーを、IPMasquradeを行っているサーバー上で動作させると、外側のネットワークからもネームデーモンにアクセスできてしまうのです。これでは、セキュリティー上望ましいものではありませんし、外のネットワークにも、あり得ない名前が流通してしまうことになります。対策は、
  1. ファイアーウォールの内側のホストで、ネームサーバーを動かす。
  2. bind-8.xを導入してアクセス制限をする。
が考えられます。現状で1の方法は最も簡単な方法ですが、ネームデーモンを動かすことの出来るマシーンがファイアーウォールの他にもう1台必要です。
2の方法を説明しましょう。bind-8.xはパッケージなどがまだ出来ていませんから、ソースを持ってきて自分でコンパイルする必要があります。
ftp://ftp.isc.org/isc/bind/src/bind-8
から
bind-8.2-contrib.tar.gz
bind-8.2-doc.tar.gz
bind-8.2-src,tar.gz
patch1
を取ってきて、適当なディレクトリに保存します。今回は/usr/src/bind8としました。あらかじめxturboservices等でネームサーバーのサービスを止めておきましょう。では、コンパイルです。
# tar xvzf bind-8.2-contrib.tar.gz
# tar xvzf bind-8.2-doc.tar.gz
# tar xvzf bind-8.2-src.tar.gz
# patch -p0 < patch1
# cd /usr/src/bind8/src
# make stdlinks
# make clean
# make depend
# make
# make install

起動ファイルはnamed.bootに代わり/etc/named.confというファイルを使います。

options {
  directory "/var/named"
  listen-on { 192.168.0.11 ; };
  forward first;
  forwarders { 10.0.0.5; };
};
  zone "." {
  type hint;
  file "named.ca"
};
zone "hoge.co.jp" {
  type master;
  file "hoge"
  allow-query { 192.168.0.0/24 ; };
  allow-transfer { 192.168.0.0/24 ; };
};
zone "0.168.192.IN-ADDR.ARPA" {
  type master;
  file "hoge.rev"
  allow-query { 192.168.0.0/24 ; };
  allow-transfer { 192.168.0.0/24 ; };
};
zone "0.0.127.in-addr.arpa" {
  type master;
  file "named.local.rev"
};
zone "localhost." {
  type master;
  file "named.local"
};

ファイルが用意できたら、ネームデーモンを起動させましょう。先ほどのテストを行って、ネームサーバーが正常に動いているか確認しましょう。bind-8.xについては
http://www.d1.dion.ne.jp/~bash/linux/bind.htm
が参考になるでしょう。
さて、皆さんのネットワークの中でメールサーバーを動作させない、という条件の場合/etc/named.bootは

directory                   /var/named
cache   .                   named.ca
primary  0.0.127.in-addr.arpa       named.local

で良いでしょう。とくにローカルのアドレスの設定ファイルはいりません。
また、ネームサーバーも起動する必要が無いようでしたら、/etc/resolv.confを

search inaec.gr.jp
nameserver 10.0.0.5

としておくだけで良いでしょう。

追記

bind-8.2の設定ファイルの中ではルートキャッシュの設定より、forward、forwardersというキーワードが重要な働きをしています。忘れずに設定しましょう。