ローカル環境に構築済みの権威サーバにゾーン(test.com)を追加し、hidden master 構成でゾーン転送を行います。
※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。
構築する環境の要件等については 「ローカル環境にDNS問い合わせの仕組みを構築」 をご参照ください。
全体の構築作業は以下のとおりですが、今回は「③ test.com ゾーンの追加とゾーン転送の設定」を実施します。
① 権威サーバとキャッシュサーバの構築
② 権威サーバの DNSSEC 対応
③ test.com ゾーンの追加とゾーン転送の設定
④ test.com ゾーン転送の TSIG 対応
⑤ test.com ゾーン転送の DNSSEC 対応
今回の構築範囲は下図のとおりです。

追加するゾーン(test.com)は BIND と Knot を使いゾーン転送を行います。構成は以下のとおり。
master(BIND) ⇒ 中継(Knot) ⇒ slave(BIND)
BIND と Knot は1つのホスト(権威サーバ)に同居させます。
master は test.com のゾーンデータの原本管理用とし、クエリ要求には応答しない想定です。クライアント(キャッシュサーバ)からのクエリ要求は slave で応答します。(hidden master 構成)
ゾーン転送に中継(Knot)を挟む理由ですが、Knot で DNSSEC の署名を自動化する(master のゾーンデータを署名し slave へ転送する)ためです。今回の構築では test.com のゾーン転送の設定までとし、DNSSEC の設定は、のちほど実施する予定です。
参考:Knot のインストールについて
Knot のインストールについては情報が少なかったので、ログだけ掲載しておきます。
[root@auth ~]# dnf install epel-release -y
...
Upgraded:
epel-release-8-21.el8.noarch
Complete!
[root@auth ~]# dnf install knot -y
...
Installed:
knot-3.3.9-1.el8.x86_64 knot-libs-3.3.9-1.el8.x86_64 lmdb-libs-0.9.24-2.el8.x86_64 userspace-rcu-0.10.1-4.el8.x86_64
Complete!
[root@auth ~]#
master と slave(いずれも BIND)の設定
BIND のコンフィグ設定
BINDの named.conf について、わかる範囲で解説します。
acl で test.com ドメインの NS に割り当てる IP アドレスに対して別名を定義します。
master はリゾルバからのクエリ要求を受け付けない想定のため、IPv6 アドレスは割り当てません。
test-com_relay_ip4 の IPv4 アドレス(172.18.1.21/32)は、Knot で設定する NS に割り当てる IPv4 アドレスです。ここでは、master および slave の通信相手を指定するために定義しています。
slave の NS は2つ作成し、それぞれに IPv4 アドレスと IPv6 アドレスを割り当てます。
(ホストに割り当てられているアドレスについては ip-a.log をご参照ください。)
acl test-com_master_ip4 { 172.18.1.20/32; };
acl test-com_relay_ip4 { 172.18.1.21/32; };
acl test-com_slave1_ip4 { 172.18.1.22/32; };
acl test-com_slave2_ip4 { 172.18.1.23/32; };
acl test-com_slave1_ip6 { fd00::16/128; };
acl test-com_slave2_ip6 { fd00::17/128; };
1つの BIND で複数のドメインを管理するため、test.com ドメインの view を追加します。また、test.com では master と slave でゾーン転送を行うため、それぞれの NS 用に view を分けます。(master × 1、slave × 2 で計 3 つの view を追加します)
view "TEST.COM-MASTER" {
…
};
view "TEST.COM-SLAVE1" {
…
};
view "TEST.COM-SLAVE2" {
…
};
以下、view 内のステートメントについての説明です。
- view TEST.COM-MASTER の説明
match-clients と match-destinations には、それぞれ送信元と送信先のアドレスを指定します。指定されたアドレス以外の通信は許可されません。master は中継の NS(Knot)とのみ通信(ゾーン転送)を行うため、match-clients には中継 NS のアドレスを、match-destinations には master NS のアドレスを指定しています。
match-clients { test-com_relay_ip4; };
match-destinations { test-com_master_ip4; };
test.com 以外のドメインは「権威サーバの DNSSEC 対応」で DNSSEC に対応済みです。
test.com はのちほど DNSSEC に対応する予定ですが、master のゾーンデータは DNSSEC 署名前の原本としての管理を想定しているため、dnssec-enable と dnssec-validation は no としています。
dnssec-enable no;
dnssec-validation no;
zone ではゾーンについての定義を行います。zone 名にはドメイン名(”test.com”)を指定します。
zone "test.com" IN {
type master;
allow-transfer { 172.18.1.21; };
notify explicit;
also-notify { 172.18.1.21; };
notify-source 172.18.1.20;
file "test.com.zone";
};
type への master の指定は、ゾーン転送において、このゾーンが master として管理されることを示しています。つまりゾーン転送時の送信側となります。
allow-transfer はゾーン転送の許可設定です。ここに指定された宛先(本設定では中継(Knot))に対してのみゾーン転送を許可します。
ゾーン転送の送信側は、ゾーンデータが変更されたことを通知するために、ゾーンの変更通知(Notify)を送信します。ゾーン転送の受信側は、この通知を受け、送信側にゾーン転送を要求します。
Notify の送信先は notify の指定により制限されます。yes を指定した場合、also-notify に指定された宛先、およびゾーンファイルに登録されている NS に対して Notify が送信されます。explicit を指定した場合、also-notify に指定された宛先に対してのみ、Notify が送信されます。
本設定では、master は中継の NS(Knot)(*1) に対してのみ、Notify を送信するため、notify には explicit を、also-notify には 172.18.1.21(中継 NS(Knot)のアドレス)を指定しています。
*1 master 同様、中継の NS(Knot)はリゾルバからのクエリ要求に応答するためのサーバではないため、test.com のゾーンファイルには登録されていません。
notify-source ではゾーンの変更通知(Notify)が master のアドレス(172.18.1.20)経由で送信されることを宣言しています。本サーバは複数のアドレスを持つため、Notify の送信元アドレスが master 以外のアドレスになる可能性があります。これを防ぐため、notify-source に master のアドレスを指定します。
file にはゾーン情報(リソースレコード等)が登録されたファイルのパスを指定します。指定が絶対パスではない場合、directory ステートメント(default:/var/named)からの相対パスとなります。test.com のゾーンファイルについては test.com.zone をご参照ください。
- view TEST.COM-SLAVE1 の説明
match-clients と match-destinations には、それぞれ送信元と送信先のアドレスを指定します。指定されたアドレス以外の通信は許可されません。slave はクエリ要求やゾーン転送を受信するため、match-clients には any を、match-destinations には slave NS のアドレスを指定しています。
match-clients { any; };
match-destinations { test-com_slave1_ip4; test-com_slave1_ip6; };
test.com はのちほど DNSSEC に対応する予定です。それまでは dnssec-enable と dnssec-validation を no としています。
dnssec-enable no;
dnssec-validation no;
zone ではゾーンについての定義を行います。zone 名にはドメイン名(”test.com”)を指定します。
zone "test.com" IN {
type slave;
masters { 172.18.1.21; };
allow-notify { 172.18.1.21; };
transfer-source 172.18.1.22;
masterfile-format text;
file "slaves/test.com.zone1";
};
type への slave の指定は、ゾーン転送において、このゾーンが slave として管理されることを示しています。つまりゾーン転送時の受信側となります。
masters にはゾーン転送の送信元のアドレスを指定します。
allow-notify には、ゾーン更新の通知(Notify)の送信元を指定します。
ここで設定する slave は中継の NS(Knot)からゾーン転送を受けるため、masters と allow-notify には、中継 NS(Knot)のアドレス(172.18.1.21)を指定します。
transfer-source ではゾーン転送を slave のアドレス(172.18.1.22)経由で受信することを宣言しています。
本サーバは複数のアドレスを持つため、slave がゾーン転送を要求する際に、ゾーン転送の受信アドレスが slave 以外のアドレスになる可能性があります。これを防ぐため、transfer-source に slave のアドレスを指定します。
ゾーン転送で受け取るゾーンファイルは、デフォルトでは raw形式(バイナリ)です。
masterfile-format に text を指定すると text形式で受信します。(text形式のほうがパフォーマンスが落ちるようです)本設定では、ゾーン転送後の確認のため、masterfile-format に text を指定します。
file にはゾーンファイルのパスを指定します。指定が絶対パスではない場合、directory ステートメント(default:/var/named)からの相対パスとなります。ゾーン転送が完了するまではファイルは存在しません。
※ view TEST.COM-SLAVE2 の設定は、TEST.COM-SLAVE1 の設定と同様ですので割愛させていただきます。
中継(Knot)の設定
Knot のコンフィグ設定
Knot の knot.conf について、わかる範囲で解説します。
listen: で listen するアドレスとポートを指定します。
server:
…
listen: 172.18.1.21@53
remote: には通信相手を指定します。
本環境では、Knot の通信相手は、ゾーン転送の相手である master(BIND)と slave(BIND)のみとなります。
via: の指定ですが、master(172.18.1.20)と slave(172.18.1.22, 172.18.1.23)との通信を 172.18.1.21(Knot に割り当てたアドレス)経由で行うことを宣言しています。本サーバは複数のアドレスを持つため、Knot の通信が 172.18.1.21 で行われることを明確に示す必要があります。
remote:
- id: master
address: 172.18.1.20@53
via: 172.18.1.21
- id: slave1
address: 172.18.1.22
via: 172.18.1.21
- id: slave2
address: 172.18.1.23
via: 172.18.1.21
参考:remote: 設定の障害?について
slave は最初以下のように設定し、構文エラー等もありませんでした。しかし、ゾーン更新の通知(Notify)は 172.18.1.22 にしか送信されず、その結果、172.18.1.23 へのゾーン転送は行われませんでした。slave1 と slave2 に分けて定義したところ問題が解消しました。
- id: slave
address: [ 172.18.1.22, 172.18.1.23 ]
via: 172.18.1.21
acl: で各種アクセス条件を定義します。
notify_from_master では、master(172.18.1.20)からのゾーンの更新通知(Notify)受信を許可することを定義しています。
xfr_to_slave では、slave(172.18.1.22, 172.18.1.23)へのゾーン転送(transfer)を許可することを定義しています。
acl:
- id: notify_from_master
address: 172.18.1.20
action: notify
- id: xfr_to_slave
address: [ 172.18.1.22, 172.18.1.23 ]
action: transfer
template: で各種通信条件をまとめるためのテンプレートを定義します。
テンプレートは管理するゾーン(zone: で定義)に適用します。id: default はデフォルトで適用されるテンプレートです。
master, slave1, slave2 は前述の remote: で定義された通信相手です。
notify_from_master, xfr_to_slave は前述の acl: で定義されたアクセス条件です。
template:
- id: default
master: master
notify: [ slave1, slave2 ]
acl: [ notify_from_master, xfr_to_slave ]
zone: で管理するゾーンを定義します。
前述のとおりですが、id: default のテンプレートがデフォルトで適用されます。
zone:
- domain: test.com
コンフィグの構文をチェックします。
[root@auth ~]# knotc conf-check
Configuration is valid
動作確認
設定が正しければ、named と Knot のサービス再起動直後に、master ⇒ 中継(Knot) ⇒ slave のゾーン転送が行われますが、順を追って個別に動作を確認します。
named サービスを再起動します。
[root@auth ~]# systemctl restart named
[root@auth ~]#
Knot サービスを再起動します。
[root@auth ~]# systemctl restart knot
[root@auth ~]#
172.18.1.21(中継(Knot))から 172.18.1.20(master)への疎通を確認します。
[root@auth ~]# dig @172.18.1.20 test.com axfr -b 172.18.1.21
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @172.18.1.20 test.com axfr -b 172.18.1.21
; (1 server found)
;; global options: +cmd
test.com. 604800 IN SOA ns1.test.com. root.test.com. 3 86400 3600 604800 2000000
test.com. 604800 IN NS ns1.test.com.
test.com. 604800 IN NS ns2.test.com.
ns1.test.com. 604800 IN A 172.18.1.22
ns2.test.com. 604800 IN A 172.18.1.23
www.test.com. 604800 IN A 3.4.5.6
test.com. 604800 IN SOA ns1.test.com. root.test.com. 3 86400 3600 604800 2000000
;; Query time: 0 msec
;; SERVER: 172.18.1.20#53(172.18.1.20)
;; WHEN: Fri Oct 04 17:57:48 JST 2024
;; XFR size: 7 records (messages 1, bytes 230)
172.18.1.22(slave1)から 172.18.1.21(中継(Knot))への疎通を確認します。
[root@auth ~]# dig @172.18.1.21 test.com axfr -b 172.18.1.22
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @172.18.1.21 test.com axfr -b 172.18.1.22
; (1 server found)
;; global options: +cmd
test.com. 604800 IN SOA ns1.test.com. root.test.com. 3 86400 3600 604800 2000000
test.com. 604800 IN NS ns1.test.com.
test.com. 604800 IN NS ns2.test.com.
ns1.test.com. 604800 IN A 172.18.1.22
ns2.test.com. 604800 IN A 172.18.1.23
www.test.com. 604800 IN A 3.4.5.6
test.com. 604800 IN SOA ns1.test.com. root.test.com. 3 86400 3600 604800 2000000
;; Query time: 0 msec
;; SERVER: 172.18.1.21#53(172.18.1.21)
;; WHEN: Fri Oct 04 17:58:02 JST 2024
;; XFR size: 7 records (messages 1, bytes 223)
172.18.1.23(slave2)から 172.18.1.21(中継(Knot))への疎通を確認します。
[root@auth ~]# dig @172.18.1.21 test.com axfr -b 172.18.1.23
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @172.18.1.21 test.com axfr -b 172.18.1.23
; (1 server found)
;; global options: +cmd
test.com. 604800 IN SOA ns1.test.com. root.test.com. 3 86400 3600 604800 2000000
test.com. 604800 IN NS ns1.test.com.
test.com. 604800 IN NS ns2.test.com.
ns1.test.com. 604800 IN A 172.18.1.22
ns2.test.com. 604800 IN A 172.18.1.23
www.test.com. 604800 IN A 3.4.5.6
test.com. 604800 IN SOA ns1.test.com. root.test.com. 3 86400 3600 604800 2000000
;; Query time: 0 msec
;; SERVER: 172.18.1.21#53(172.18.1.21)
;; WHEN: Fri Oct 04 17:58:04 JST 2024
;; XFR size: 7 records (messages 1, bytes 223)
master のゾーンデータを変更し、ゾーン転送が行われることを確認します。
ゾーンデータを変更する前にシリアル番号を確認します。
; master
[root@auth ~]# grep serial /var/named/test.com.zone
0000000003 ; serial
; Knot
[root@auth ~]# grep SOA /var/lib/knot/test.com.zone
test.com. 604800 SOA ns1.test.com. root.test.com. 3 86400 3600 604800 2000000
; slave
[root@auth ~]# grep serial /var/named/slaves/test.com.zone1
3 ; serial
[root@auth ~]# grep serial /var/named/slaves/test.com.zone2
3 ; serial
master のゾーンデータを変更(master ゾーンの serial は 3 から 4 へ 1up)し、ゾーンデータをリロードします。
[root@auth ~]# vi /var/named/test.com.zone
[root@auth ~]# grep serial /var/named/test.com.zone
0000000004 ; serial
[root@auth ~]# rndc reload
server reload successful
ゾーン転送先のシリアル番号が更新されていることを確認します。
; Knot
[root@auth ~]# grep SOA /var/lib/knot/test.com.zone
test.com. 604800 SOA ns1.test.com. root.test.com. 4 86400 3600 604800 2000000
; slave
[root@auth ~]# grep serial /var/named/slaves/test.com.zone1
4 ; serial
[root@auth ~]# grep serial /var/named/slaves/test.com.zone2
4 ; serial
ゾーンファイルは以下のとおりです。master 以外はゾーン転送で受信したゾーンファイルです。
機能 | パス |
---|---|
master | /var/named/test.com.zone |
中継(Knot) | /var/lib/knot/test.com.zone |
slave1 | /var/named/slaves/test.com.zone1 |
slave2 | /var/named/slaves/test.com.zone2 |