2015/03/11
DNSサーバに nsd を使う設定メモ。FreeBSDのports からのインストールなので、tarballからの細かい作業はすっ飛ばしてある。
プライマリDNSサーバを走らせていた仮想マシンをメンテするため、別のセグメントにセカンダリDNSサーバを立ち上げした。
ドメインは hogehoge.jp を仮定している。
OS環境はプライマリ・セカンダリとも FreeBSD 10.1 64bit版で、コンテンツサーバ nsd を使用している。
portinstall なり cd /usr/ports/dns/nsd; make install なりで済ます。このドキュメント作成時点では nsd 4.1.1 がインストールされる。 nsd実行アカウントユーザ nsd、グループ nsd が作成される。
インストールが済んだら以下を /etc/rc.conf に追加する。
nsd_enable="YES"
次に、nsd-control-setup の実行を行い証明書を生成する。nsd-controlコマンドを使うためこれは必須。
/usr/local/etc/nsd/nsd.conf.sample があるので、こちらを/usr/local/etc/nsd/nsd.conf へコピーし、編集する。
以下記述は必要な部分だけ集めたもの。 定義中、プライマリサーバは aaa.bbb.ccc.ddd 、セカンダリサーバは www.xxx.yyy.zzz のIPアドレスとする。
既にプライマリでも nsd が運用されていた場合、nsd.conf でセカンダリサーバへのサーバへ通知について定義する。
server: ip-address: aaa.bbb.ccc.ddd logfile: "/var/log/nsd.log" hide-version: yes remote-control: control-enable: yes pattern: name: "myzone" zonefile: "%s.zone" notify: www.xxx.yyy.zzz NOKEY provide-xfr: www.xxx.yyy.zzz NOKEY notify-retry: 5 outgoing-interface: aaa.bbb.ccc.ddd
nsd-controlコマンドで定義するので zone セクションは定義していない。
nsd.conf でプライマリサーバの通知を受け付ける定義を実施する。
server: ip-address: www.xxx.yyy.zzz logfile: "/var/log/nsd.log" hide-version: yes remote-control: control-enable: yes pattern: name: "myslavezone" zonefile: "%s.zone" allow-notify: aaa.bbb.ccc.ddd NOKEY request-xfr: AXFR aaa.bbb.ccc.ddd@53 NOKEY allow-axfr-fallback: yes outgoing-interface: www.xxx.yyy.zzz
nsd-controlコマンドで定義するので zone セクションは定義していない。
request-xfrの定義で@53をつけているのはポートを明示したほうがいいよ、という話しがあったため。無しで動作するなら@53は消してもよいかも。
セカンダリ側のnsdを起動。
root@amane # service nsd start Starting nsd. root@amane #
プライマリ側のnsdを再起動。
root@sakura # service nsd restart Stopping nsd. Waiting for PIDS: 5750. Starting nsd. root@sakura #
セカンダリサーバでの初回登録が行われていない状態だとプライマリサーバの /var/log/nsd.log に
[2015-03-11 hh:mm:ss.sss] nsd[5750]: error: xfrd: zone hogehoge.jp: received notify response error NAME ERROR from www.xxx.yyy.zzz [2015-03-11 hh:mm:ss.sss] nsd[5750]: error: xfrd: zone hogehoge.jp: received notify response error NAME ERROR from www.xxx.yyy.zzz [2015-03-11 hh:mm:ss.sss] nsd[5750]: error: xfrd: zone hogehoge.jp: received notify response error NAME ERROR from www.xxx.yyy.zzz [2015-03-11 hh:mm:ss.sss] nsd[5750]: error: xfrd: zone hogehoge.jp: received notify response error NAME ERROR from www.xxx.yyy.zzz [2015-03-11 hh:mm:ss.sss] nsd[5750]: error: xfrd: zone hogehoge.jp: received notify response error NAME ERROR from www.xxx.yyy.zzz [2015-03-11 hh:mm:ss.sss] nsd[5750]: error: xfrd: zone hogehoge.jp: max notify send count reached, www.xxx.yyy.zzz unreachable
と怒られるので、初回だけセカンダリサーバでaddzoneする必要がある。
nsd.confと同じディレクトリに、プライマリサーバのゾーンファイルをコピーし、nsdへ登録する。このゾーンファイルはBINDで作るものと同じ書式。以下は作業で使った例。
$TTL 3600 @ IN SOA name.hogehoge.jp. root.hogehoge.jp. ( 2015031101 ;serial 10800 ;refresh 3600 ;retry 604800 ;expire 600 ) ;negcache ; IN NS name.hogehoge.jp. IN NS name2.hogehoge.jp. ; localhost IN A 127.0.0.1 ; @ IN MX 10 mail.hogehoge.jp. ; @ IN A mmm.nnn.ooo.ppp name IN A aaa.bbb.ccc.ddd name2 IN A www.xxx.yyy.zzz mail IN A mmm.nnn.ooo.ppp
nsd-controlコマンドの addzone サブコマンドで hogehoge.jp.zone を登録する。
root@amane # nsd-control addzone hogehoge.jp myslavezone ok root@amane #
必要なら逆引きのゾーンファイルも同じように登録する。
その後はプライマリサーバ側でゾーンの情報が修正されるとその内容がセカンダリサーバへ転送される。 たとえばゾーンファイルのシリアルが 2015031101 から 2015031102 に変更されていれば、セカンダリサーバの /var/log/nsd.log に
[2015-03-11 hh:mm:ss.sss] nsd[5596]: info: zone hogehoge.jp serial 2015031101 is updated to 2015031102.
が記録され、変更内容が転送されている事がわかる。
セカンダリサーバを hogehoge.jp のネームサーバとして登録する。この設定は契約している業者により異なると思う。
うちの場合は name.hogehoge.jp(aaa.bbb.ccc.ddd) と name2.hogehoge.jp(www.xxx.yyy.zzz) を登録した。
hogehoge.jp.zoneに定義した nameとname2は、業者のシステムで要求しているため。
業者側のDNSに反映が行われたら(最短でも1日くらいかかるかと)、短時間プライマリ側のサービスを停止してdigコマンドやdrillコマンドで名前解決が出来ることを確認する。
セカンダリ側が機能しているようなら成功。