dnsperf で DDNS を実施してみた

balaeniceps-rex DNS

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
#
タイトルとURLをコピーしました