ゾーンファイルの設定例

書式がわかったところで、具体的なゾーン設定例を挙げる。

named.ca

ルートサーバの定義ファイル。 ftp://ftp.rs.internic.net/domain/named.root をダウンロードしてリネーム。運用開始後も、時々シリアルナンバーを比較して、必要なら更新。

localhost.zone

localhost => 127.0.0.1 の解決をする正引き。

$TTL 86400
@       IN      SOA     localhost.  root.hoge.cxm. (
  2004040101 ;serial
  28800      ;refresh 8h
  14400      ;retry 4h
  604800     ;expire 1w
  10800 )    ;nttl 3h
        IN      NS      localhost.
        IN      A       127.0.0.1

localhost.rev

127.0.0.1 => localhost の逆引き。

$TTL 86400
@       IN      SOA     localhost.  root.hoge.cxm. (
  2004040101 ;serial
  28800      ;refresh 8h
  14400      ;retry 4h
  604800     ;expire 1w
  10800 )    ;nttl 3h
        IN      NS      localhost.
1       IN      PTR     localhost. 

hoge.cxm.zone

ゾーン "hoge.cxm" の正引き。サーバが2台 (ローカルでの名前 host1host2) あり、それぞれにメールと WWW を提供しているとする。加えて、ゲイトウェイであるルータ (rt0) も登録してある。
もし、データ部だけが異なる同一のレコードがあった場合、named はクエリを受ける度にいずれかをランダムに返す。このメカニズムは、同じ内容を持つWEB サーバを複数置き、負荷分散を行う場合などに利用される。

$TTL 86400
@       IN      SOA     ns.hoge.cxm.  root.hoge.cxm. (
  2004040101 ;serial
  28800      ;refresh 8h
  14400      ;retry 4h
  604800     ;expire 1w
  10800 )    ;nttl 3h
        IN      NS      ns.hoge.cxm.
        IN      MX      10  mail.hoge.cxm.
        IN      MX      20  mail2.hoge.cxm.
host1   IN      A       192.168.0.1
mail    IN      A       192.168.0.1
ns      IN      A       192.168.0.1
www     IN      CNAME   host1
host2   IN      A       192.168.0.2
mail2   IN      A       192.168.0.2
www2    IN      CNAME   host2
rt0     IN      A       192.168.0.254

hoge.cxm.rev

ゾーン "0.168.192.in-addr.arpa" の逆引き。

$TTL 86400
@       IN      SOA     ns.hoge.cxm.  root.hoge.cxm. (
  2004040101 ;serial
  28800      ;refresh 8h
  14400      ;retry 4h
  604800     ;expire 1w
  10800 )    ;nttl 3h
        IN      NS      ns.hoge.cxm.
1       IN      PTR     host1.hoge.cxm.
2       IN      PTR     host2.hoge.cxm.
254     IN      PTR     rt0.hoge.cxm.

named の起動オプション

RedHat系では、named の起動スクリプト /etc/init.d/named の中で、起動オプションを /etc/sysconfig/named ファイルから拾うようにできている。なかなか良くできていて、特に次章の chroot の際に実感。敢えて編集する必要はないが、例えばログをもっと詳細にしたいなら、

OPTIONS="-d 1"

としておけば、起動時の初期デバグレベルが 1 になる。その他の主なオプションは以下:

-u user named を user 権限で動かす。ソケットの作成など root 権限の必要な処理が完了後 user へ setuid する仕組み
-p port 通常は 53 となる named のポートを変えることができる
-t dir dir へ chroot する。 chroot 環境への移行を参照のこと

ログファイルとPIDファイルの整備

named.conf で syslogd を経由しないログを定義した場合には、それに合わせてカスタムログファイルを作っておく。 /var/log/ ディレクトリは named にとって書き込み権限がないため、このようにディレクトリを一段挟む必要がある。この例における /var/log/named/ ディレクトリのパーミションは named.named700 が妥当。

root# touch /var/log/named/named_custom.log
root# chown named.named /var/log/named/named_custom.log
root# chmod 600 /var/log/named/named_custom.log

syslogd を通じて書き出すログファイルは、特に作っておく必要はない。パーミションに関しては PID ファイルにも同様なことが言えるが、 PID ファイルそのものは勝手にできるので放っておけばよい。

rndc ユーティリティ

rndc のアクセス制限

rndc は、named を操作するためのユーティリティ。デフォルトでは TCP の 953 ポートを使って named と通信を行う。 named との通信を成立させるためには、 named と rndc が同じ定義名の同じキーフレーズを使わなければならない。同一のファイルである必要は無い。
いろいろと意地悪なテストをしてみたところ、named は named.conf の "controls" および "key" (今回の設定では別ファイルでinclude) セクションで定義したキーファイルを起動時に 1 度だけ読み込むが、rndc は呼び出す度に rndc.conf で定義したキーファイルを読み込む。 rndc ユーティリティは root にしか使わせないので、 rndc.confrndc.key のパーミションは root.root600 にする。

rndc.confrndc.key を作るには、BIND に付属するツール rndc-confgen を使用する。

rndc-confgen の主なオプション:
-a /etc/rndc.key ファイルだけ生成し、rndc.conf は作らない
-b byte キー長。生成されるキーは HMAC-MD5。最大長の 512 を指定すべき。デフォルトは128
-k name キーの定義名。デフォルトは "rndc-key"

やり方は好みによるが、BIND のインストール時に作られた /etc/rndc.conf (好みによっては rndc.key も) をとっておくならリネームしておき、

root# rndc-confgen -b 512 -k rndckey > /etc/rndc.conf

出来上がった rndc.conf を下記のように編集。赤字部分は、切り取って rndc.key ファイルに貼り付ける。文末に吐き出される named.conf の設定のサンプルも、参考に見るだけ見ておくとためになる。なお、 rndc は今のところ HMAC-MD5 の対称鍵しか使えない。本当は RSA 非対称鍵が使えるといいのだが...

/etc/rndc.conf

key "rndckey" {                                         # 切り取ってrndc.keyへ
        algorithm       hmac-md5;
        secret "***********************************************************";
};
options {
        default-key     "rndckey";
        default-server  localhost;
        default-port    953;
};
server localhost {
        key     "rndckey";
};
include "/etc/rndc.key";                                # 追加する

options セクションは、rndc をオプション無しで起動したときのデフォルト動作を定義する。
server セクションは、接続先ごとに、使うキーを指定する。別のサーバへの接続用に server セクションを複数記述することもできるが、今回はやらない。

/etc/rndc.key

key "rndckey" {
        algorithm       hmac-md5;
        secret "***********************************************************";
};

最後に /etc/rndc.key を複製して /etc/named.key を作る。必要なパーミションが異なるので注意。

rndc のコマンド


reload [zone] named に設定とゾーンを再読込させる。ゾーンを指定するとそのゾーンのみ
reconfig 設定と、新たに増えたゾーンだけ読み込む
flush DNSキャッシュをクリア
trace [level] デバグレベルを level にする。level を省略するとデバグレベルをひとつ上げる
notrace デバグレベルを 0 にする
querylog クエリもログ出力するかどうかのオン/オフを切り替える
dumpdb 現在のキャッシュデータを named のワーキングディレクトリに named_dump.db として書き出す。ダンプ先を恒常的に変更したい場合は named.confoptions セクションで `dump-file "file_path";' を定義すればよい
status named のステータスを stdout に出力
stats named のステータスを named のワーキングディレクトリに named.stats として書き出す

他にもあるが、マスターサーバだけなら主に使うのはこのあたり。詳しくは man を。
なお、named の停止や再起動は、PID ファイルやロックファイルの処理がきちんとされる service コマンド (つまり rc スクリプトの `stop') で行ったほうが間違いない。再起動と "rndc reload" の違いは、

このへんを押さえて使い分ける。