権威DNSサーバの構築
![権威DNSサーバの構築](/img/posts/building-an-authoritative-dns-server/image01.png)
前回の投稿 ではキャッシュDNSサーバを構築したが、各サーバのIPアドレスを登録し名前解決をさせたいので前回作ったキャッシュDNSサーバにゾーン情報を載せて権威DNSサーバとしても動作させることにした。また前回はキャッシュDNSサーバを1台だけ作成したが、今回はもう一台DNSサーバを用意してMaster-Slave構成とすることで耐障害性を向上させる。
BIND のゾーン設定
BINDの設定としてzoneの設定を追加する。named.conf に直接追記してもよいがここではゾーンの設定は別ファイルに追記して管理することとする。まずは BINDの設定ファイル /var/named/chroot/etc/named.conf にゾーン設定が記されたファイルを include で読み込ませる設定を追加する。
include "/etc/named/zone.conf";
次にゾーン設定を記載する設定ファイル zone.conf を新規作成するが、以降はMasterとSlaveで設定内容が少し異なるのでそれぞれ別に説明する。
DNSサーバ1号機のBIND設定 (Master側)
設定ファイルは /var/named/chroot/etc/named/zone.conf に作成した。各説明は下記の通り。
- ACLでスレーブサーバのIPアドレスを定義します。 «Slave IP Address» はスレーブとして動作させるDNSサーバのIPアドレスを入力。
- 今回、権威DNSサーバとして持たせるドメインを記載する。ここでは「example.co.jp」とした。
- Masterサーバとして動作させるので type master; を指定。
- これから作成するゾーンファイル名を記載する。 ここでは「example.co.jp.zone」とした。
- allow-transfer でACLで定義した slaves を指定する。この定義によってゾーン情報が更新された際にスレーブサーバへ通知が行くようになる。
acl "slaves" {
<<Slave IP Address>>; // 1
};
zone "example.co.jp" { // 2
type master; // 3
file "example.co.jp.zone"; // 4
allow-transfer { slaves; }; // 5
};
DNSサーバ2号機のBIND設定 (Slave側)
設定ファイルは /var/named/chroot/etc/named/zone.conf に作成した。各説明は下記の通り。
- 今回、権威DNSサーバとして持たせるドメインを記載する。Masterと同じにするため「example.co.jp」とした。
- Slaveサーバとして動作させるので type slave; を指定。
- ドメインのゾーン情報を持っているMasterサーバのIPアドレスを指定する。
- Masterサーバから取得したゾーン情報を格納するファイル名を記載する。 ここでは「slaves/example.co.jp.zone」とした。
zone "example.co.jp" { // 1
type slave; // 2
masters {
<<Master IP Address>>; // 3
};
file "slaves/example.co.jp.zone"; // 4
};
BIND のゾーン情報ファイル作成
ゾーン情報が記載されたファイルは、Masterサーバの zone.conf で指定した場所 /var/named/chroot/var/named/example.co.jp.zone に作成する。なおゾーン情報ファイルはMasterサーバのみに作成すればよい。各説明の詳細は他サイトを参照してほしい。ここでは特に注意する箇所のみを説明する。
- ポジティブキャッシュのTTL (Time to Live)を設定する。このゾーン情報にある各リソースレコード(AやAAAA等)を問い合わせしてきた他のDNSサーバはこの値で指定した秒数の間、リソースレコードの情報をキャッシュする。
- ゾーン情報のシリアルナンバーを設定する。ゾーン情報を更新する都度にこのシリアルナンバーの数値を増やす。更新した際に増やすことを忘れるとSlaveサーバに更新通知が送信されない。なお数値何でも良いが、以下例のように日にちを基に生成するのが一般的だ。
- NSレコードにはMasterサーバとSlaveサーバを指定する。
$TTL 600 // 1
@ IN SOA ns01.example.co.jp. hostmaster.example.co.jp. (
2020052101 ; Serial Number of this file
600 ; Refresh Time
900 ; Retry Time
2592000 ; Expire Time
600 ) ; Time To Live // 2
IN NS ns01.example.co.jp. // 3
IN NS ns02.example.co.jp. // 3
ns01 IN A <<Master IP Adderss>>
ns02 IN A <<Slave IP Address>>
www IN A <<Web Server IPv6 Address>>
www IN AAAA <<Web Server IPv6 Address>>
設定の反映
設定が完了したら systemctl コマンドでデーモンを restart で再起動させる。反映後は status で正常に起動したことを確認する。
なお再起動後にゾーン転送が開始されるので、最初に受け側であるSlave側サーバを再起動して、その後にMaster側サーバを再起動したほうが良い。
systemctl restart named-chroot
systemctl status named-chroot
ゾーン転送の確認
起動させるとMaster側サーバからゾーン情報の更新通知がSlave側サーバへ送信される。更新通知を受け取るとSlave側からMaster側へゾーン情報を取得しに行く。無事ゾーン情報を取得できればMaster側と同じゾーン情報をSlave側も保有するので両サーバで名前解決が可能となる。
再起動後にゾーン転送が正常に行われているかはログを見て確認しよう。Master側とSlave側のゾーン転送ログは前回の投稿 と同じ設定であれば /var/named/chroot/var/log/xfer.log にある。
Master側のゾーン転送ログは下記のようになる。AXFR started と AXFR ended が出力されていれば問題ない。
21-May-2020 21:49:18.519 xfer-out: client @0x7fe6b010c2f0 <<Slave IP Address>>#38651 (example.co.jp): transfer of 'example.co.jp/IN': AXFR started (serial 2020052101)
21-May-2020 21:49:18.520 xfer-out: client @0x7fe6b010c2f0 <<Slave IP Address>>#38651 (example.co.jp): transfer of 'example.co.jp/IN': AXFR ended
Slave側のゾーン転送ログは下記のようになる。Transfer status: success と Transfer completed が出力されていれば問題ない。
21-May-2020 21:49:18.519 xfer-in: transfer of 'example.co.jp/IN' from <<Master IP Adderss>>#53: connected using <<Slave IP Address>>#38651
21-May-2020 21:49:18.520 xfer-in: transfer of 'example.co.jp/IN' from <<Master IP Adderss>>#53: Transfer status: success
21-May-2020 21:49:18.520 xfer-in: transfer of 'example.co.jp/IN' from <<Master IP Adderss>>#53: Transfer completed: 1 messages, 10 records, 281 bytes, 0.001 secs (281000 bytes/sec)
権威DNSサーバとして動作させるには?
今回は社内のキャッシュDNSサーバに権威DNSサーバとしての機能を乗せる形としたが、ネット上で操作させるDNSはキャッシュDNS機能は不要の場合が多い。その場合は named.conf を修正することで権威機能のみのDNSサーバに変更することが可能だ。
前回の投稿DNSキャッシュサーバを構築する にある /var/named/chroot/etc/named.conf の options ステートメント内で以下を追加&変更すればキャッシュ機能を外すことができる。(未確認のため動作検証は各自行ってほしい)
キャッシュに対する問い合わせを受け付けない様に以下を追加。
allow-query-cache { none; };
再帰的問い合わせを無効にする為に recursion を no に変更。
recursion no;