BIND9でNOTIFYを使用して更新を通知する





BIND9でNOTIFYを使用して
プライマリのゾーンファイル情報の更新を
スレーブに通知する方法は次の通り。

プライマリがNOTIFYを送出するには、
次の設定のペアが必要。

named.confにて、
notify yes;
also-notify { 通知したいスレーブのIPアドレス; };

設定はoptions{ };の中か、
あるいは、各々のzone{ };の中に記述する。

options{ };の中に記述したものより
zone{ };の中に記述した方が優先される。

具体的には以下の通り、
options {
	   directory "/var/named";
	   notify yes;
	   also-notify { 1.1.1.200; 1.1.1.201; };
};

あるいは、

zone "test.example.com" {
	   type master;
	   file "db.test.example.com";
	   notify yes;
	   also-notify { 1.1.1.200; 1.1.1.201; };
};

また、

options{ };の中に、
notify yes;

zone{ };の中に、
also-notify { 1.1.1.200; 1.1.1.201; };

というようにバラして記述してもOK。

この設定をした後、任意のゾーンファイルのシリアル番号をアップして、
namedをリロードすると、notifyがプライマリから送出され、
それを受け取ったスレーブ側で直ちにゾーン転送が開始される。

その時のスレーブ側の/var/log/messagesには、
次のような出力が見られる。
May 16 13:42:24 test named[17974]: received notify for zone 'test.example.com'

ちなみに、プライマリ側でnamedをリロードした場合、
更新されたゾーン関するnotifyだけが送出され、
namedを再起動した場合は、
すべてのゾーンに対してnotifyが送出される。

参考までに、以下は、tcpdumpでnotifyをキャプチャしたもの

15:33:14.234762 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 17, length: 129) 1.1.1.100.32795 > 1.1.1.200.domain: 21367 notify [b2&3=0x2400] [1a] SOA? test.example.com. test.example.com. (101)

15:33:14.235342 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 17, length: 78) 1.1.1.200.domain > 1.1.1.100.32795: [udp sum ok] 21367 notify* q: SOA? test.example.com. 0/0/0 (50)

15:33:14.235350 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 17, length: 78) 1.1.1.200.32811 > 1.1.1.100.domain: [udp sum ok] 38517 SOA? test.example.com. (50)

15:33:14.240301 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 17, length: 159) 1.1.1.100.domain > 1.1.1.200.32811: 38517* q: SOA? test.example.com. 1/1/1 test.example.com.[|domain]

15:33:14.240761 IP (tos 0x0, ttl 64, id 41471, offset 0, flags [DF], proto 6, length: 60) 1.1.1.200.33069 > 1.1.1.100.domain: S [tcp sum ok] 2772453016:2772453016(0) win 5840 <mss 1460,sackOK,timestamp 177399655 0,nop,wscale 2>

15:33:14.240761 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 6, length: 60) 1.1.1.100.domain > 1.1.1.200.33069: S [tcp sum ok] 3256559490:3256559490(0) ack 2772453017 win 5792 <mss 1460,sackOK,timestamp 180244534 177399655,nop,wscale 2>

プライマリ(1.1.1.100)からスレーブ(1.1.1.200)に対して、
notifyを送信していることが確認できる。

その後、スレーブがプライマリに対してゾーン転送を
要求していることも確認できる。

また、スレーブは、
zone毎のmasters { };で指定しているネームサーバからの
NOTIFYしか信用しないので、
プライマリからNOTIFYを送出してスレーブとやり取りしているのに
ゾーン転送が始まらない場合など、
NOTIFYによる動作がうまくいかない場合は、
スレーブのmasters { };を確認してみると良い。

ちなみに、also-notify { }; はスレーブにも定義できるため、
notify を使ってスレーブのスレーブにも更新を通知することができる。