test.com のゾーン転送で TSIG (*1) を利用するように設定します。
*1 TSIG は、DNS メッセージの署名や送受信者を認証するための技術です。メッセージが改竄されていないことの確認や送受信者がなりすましていないことの確認はできますが、送受信メッセージが暗号化されているわけではないので傍受を防ぐというものではありません。
※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。
構築する環境の要件等については「ローカル環境にDNS問い合わせの仕組みを構築」をご参照ください。
全体の構築作業は以下のとおりですが、今回は「④ test.com ゾーン転送の TSIG 対応」を実施します。
① 権威サーバとキャッシュサーバの構築
② 権威サーバの DNSSEC 対応
③ test.com ゾーンの追加とゾーン転送の設定
④ test.com ゾーン転送の TSIG 対応
⑤ test.com ゾーン転送の DNSSEC 対応
今回の構築範囲は下図のとおりです。

以下のようなゾーン転送を行う DNS サーバが構成済みの想定です。
master(BIND) ⇒ 中継(Knot) ⇒ slave(BIND)
今回、ゾーン転送を TSIG で署名、認証する設定を追加します。
TSIG 用のキーの作成
TSIGの設定で使用するキー(共通鍵)を以下のコマンドで作成します。ここで作成したキーは、ゾーン転送の送信側、受信側の両方に登録します。(余談ですがインターネット上では tsig-keygen よりも dnssec-keygen コマンドの使用例が多いようです)
[root@auth ~]# tsig-keygen tsig-key
key "tsig-key" {
        algorithm hmac-sha256;
        secret "gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=";
};
master と slave(いずれも BIND)の設定
BIND のコンフィグ設定
BIND の named.conf について、わかる範囲で解説します。
前述の「TSIG 用のキーの作成」で作成した キーを named.conf に登録します。(のちほど、通信相手である Knot のコンフィグにも同じキーを登録します)
key "tsig-key" {
  algorithm hmac-sha256;
  secret "gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=";
};
masters 句はゾーン変更通知(Notify)およびゾーン転送の通信相手のリストを定義します。zone 内の also-notify ステートメントと masters ステートメント (*1) から参照されます。ここでは、ゾーン転送の相手(中継(Knot))の IP アドレス(172.18.1.21)と、TSIG の認証に使用するキー(tsig-key)を指定しています。
*1 ここで定義する masters 句 は zone 内の masters ステートメントとは別です。
masters relay-with-key { 172.18.1.21 key tsig-key; };
以下、test.com ドメインの master view の設定です。
allow-transfer ではゾーン転送を許可する相手を指定します。今回の設定で IP アドレス(中継(Knot))から TSIG のキー(tsig-key)に変更しています。これにより同じ TSIG キーを持つ相手に対してのみゾーン転送を許可します。(中継(Knot)の TSIG 設定はのちほど行います)
also-notify ではゾーン変更通知(Notify)の通知先を指定します。IP アドレス(中継(Knot))から TSIG のキー(tsig-key)付きの IP アドレス(relay-with-key)に変更し、中継(Knot)に対してのみ通知するようにします。
view "TEST.COM-MASTER" {
  match-clients { test-com_relay_ip4; };
  match-destinations { test-com_master_ip4; };
  dnssec-enable     no;
  dnssec-validation no;
  zone "test.com" IN {
    type master;
//    allow-transfer { 172.18.1.21; };
    allow-transfer { key tsig-key; };
    notify explicit;
//    also-notify { 172.18.1.21; };
    also-notify { relay-with-key; };
    notify-source 172.18.1.20;
    file "test.com.zone";
  };
  include "/etc/named.rfc1912.zones";
//  include "/etc/named.root.key";
};
以下、test.com ドメインの slave view の設定です。
masters ではゾーン転送の送信元を指定します。今回の設定では IP アドレス(中継(Knot))から TSIG のキー(tsig-key)付きの IP アドレス(relay-with-key)に変更しています。これにより中継(Knot)からのみゾーン転送を受信するようにします。
allow-notify ではゾーン変更通知(Notify)の送信元を指定します。IP アドレス(中継(Knot))から TSIG のキー(tsig-key)に変更し、同じ TSIG キーを持つ相手からのみ通知を受信します。
view "TEST.COM-SLAVE1" {
  match-clients { any; };
  match-destinations { test-com_slave1_ip4; test-com_slave1_ip6; };
  dnssec-enable     no;
  dnssec-validation no;
  zone "test.com" IN {
    type slave;
//    masters { 172.18.1.21; };
    masters { relay-with-key; };
//    allow-notify { 172.18.1.21; };
    allow-notify { key tsig-key; };
    transfer-source 172.18.1.22;
    masterfile-format text;
    file "slaves/test.com.zone1";
  };
  include "/etc/named.rfc1912.zones";
//  include "/etc/named.root.key";
};
編集後、コンフィグをチェックします。(→ 何も出力されなければ問題なし。)
[root@auth ~]# named-checkconf
[root@auth ~]#
中継(Knot)の設定
Knot のコンフィグ設定
Knot の knot.conf について、わかる範囲で解説します。
前述の「TSIG 用のキーの作成」で作成した キーを knot.conf に登録します。キー名(id:)、algorithm:、secret: に BIND の named.conf に設定したものと同じ値を指定する必要があります。
key:
  - id: tsig-key
    algorithm: hmac-sha256
    secret: gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=
remote: では通信相手を定義しています。
TSIG に対応するため、のちほど説明する acl: でキーを追加していますが、master(BIND)から中継(Knot)へのゾーン転送に関しては、ここ(id: master)でのキー(tsig-key)追加が必要なようです。ここでのキー指定が無い場合、master(BIND)からのゾーン転送が開始されませんでした。(※ゾーン変更通知(Notify)は届いていました)
remote:
  - id: master
    address: 172.18.1.20@53
    key: tsig-key
    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
acl: では各種アクセス条件を定義しています。
今回の設定で、id: notify_from_master (*1) と id: xfr_to_slave (*2) のアクセス条件に TSIG に対応させるためキー(tsig-key)を追加しています。
*1 master(BIND)から中継(Knot)へのゾーン変更通知(Notify)
*2 中継(Knot)から slave(BIND)へのゾーン転送
acl:
  - id: notify_from_master
    address: 172.18.1.20
    key: tsig-key
    action: notify
  - id: xfr_to_slave
    address: [ 172.18.1.22, 172.18.1.23 ]
    key: tsig-key
    action: transfer
編集後、コンフィグをチェックします。
[root@auth ~]# knotc conf-check
Configuration is valid
動作確認
named および Knot のコンフィグをリロードします。
[root@auth ~]# rndc reload
server reload successful
[root@auth ~]# knotc reload
Reloaded
中継(Knot)から master(BIND) への疎通を確認します。
[root@auth ~]# dig @172.18.1.20 test.com axfr -b 172.18.1.21 -y hmac-sha256:tsig-key:gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @172.18.1.20 test.com axfr -b 172.18.1.21 -y hmac-sha256:tsig-key:gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=
; (1 server found)
;; global options: +cmd
test.com.               604800  IN      SOA     ns1.test.com. root.test.com. 4 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. 4 86400 3600 604800 2000000
tsig-key.               0       ANY     TSIG    hmac-sha256. 1728370616 300 32 zRtywfN7ihzRD/UIigqpy33Wgb9IXb2w5SBoGNE8Gb0= 47235 NOERROR 0
;; Query time: 0 msec
;; SERVER: 172.18.1.20#53(172.18.1.20)
;; WHEN: Tue Oct 08 15:56:56 JST 2024
;; XFR size: 7 records (messages 1, bytes 311)
slave1(BIND) から中継(Knot)への疎通を確認します。
[root@auth ~]# dig @172.18.1.21 test.com axfr -b 172.18.1.22 -y hmac-sha256:tsig-key:gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @172.18.1.21 test.com axfr -b 172.18.1.22 -y hmac-sha256:tsig-key:gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=
; (1 server found)
;; global options: +cmd
test.com.               604800  IN      SOA     ns1.test.com. root.test.com. 4 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. 4 86400 3600 604800 2000000
tsig-key.               0       ANY     TSIG    hmac-sha256. 1728370672 300 32 vBXiGZR98OOM3z/s1fDN5/fjHFty/rd++xC0tIiBbGM= 17782 NOERROR 0
;; Query time: 0 msec
;; SERVER: 172.18.1.21#53(172.18.1.21)
;; WHEN: Tue Oct 08 15:57:52 JST 2024
;; XFR size: 7 records (messages 1, bytes 304)
slave2(BIND) から中継(Knot)への疎通を確認します。
[root@auth ~]# dig @172.18.1.21 test.com axfr -b 172.18.1.23 -y hmac-sha256:tsig-key:gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @172.18.1.21 test.com axfr -b 172.18.1.23 -y hmac-sha256:tsig-key:gWQl0C01ZKgNQLafAhUvWBb7B+8BBfEDc7XxdTzDwqc=
; (1 server found)
;; global options: +cmd
test.com.               604800  IN      SOA     ns1.test.com. root.test.com. 4 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. 4 86400 3600 604800 2000000
tsig-key.               0       ANY     TSIG    hmac-sha256. 1728370681 300 32 oYfec1MAXpFk3HHpT9Jx+H8ydj3xNroPlQe61DmPQGA= 15658 NOERROR 0
;; Query time: 0 msec
;; SERVER: 172.18.1.21#53(172.18.1.21)
;; WHEN: Tue Oct 08 15:58:01 JST 2024
;; XFR size: 7 records (messages 1, bytes 304)
ゾーンデータを変更し、ゾーン転送が正常に行われることを確認します。
事前にシリアル番号を確認します。
; master
[root@auth ~]# grep serial /var/named/test.com.zone
  0000000004    ; serial
; 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 のゾーンデータを変更(serial:4 → 5)し、データをリロードします。
[root@auth ~]# vi /var/named/test.com.zone
[root@auth ~]# grep serial /var/named/test.com.zone
  0000000005    ; serial
[root@auth ~]# rndc reload
server reload successful
ゾーン転送先(中継(Knot)、slave(BIND))のシリアル番号が更新(→ 5)されていることを確認します。
; Knot
[root@auth ~]# grep SOA /var/lib/knot/test.com.zone
test.com.               604800  SOA     ns1.test.com. root.test.com. 5 86400 3600 604800 2000000
; slave
[root@auth ~]# grep serial /var/named/slaves/test.com.zone1
                                5          ; serial
[root@auth ~]# grep serial /var/named/slaves/test.com.zone2
                                5          ; serial