dnsperf を使用し、BIND のゾーンファイルにリソースレコード(RR)の登録と削除をやってみました。
※ nsupdate を使用した、DDNS(Dynamic DNS)については「nsupdate で DDNS を実施してみた」を参照してください。
※ dnsperf で負荷試験を実施してみました。手順については「dnsperf を使ってみた」を参照してください。
※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。
検証環境は以下のとおり。
# cat /etc/redhat-release
Rocky Linux release 8.10 (Green Obsidian)
# uname -a
Linux r8bind 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 14:48:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
# named -v
BIND 9.11.36-RedHat-9.11.36-16.el8_10.2 (Extended Support Version) <id:68dbd5b>
# rpm -qf `which dnsperf`
dnsperf-2.12.0-1.el8.x86_64
# dnsperf -h
DNS Performance Testing Tool
Version 2.12.0
...
手順概要
今回、BIND で管理する foo.com ゾーンの RR を DynamicDNS の対象とする。
まず BIND で DynamicDNS の許可設定を行い、次に RR を追加/削除するための定義ファイルを作成し、作成した定義ファイルを dnsperf に読み込ませることで DynamicDNS を実行する。
手順詳細
手順は以下のとおり。
BIND への DynamicDNS でのアクセスを許可
1. DynamicDNS を許可するため named.conf に allow-update を追加する。
本検証では、allow-update の指定は options(全体)ではなく、foo.com ゾーンの view に対してのみ行う。
(本検証の BIND(named.conf)ではゾーンを view で分けて管理している。)
# grep FOO.COM /etc/named.conf -A12
view "FOO.COM" {
match-clients { any; };
match-destinations { FooComZoneIPv4; FooComZoneIPv6; };
allow-update { any; }; <<ココ
zone "foo.com" IN {
type master;
file "foo.com.zone";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
};
2. name.conf の構文をチェック(何も出力されなければ問題なし)
# named-checkconf
#
3. BIND 再起動
# systemctl restart named
#
RR を DynamicDNS で追加
1. RR を追加するための定義ファイルを作成
# vi dnsperf_rr_add.txt
# cat dnsperf_rr_add.txt
foo.com
add www1 3600 A 1.2.3.4
send
foo.com
add www2 3600 A 2.3.4.5
send
2. dnsperf で RR を追加
# dnsperf -d ./dnsperf_rr_add.txt -u -s 172.18.1.28 -e -t 1
DNS Performance Testing Tool
Version 2.12.0
[Status] Command line: dnsperf -d ./dnsperf_rr_add.txt -u -s 172.18.1.28 -e -t 1
[Status] Sending updates (to 172.18.1.28:53)
[Status] Started at: Thu Mar 6 11:56:52 2025
[Status] Stopping after 1 run through file
[Status] Testing complete (end of file)
Statistics:
Updates sent: 2
Updates completed: 2 (100.00%)
Updates lost: 0 (0.00%)
Response codes: NOERROR 2 (100.00%)
Average packet size: request 57, response 36
Run time (s): 0.005548
Updates per second: 360.490267
Average Latency (s): 0.003587 (min 0.003462, max 0.003712)
Latency StdDev (s): 0.000177
#
dnsperf オプション補足
-d : input data file
-u : DDNSオペレーションであることの指定
-s : DNSサーバ指定
-e : EDNS0有効
-t : timeout
3. キャッシュをダンプファイルに保存し、追加した RR が存在することを確認
# rndc dumpdb -zones
# cat /var/named/data/cache_dump.db | grep www..foo.com
www1.foo.com. 3600 IN A 1.2.3.4
www2.foo.com. 3600 IN A 2.3.4.5
ちなみに、追加した RR はゾーンファイルではなくジャーナルファイルに登録される。
# ls -l /var/named/foo.com.zone*
-rw-r-----. 1 root named 491 Mar 6 11:20 /var/named/foo.com.zone
-rw-r--r--. 1 named named 880 Mar 6 11:56 /var/named/foo.com.zone.jnl
# grep www /var/named/foo.com.zone
#
# file /var/named/foo.com.zone.jnl
/var/named/foo.com.zone.jnl: data
# strings /var/named/foo.com.zone.jnl | grep www
www1
www2
4. 追加した RR をクエリできることを確認
# dig @172.18.1.28 www1.foo.com a +norec +short
1.2.3.4
# dig @172.18.1.28 www2.foo.com a +norec +short
2.3.4.5
5. ジャーナルをゾーンファイルにマージ
# rndc sync -clean foo.com.
#
以下は、マージの際の syslog
# tail -f /var/llog/messages
Mar 6 13:48:24 r8bind named[5268]: received control channel command 'sync -clean foo.com.'
Mar 6 13:48:24 r8bind named[5268]: sync: dumping zone 'foo.com/IN' FOO.COM, removing journal file: success
ジャーナルファイルが消えて、ゾーンファイルにマージされた
# ls -l /var/named/foo.com.zone*
-rw-r--r--. 1 named named 776 Mar 6 13:48 /var/named/foo.com.zone
# grep www /var/named/foo.com.zone
www1 A 1.2.3.4
www2 A 2.3.4.5
1回目のマージで失敗したときのログ
# rndc sync -clean foo.com.
rndc: 'sync' failed: permission denied
# tail -f /var/llog/messages
Mar 6 13:44:07 r8bind named[5268]: received control channel command 'sync -clean foo.com.'
Mar 6 13:44:07 r8bind named[5268]: dumping master file: rename: foo.com.zone: permission denied
Mar 6 13:44:07 r8bind named[5268]: sync: dumping zone 'foo.com/IN' FOO.COM, removing journal file: permission denied
ゾーンファイルの rename に失敗しているらしいので、foo.com.zone の所有者を root から named に変更し、再度マージしたら成功した。
# chown named.named foo.com.zone
RR を DynamicDNS で 削除
1. RR を削除するための定義ファイルを作成
# vi dnsperf_rr_del.txt
# cat dnsperf_rr_del.txt
foo.com
delete www1 A
send
foo.com
delete www2 A
send
2. dnsperf で RR を削除
# dnsperf -d ./dnsperf_rr_del.txt -u -s 172.18.1.28 -e -t 1
DNS Performance Testing Tool
Version 2.12.0
[Status] Command line: dnsperf -d ./dnsperf_rr_del.txt -u -s 172.18.1.28 -e -t 1
[Status] Sending updates (to 172.18.1.28:53)
[Status] Started at: Thu Mar 6 14:11:04 2025
[Status] Stopping after 1 run through file
[Status] Testing complete (end of file)
Statistics:
Updates sent: 2
Updates completed: 2 (100.00%)
Updates lost: 0 (0.00%)
Response codes: NOERROR 2 (100.00%)
Average packet size: request 53, response 36
Run time (s): 0.005559
Updates per second: 359.776938
Average Latency (s): 0.003774 (min 0.003731, max 0.003817)
Latency StdDev (s): 0.000061
3. キャッシュをダンプファイルに保存し、削除した RR が存在しないことを確認
# rndc dumpdb -zones
# cat /var/named/data/cache_dump.db | grep foo.com
foo.com. 3600 IN NS ns1.foo.com.
foo.com. 3600 IN NS ns2.foo.com.
ns1.foo.com. 3600 IN A 172.18.1.28
ns1.foo.com. 3600 IN AAAA fd00::1c
ns2.foo.com. 3600 IN A 172.18.1.28
ns2.foo.com. 3600 IN AAAA fd00::1c
; Zone dump of 'foo.com/IN/FOO.COM'
foo.com. 2000000 IN SOA ns1.foo.com. root.foo.com. 2022070407 2500 900 3000 2000000
foo.com. 86400 IN NS ns1.foo.com.
foo.com. 86400 IN NS ns2.foo.com.
foo.com. 2000000 IN A 172.18.1.28
ns1.foo.com. 86400 IN A 172.18.1.28
ns1.foo.com. 2000000 IN AAAA fd00::1c
ns2.foo.com. 86400 IN A 172.18.1.28
ns2.foo.com. 2000000 IN AAAA fd00::1c
ちなみに、削除処理でもジャーナルが作成され、ゾーンファイルの RR は残ったままとなる。
# ls -l /var/named/foo.com.zone*
-rw-r--r--. 1 named named 776 Mar 6 13:48 /var/named/foo.com.zone
-rw-r--r--. 1 named named 880 Mar 6 14:11 /var/named/foo.com.zone.jnl
# grep www /var/named/foo.com.zone
www1 A 1.2.3.4
www2 A 2.3.4.5
4. 削除した RR をクエリできないことを確認(→NXDOMAIN)
# dig @172.18.1.28 www1.foo.com a +norec +noall +comments
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 20772
;; flags: qr aa ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 0c67a7a9a6574e247ccef88967c92f217ea951fb750b5a9e (good)
5. ジャーナルをゾーンファイルにマージし、ゾーンファイルから RR が削除されたことを確認する。
# rndc sync -clean foo.com
#
# ls -l /var/named/foo.com.zone*
-rw-r--r--. 1 named named 723 Mar 6 14:18 /var/named/foo.com.zone
#
# grep www /var/named/foo.com.zone
#