PC の数も増えてくると、ローカルネットワーク内の名前解決のために全部のマシンの hosts ファイルを作成するのは非常に面倒です。PC が増えたら全部書き換えないといけないし…。DNS サーバを稼動させて一括管理してみましょう。
この DNS サーバではローカルネットワークのホスト名を管理し、知らないホスト名はプロバイダの DNS サーバに問い合わせるようにします。
プライベートな DNS なので外部からの DNS 問い合わせの事はまったく考えてません。ドメインを取得して DNS を稼動させる場合には参考にならないので注意してね。
ドメイン名はローカルなネットワーク内のみで使用するので好きな名前を付けてかまいません。
ただし、インターネット上に存在するドメイン名を付けると悲しいことになるので、InterNIC が配布していない名前を付けることをお勧めします。
named は FreeBSD の配布パッケージに標準で含まれていますので、特にインストール作業は必要ありません。
まず、named の設定ファイル /etc/namedb/named.conf を編集します。
このファイルにはコメントの書式がいろいろあって読みにくいです。/* */ で囲まれているか、# と // 以降の文字列はすべてコメントなので無視してかまいません。
option ステートメントで全体の設定を行います。
プロバイダの DNS サーバが使えるなら、forwarders のコメントアウトをはずし、DNS サーバのアドレスを書き込みます。
そうすると自分で名前解決できない場合には、 まず forwarder で指定した DNS サーバに問い合わせに行くようになります。DNS サーバからの返事がタイムアウトした場合には、自分でルートサーバから名前解決を行います。
forward only; の行を有効にしておくと、forwarder で指定した DNS サーバに問い合わせのみを行い、自分でルートサーバに問い合わせることはしません。
次の allow-query は、この DNS サーバの利用を許可するアドレス範囲を、allow-transfer はゾーン転送を許可するアドレス範囲を指定します。
options { directory "/etc/namedb"; // forward only; // forwarders { // [プロバイダの DNS サーバアドレス]; // }; allow-query { 192.168.1/24; }; allow-transfer { 192.168.1/24; }; };
zone ステートメントでは、名前解決に使うファイルの設定を行います。
最初の zone "." ではルートサーバ情報ファイルを指定してあります。今回の運用方式では、これについては変更する必要はありません。
完全に閉じたネットワークで、インターネット上のホストの名前解決をする必要が無い場合には、このエントリは必要ありませんので設定しないでください。
zone "localhost." / zone "0.0.127.IN-ADDR.ARPA" は localhost の正引き / 逆引き※1の設定をします。
zone "home" / zone "31.168.192.IN-ADDR-ARPA" は home ドメインに所属するホストの正引き / 逆引きの設定をします。
zone "." { type hint; file "named.root"; }; zone "localhost." { type master; file "localhost.zone"; }; zone "0.0.127.IN-ADDR.ARPA" { type master; file "localhost.rev"; }; zone "home" { type master; file "home.zone"; }; zone "1.168.192.IN-ADDR.ARPA" { type master; file "home.rev"; };
type master は、このサーバがマスターデータを所有しているということです。そして、file "ファイル名"でデータファイルを指定します。
type slave とした場合は、他のDNSサーバからデータをコピーして使用します。その場合、マスター側で allow-transfer でゾーン転送を許可する必要があります。
ローカルの正引き情報ファイル home.zone※2 を作成します。雛型などは無いので、一からすべて書くことになります。
1行目に、TTL(生存時間)を指定しておきます。これは問い合わせを行ったクライアントがどのくらいの期間その情報を利用できるかを指定します。(他のDNSサーバのキャッシュに収まっている最長時間を指定できるってことでいいのかな)
2行目には @ IN SOA に続いて、ネームサーバーのホスト名(要するに自分の名前) 管理者のメールアドレスを書きます。ここでのメールアドレス表記は、root@host.domain ならば root.host.domain になることに注意してください。
次にこのファイルのシリアルナンバーを記入します。私は YYYYMMDD[No.] という書式を使っていますが、1 から始めて数を増やしていってもかまいません。この設定ファイルを書き換えたときに、シリアルナンバーを増やさないと設定が反映されないので、管理しやすい方式を使ってください。
それ以降は、リフレッシュ・リトライ・有効時間・最小TTL が秒数でしていされています。私はよく理解できていないのと特別変更する必要がなさそうなので、参考文献に書いてあった数値をそのまま使っています。
以降ローカルに存在する PC やネットワーク機器の名前と IPアドレスを列挙していきます。
# vi /etc/namedb/home.zone $TTL 3600 @ IN SOA denta.home. root.denta.home. ( 2000120901 ; Serial 3600 ; Refresh 300 ; Retry 3600000 ; Expire 3600 ) ; Minimum ; home. IN NS denta.home. soho.home. IN A 192.168.31.1 muramasa.home. IN A 192.168.31.2 emerald.home. IN A 192.168.31.3 penta.home. IN A 192.168.31.10 ruby.hoem. IN A 192.168.31.11 neo.home. IN A 192.168.31.12 jade.home. IN A 192.168.31.13 denta.home. IN A 192.168.31.250 www.home. IN CNAME denta.home.
IN を含む行に、名前とアドレスの対応を書いていきます。
IN NS とある行でドメイン home のネームサーバーは denta.home であると設定します。
次の行から IN A とある行で、ホスト名と IP アドレスの対応を書き連ねていきます。ホスト名の最後に . をつけると完全なホスト名として扱われます。つけない場合には、ドメイン名部分が付加されますので、muramasa とだけ書いてあってもドメイン名が付加されて muramasa.home となって muramasa.home. と同じ扱いになります。最後に . を付け忘れると、muramasa.home.home となってしまうので注意してください。
最後の一行、IN CNAME は別名の表記です。この行では www.home は denta.home の別名と設定されます。
正引き情報ファイルと同じように、逆引き情報ファイル home.rev※2 を作成します。
先頭部分は正引き情報ファイルと同じように書きます。
# vi /etc/namedb/home.rev $TTL 3600 @ IN SOA denta.home. root.denta.home. ( 2000120901 ; Serial 3600 ; Refresh 300 ; Retry 3600000 ; Expire 3600 ) ; Minimum ; IN NS denta.home. 1 IN PTR soho.home. 2 IN PTR muramasa.home. 3 IN PTR emerald.home. 10 IN PTR penta.home. 11 IN PTR ruby.home. 12 IN PTR neo.home. 13 IN PTR jade.home. 250 IN PTR denta.home.
localhost の正引き情報ファイルを作成します。
# vi /etc/namedb/localhost.zone @ IN SOA denta.home. root.denta.home. ( 2000120901 ; Serial 3600 ; Refresh 300 ; Retry 3600000 ; Expire 3600 ) ; Minimum ; IN NS denta.home. localhost. IN A 127.0.0.1
localhost の逆引き用ファイル localhost.rev を作成します。作成用スクリプトが用意されているので、簡単に作れます。
# cd /etc/namedb # sh .make-localhost
ここまでで、DNSサーバの設定は終わりました。
/etc/resolv.conf を編集して、自分の DNS サーバを使うように設定しましょう。
# vi /etc/resolv.conf domain home nameserver 127.0.0.1
/etc/host.conf でネームサーバを参照するように設定されているかも確認してください。
# cat /etc/host.conf hosts bind
設定がすべて終了したら、named をコマンドラインから起動してみます。
# named -u bind -g bind
named は起動時のメッセージを syslog を使って /var/log/messages に出力しています。正常に起動されたか確認してみましょう。
# tail /var/log/messages starting. named 8.2.3-T6B Mon Nov 20 11:27:49 GMT 2000 jkh@bento.FreeBSD.org:/usr/obj/usr/src/usr.sbin/named Ready to answer queries.
Ready to answer queries. の行が出力されていれば正常に起動されています。出力されないなら、設定のミスがあるので設定ファイルを一通り確認してみてください。
ここでは、nslookup を使って正引き / 逆引きが行えるかテストしてみます。
$ nslookup Default Server: denta.home Address: 192.168.31.250 > localhost Server: denta.home Address: 192.168.31.250 Name: localhost Address: 127.0.0.1 > 192.168.31.2 Server: denta.home Address: 192.168.31.250 Name: muramasa.home Address: 192.168.31.2 > www.jp.freebsd.org Server: denta.home Address: 192.168.31.250 Name: www.jp.freebsd.org Address: 210.157.158.42
プライベートネットワーク内のホストと、インターネット上のホストのドメイン名と IP アドレスを適当に入力してみて、正引き / 逆引きが引けていればOKです。
/etc/rc.conf を編集して起動時に自動的に DNS サーバが起動するように設定します。
/etc/default/rc.conf に標準設定のファイルが置いてあるので、必要な項目を /etc/rc.conf にコピーして使うのがお作法です。
# grep named_ /etc/default/rc.conf >> /etc/rc.conf # vi /etc/rc.conf named_enable="YES" # Run named, the DNS server (or NO). named_program="named" # path to named, if you want a different one. #named_flags="" # Flags for named named_flags="-u bind -g bind" # Flags for named
named_flags の行が2行あるので、セキュリティー的に強そうな -u bind -g bind の行を有効にしておきます。これによって、ユーザ bind グループ bind で named が実行されるようになります。