nsupdate で DynamicDNS

balaeniceps-rex DNS

nsupdate を使用し、BIND のゾーンファイルにリソースレコード(RR)の登録と削除をやってみました。
※ dnsperf を使用した、DynamicDNS については dnsperf で Dynamicdns を参照してください。

※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。

検証環境は以下のとおり。

# 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 nsupdate`
bind-utils-9.11.36-16.el8_10.2.x86_64

# nsupdate -V
nsupdate 9.11.36-RedHat-9.11.36-16.el8_10.2

手順概要

今回、BIND で管理する foo.com ゾーンの RR を DynamicDNS の対象とする。
まず BIND で DynamicDNS の許可設定を行い、次に RR を追加/削除するための定義ファイルを作成し、作成した定義ファイルを nsupdate に読み込ませることで DynamicDNS を実行する。
後半では、nsupdate の対話モードでの追加/削除を実行する。

手順詳細

手順は以下のとおり。

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 nsupdate_rr_add.txt
# cat nsupdate_rr_add.txt
server 172.18.1.28
zone foo.com
update add www1.foo.com. 3600 IN A 1.2.3.4
update add www2.foo.com. 3600 IN A 2.3.4.5
send

2. nsupdate で RR を追加

# nsupdate nsupdate_rr_add.txt
#

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--r--. 1 named named 429 Mar  6 14:50 /var/named/foo.com.zone
-rw-r--r--. 1 named named 728 Mar  6 14:56 /var/named/foo.com.zone.jnl

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

RR を DynamicDNS で 削除

1. RR を削除するための定義ファイルを作成

# vi nsupdate_rr_del.txt
# cat nsupdate_rr_del.txt
server 172.18.1.28
zone foo.com
update delete www1.foo.com. IN A 1.2.3.4
update delete www2.foo.com. IN A 2.3.4.5
send

2. dnsperf で RR を削除

# nsupdate nsupdate_rr_del.txt
#

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.                                      86400 IN SOA      ns1.foo.com. root.foo.com. 2022070411 2500 900 3000 2000000
foo.com.                                      86400 IN NS       ns1.foo.com.
foo.com.                                      86400 IN NS       ns2.foo.com.
foo.com.                                      86400 IN A        172.18.1.28
ns1.foo.com.                                  86400 IN A        172.18.1.28
ns1.foo.com.                                  86400 IN AAAA     fd00::1c
ns2.foo.com.                                  86400 IN A        172.18.1.28
ns2.foo.com.                                  86400 IN AAAA     fd00::1c

ちなみに、削除処理でもジャーナルが作成され、ゾーンファイルの RR は残ったままとなる。

# ls -l /var/named/foo.com.zone*
-rw-r--r--. 1 named named 429 Mar  6 14:50 /var/named/foo.com.zone
-rw-r--r--. 1 named named 944 Mar  6 15:03 /var/named/foo.com.zone.jnl

4. 削除した RR をクエリできないことを確認(→NXDOMAIN)

# dig @172.18.1.28 www2.foo.com a +norec +noall +comments
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 51587
;; flags: qr aa ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 7266752e0699573ea5bb8efb67c93b6b5546791d64e551c0 (good)

5. ジャーナルをゾーンファイルにマージ

# rndc sync -clean foo.com

# ls -l /var/named/foo.com.zone*
-rw-r--r--. 1 named named 445 Mar  6 15:05 /var/named/foo.com.zone
#

対話モードで RR を追加

1. 追加

```
# nsupdate -d                                               << -d : デバッグモード
> server 172.18.1.28
> update add www1.foo.com. 3600 IN A 1.2.3.4
> update add www2.foo.com. 3600 IN A 2.3.4.5
> show                                                      << 実行前の確認
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; UPDATE SECTION:
www1.foo.com.           3600    IN      A       1.2.3.4
www2.foo.com.           3600    IN      A       2.3.4.5

> send                                                      << 追加の実行(改行だけでもOKらしい)
Reply from SOA query:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id:  14243
;; flags: qr aa ra; QUESTION: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;www1.foo.com.                  IN      SOA

;; AUTHORITY SECTION:
foo.com.                0       IN      SOA     ns1.foo.com. root.foo.com. 2022070411 2500 900 3000 2000000

Found zone name: foo.com
The master is: ns1.foo.com
Sending update to 172.18.1.28#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  52705
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 2, ADDITIONAL: 0
;; UPDATE SECTION:
www1.foo.com.           3600    IN      A       1.2.3.4
www2.foo.com.           3600    IN      A       2.3.4.5


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  52705
;; flags: qr; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;foo.com.                       IN      SOA

> quit                                                      << 対話モード終了(Ctrl+D でもOKらしい)
#
```

2. キャッシュをダンプファイルに保存し、追加した 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

3. 追加した 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

対話モードで RR を削除

1. 削除

# nsupdate -d                                               << -d : デバッグモード
> server 172.18.1.28
> update delete www1.foo.com. IN A 1.2.3.4
> update delete www2.foo.com. IN A 2.3.4.5
> show                                                      << 実行前の確認
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; UPDATE SECTION:
www1.foo.com.           0       NONE    A       1.2.3.4
www2.foo.com.           0       NONE    A       2.3.4.5

> send                                                      << 追加の実行(改行だけでもOKらしい)
Reply from SOA query:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id:  15599
;; flags: qr aa ra; QUESTION: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;www1.foo.com.                  IN      SOA

;; AUTHORITY SECTION:
foo.com.                86400   IN      SOA     ns1.foo.com. root.foo.com. 2022070412 2500 900 3000 2000000

Found zone name: foo.com
The master is: ns1.foo.com
Sending update to 172.18.1.28#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:   6508
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 2, ADDITIONAL: 0
;; UPDATE SECTION:
www1.foo.com.           0       NONE    A       1.2.3.4
www2.foo.com.           0       NONE    A       2.3.4.5


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:   6508
;; flags: qr; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;foo.com.                       IN      SOA

> quit                                                      << 対話モード終了(Ctrl+D でもOKらしい)
#

2. キャッシュをダンプファイルに保存し、削除した 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.                                      86400 IN SOA      ns1.foo.com. root.foo.com. 2022070413 2500 900 3000 2000000
foo.com.                                      86400 IN NS       ns1.foo.com.
foo.com.                                      86400 IN NS       ns2.foo.com.
foo.com.                                      86400 IN A        172.18.1.28
ns1.foo.com.                                  86400 IN A        172.18.1.28
ns1.foo.com.                                  86400 IN AAAA     fd00::1c
ns2.foo.com.                                  86400 IN A        172.18.1.28
ns2.foo.com.                                  86400 IN AAAA     fd00::1c

3. 削除した RR をクエリできないことを確認(→NXDOMAIN)

# dig @172.18.1.28 www1.foo.com a +norec +noall +comments
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 40954
;; flags: qr aa ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 5e669c045e1c5d6e0a12924167c93d18261f0e98e6032f20 (good)

4. ジャーナルをゾーンファイルにマージ

# rndc sync -clean foo.com

# ls -l /var/named/foo.com.zone*
-rw-r--r--. 1 named named 445 Mar  6 15:14 /var/named/foo.com.zone
#

# grep www /var/named/foo.com.zone
#
タイトルとURLをコピーしました