Dynamic DNS 設定方法 BIND9 ISC-DHCP
BIND9とISC-DHCPによるDynamic DNS設定方法について記載します。
最初にBIND9とISC-DHCPのインストールから基本的な設定を記載した後、
Dynamic DNS設定に必要な内容を記載していきます。
1.環境
1-1.VMWare
筐体 : 自作PC(Win10pro) VMWare : VMware(R) Workstation 17 Pro 17.5.1 build-23298084 仮想マシン : Ubuntu 22.04.2, vyos-1.5-rolling-202404040019
1-2 .全体構成

vyosをルータとして、DNSとDHCPのサブネット、Clientのサブネットに分割しています。
DNS、DHCP、Clientは全てUbuntu 22.04.2を使用しています。
vyosのeth2では、以下のようにDHCPリレー設定を行っています。
set service dhcp-relay listen-interface 'eth2' set service dhcp-relay server '192.168.74.148' set service dhcp-relay upstream-interface 'eth1'
もちろん、同一サブネット内であればDHCPリレー設定は不要です。
また、DNSとDHCPの仮想マシンを別けていますが、同一仮想マシン内でDNSとDHCPサービスを同時に稼働させることも可能です。
なお、構成図上にu222c2147などホスト名を記載していますが、これは、動作確認時のログにホスト名が表示されるため、どのホストから出力されたログかを識別するために記載しています。
2.BIND9インストールと設定
特に順番はありませんが、ここでは先にBIND9から設定していきます。*1
2-1.BIND9インストール
apt -y install bind9 bind9utils
2-2.named.conf設定
新規でZoneを定義しますので、include~の行を最終行に追記してください。
vi /etc/bind/named.conf include "/etc/bind/named.conf.intzone";
2-3.named.conf.options設定
オプションはお好みで設定してください。
ここでは例として、forwaders, allow-query, recursionの設定を追記しました。
vi /etc/bind/named.conf.options
forwarders {
8.8.8.8;
};
allow-query { localhost; 192.168.0.0/16; };
recursion yes;
2-4.Zoneファイルの指定設定
新規でファイルを作成します。
定義したZoneにおける各Zoneファイルを指定しています。
vi /etc/bind/named.conf.intzone zone "example.com" IN { type master; file "/etc/bind/example.com.lan"; allow-update { none; }; }; zone "75.168.192.in-addr.arpa" IN { type master; file "/etc/bind/75.168.192.db"; allow-update { none; }; };
2-5.Zoneファイル設定:正引き
正引きファイルを設定します。
ns行までは、必須です。
vyosの行以下は、テスト用のため任意で設定してください。
vi /etc/bind/example.com.lan $TTL 60 @ IN SOA ns.example.com. root.example.com. ( 2024062401 ;Serial 60 ;Refresh 30 ;Retry 120 ;Expire 60 ;Minimum TTL ) IN NS ns.example.com. IN A 192.168.74.147 IN MX 10 ns.example.com. ns IN A 192.168.74.147 vyos IN A 192.168.74.1 vyos IN A 192.168.75.1
2-6.Zoneファイル設定:逆引き
逆引きファイルを設定します。
PTRレコードはテスト用のため任意で設定してください。
vi /etc/bind/75.168.192.db $TTL 60 @ IN SOA ns.example.com. root.example.com. ( 2024062401 ;Serial 60 ;Refresh 30 ;Retry 120 ;Expire 60 ;Minimum TTL ) IN NS ns.example.com. 1 IN PTR vyos.example.com.
設定が完了したら、サービスの再起動をしておきます。
systemctl restart named
2-7.動作確認
digコマンドで正引きと逆引きの確認を行います。
正引きの動作確認
root@u222c2147:~# dig vyos.example.com ; <<>> DiG 9.18.24-0ubuntu0.22.04.1-Ubuntu <<>> vyos.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18198 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;vyos.example.com. IN A ;; ANSWER SECTION: vyos.example.com. 60 IN A 192.168.75.1 vyos.example.com. 60 IN A 192.168.74.1 ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Sun Jul 07 08:57:27 JST 2024 ;; MSG SIZE rcvd: 77
逆引きの動作確認*2
Croot@u222c2147:~# dig -x 192.168.75.1 ; <<>> DiG 9.18.24-0ubuntu0.22.04.1-Ubuntu <<>> -x 192.168.75.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41316 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;1.75.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 1.75.168.192.in-addr.arpa. 60 IN PTR vyos.example.com. ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Sun Jul 07 08:58:26 JST 2024 ;; MSG SIZE rcvd: 84
DNSサーバ設定は一旦完了です。
3.ISC-DHCPインストールと設定
3-3.dhcpd.conf設定
デフォルトで設定されているoptionをコメントアウトします。
検証用にリース時間を任意で短くしています。単位は秒です。
2つのサブネットに対して設定を行います。
vi /etc/dhcp/dhcpd.conf #option domain-name "example.org"; #option domain-name-servers ns1.example.org, ns2.example.org; default-lease-time 30; max-lease-time 60; subnet 192.168.74.0 netmask 255.255.255.0 { } subnet 192.168.75.0 netmask 255.255.255.0 { range 192.168.75.32 192.168.75.63; option routers 192.168.75.1; option domain-name-servers 192.168.74.147; option domain-name "example.com"; }
<補足>
"subnet 192.168.74.0"の設定は不要と思われがちですが、この設定がないとDHCPサービス起動時にFaildとなるため必須です。
これは待ち受けNICとして設定したens34のIPアドレスと同一サブネットの設定を定義しておかないとダメなようです。*3
設定が完了したら、サービスの再起動をしておきます。
systemctl restart isc-dhcp-server
3-4.動作確認
Clientを起動して、192.168.75.xのアドレスが取得できていればOKです。
または、以下のログをtailした状態で、Clientを起動しても良いと思います。
tail -f /var/log/syslog Jul 7 09:12:36 u222c2148 dhcpd[886]: DHCPDISCOVER from 00:0c:29:c7:31:a6 via 192.168.75.1 Jul 7 09:12:37 u222c2148 dhcpd[886]: DHCPOFFER on 192.168.75.32 to 00:0c:29:c7:31:a6 (u222c2149) via 192.168.75.1 Jul 7 09:12:37 u222c2148 dhcpd[886]: DHCPREQUEST for 192.168.75.32 (192.168.74.148) from 00:0c:29:c7:31:a6 (u222c2149) via 192.168.75.1 Jul 7 09:12:37 u222c2148 dhcpd[886]: DHCPACK on 192.168.75.32 to 00:0c:29:c7:31:a6 (u222c2149) via 192.168.75.1
DHCPサーバ設定は一旦完了です。
4.Dynamic DNS設定
ここまでのDNSおよびDHCP設定をベースとして、Dynamic DNSの設定を行っていきます。
4-1.TSIG Keyファイル作成
/etc/bindにcdした後、ddns-confgenコマンドを実行します。
"dhcp75.ddns.lan"の部分は任意の文字列でOKです。
cd /etc/bind ddns-confgen -k dhcp75.ddns.lan
<出力例>
key "dhcp75.ddns.lan"の赤文字部分がKeyとなります。
root@u222c2147:/etc/bind# ddns-confgen -k dhcp75.ddns.lan # To activate this key, place the following in named.conf, and # in a separate keyfile on the system or systems from which nsupdate # will be run: key "dhcp75.ddns.lan" { algorithm hmac-sha256; secret "4g7Jwcozsh5s35M1gOJ7VLNVa9mJSK3s9lwVw06MKRc="; }; # Then, in the "zone" statement for each zone you wish to dynamically # update, place an "update-policy" statement granting update permission # to this key. For example, the following statement grants this key # permission to update any name within the zone: update-policy { grant dhcp75.ddns.lan zonesub ANY; }; # After the keyfile has been placed, the following command will # execute nsupdate using this key: nsupdate -k
同じディレクトリのまま、新規でkeyファイルを作成します。
前項の赤文字部分をそのままコピペしてください。
vi dhcp75.key
key "dhcp75.ddns.lan" {
algorithm hmac-sha256;
secret "4g7Jwcozsh5s35M1gOJ7VLNVa9mJSK3s9lwVw06MKRc=";
};
Keyファイルに対してchmodをしておきます。
chown root:bind dhcp75.key
4-2.Zoneファイル移動
Zoneファイルを/var/lib/bind/配下にmvします。
Zoneファイルは、DHCPサーバからのアップデート要求に基づいて動的更新されるためです。
mv /etc/bind/example.com.lan /var/lib/bind/ mv /etc/bind/75.168.192.db /var/lib/bind/
4-3.named.conf.intzoneファイルの更新
更新前にバックアップをとっておきます。
cp /etc/bind/named.conf.intzone /etc/bind/named.conf.intzone.org
変更するポイントは以下3点です。
- dhcp75.keyをincludeします。
- file行のPathを更新します。
- allow-update行を削除し、update-policyに更新します。
vi /etc/bind/named.conf.intzone include "/etc/bind/dhcp75.key"; zone "example.com" IN { type master; file "/var/lib/bind/example.com.lan"; update-policy { grant dhcp75.ddns.lan wildcard *.example.com A DHCID; }; }; zone "75.168.192.in-addr.arpa" IN { type master; file "/var/lib/bind/75.168.192.db"; update-policy { grant dhcp75.ddns.lan wildcard *.75.168.192.in-addr.arpa PTR; }; };
更新が完了したら、以下のコマンドでチェックします。
何も出力されなければOKです。
sudo named-checkconf
サービスの再起動とステータス確認を行います。
systemctl restart named systemctl status named
<出力例>
root@u222c2147:/etc/bind# systemctl status named
● named.service - BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2024-07-07 09:34:04 JST; 8s ago
Docs: man:named(8)
Process: 1429 ExecStart=/usr/sbin/named $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 1430 (named)
Tasks: 6 (limit: 4514)
Memory: 6.0M
CPU: 23ms
CGroup: /system.slice/named.service
└─1430 /usr/sbin/named -u bind
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2001:503:c27::2:30#53
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2001:500:2d::d#53
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2801:1b8:10::b#53
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2001:500:2f::f#53
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2001:7fd::1#53
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2001:500:1::53#53
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2001:500:12::d0d#53
Jul 07 09:34:04 u222c2147 named[1430]: network unreachable resolving './NS/IN': 2001:500:9f::42#53
Jul 07 09:34:04 u222c2147 named[1430]: managed-keys-zone: Key 20326 for zone . is now trusted (acceptance timer complete)
Jul 07 09:34:04 u222c2147 named[1430]: resolver priming query complete: success
4-4.TSIG Keyファイルのコピー
SCPコマンドで、DNSサーバ上で作成したdhcp75.keyを、DHCPサーバ上の/etc/dhcp/ddns-keys/配下にコピーします。
scp /etc/bind/dhcp75.key root@192.168.74.148:/etc/dhcp/ddns-keys/
もしくは、DHCPサーバ上で直接作成しても構いません。Keyファイル作成時の赤文字部分をそのままコピペします。*4
vi /etc/dhcp/ddns-keys/dhcp75.key key "dhcp75.ddns.lan" { algorithm hmac-sha256; secret "4g7Jwcozsh5s35M1gOJ7VLNVa9mJSK3s9lwVw06MKRc="; };
4-5.dhcpd.confファイルの更新
更新前にバックアップをとっておきます。
cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.org
変更するポイントは以下3点です。
vi /etc/dhcp/dhcpd.conf include "/etc/dhcp/ddns-keys/dhcp75.key"; ddns-updates on; ddns-update-style standard; zone example.com. { primary 192.168.74.147; key dhcp75.ddns.lan; } zone 75.168.192.in-addr.arpa. { primary 192.168.74.147; key dhcp75.ddns.lan; }
サービスの再起動とステータス確認を行います。
systemctl restart isc-dhcp-server systemctl status isc-dhcp-server
<出力例>
root@u222c2148:~# systemctl status isc-dhcp-server ● isc-dhcp-server.service - ISC DHCP IPv4 server Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2024-07-07 09:44:52 JST; 5s ago Docs: man:dhcpd(8) Main PID: 1305 (dhcpd) Tasks: 4 (limit: 4514) Memory: 14.3M CPU: 15ms CGroup: /system.slice/isc-dhcp-server.service └─1305 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf ens34 Jul 07 09:44:52 u222c2148 dhcpd[1305]: PID file: /run/dhcp-server/dhcpd.pid Jul 07 09:44:52 u222c2148 dhcpd[1305]: Wrote 1 leases to leases file. Jul 07 09:44:52 u222c2148 sh[1305]: Wrote 1 leases to leases file. Jul 07 09:44:52 u222c2148 dhcpd[1305]: Listening on LPF/ens34/00:0c:29:26:19:61/192.168.74.0/24 Jul 07 09:44:52 u222c2148 sh[1305]: Listening on LPF/ens34/00:0c:29:26:19:61/192.168.74.0/24 Jul 07 09:44:52 u222c2148 sh[1305]: Sending on LPF/ens34/00:0c:29:26:19:61/192.168.74.0/24 Jul 07 09:44:52 u222c2148 sh[1305]: Sending on Socket/fallback/fallback-net Jul 07 09:44:52 u222c2148 dhcpd[1305]: Sending on LPF/ens34/00:0c:29:26:19:61/192.168.74.0/24 Jul 07 09:44:52 u222c2148 dhcpd[1305]: Sending on Socket/fallback/fallback-net Jul 07 09:44:52 u222c2148 dhcpd[1305]: Server starting service.
DHCPの設定更新としては以上となります。
5.動作確認とTips
5-1.動作確認
DNSとDHCPサーバのそれぞれで以下のコマンドを実行しておきます。
tail -f /var/log/syslog
Clientを起動してください。
DNSとDHCPサーバ上で、それぞれ以下のログが出力されれば正常に更新されています。
<DNS側の出力例>
Jul 7 09:49:27 u222c2147 named[1430]: client @0x7fe06c22b078 192.168.74.148#60321/key dhcp75.ddns.lan: updating zone 'example.com/IN': adding an RR at 'u222c2149.example.com' A 192.168.75.32 Jul 7 09:49:27 u222c2147 named[1430]: client @0x7fe06c22b078 192.168.74.148#60321/key dhcp75.ddns.lan: updating zone 'example.com/IN': adding an RR at 'u222c2149.example.com' DHCID AAIBo4qhcLCIFqPc87yoBzE3J4JKcPgq9Ae8nrkULTsbD2A= Jul 7 09:49:27 u222c2147 named[1430]: client @0x7fe06c22a9b8 192.168.74.148#40031/key dhcp75.ddns.lan: updating zone '75.168.192.in-addr.arpa/IN': deleting rrset at '32.75.168.192.in-addr.arpa' PTR Jul 7 09:49:27 u222c2147 named[1430]: client @0x7fe06c22a9b8 192.168.74.148#40031/key dhcp75.ddns.lan: updating zone '75.168.192.in-addr.arpa/IN': adding an RR at '32.75.168.192.in-addr.arpa' PTR u222c2149.example.com.
<DHCP側の出力例>
Jul 7 09:49:26 u222c2148 dhcpd[1305]: DHCPDISCOVER from 00:0c:29:c7:31:a6 via 192.168.75.1 Jul 7 09:49:27 u222c2148 dhcpd[1305]: DHCPOFFER on 192.168.75.32 to 00:0c:29:c7:31:a6 (u222c2149) via 192.168.75.1 Jul 7 09:49:27 u222c2148 dhcpd[1305]: DHCPREQUEST for 192.168.75.32 (192.168.74.148) from 00:0c:29:c7:31:a6 (u222c2149) via 192.168.75.1 Jul 7 09:49:27 u222c2148 dhcpd[1305]: DHCPACK on 192.168.75.32 to 00:0c:29:c7:31:a6 (u222c2149) via 192.168.75.1 Jul 7 09:49:27 u222c2148 dhcpd[1305]: Added new forward map from u222c2149.example.com to 192.168.75.32 Jul 7 09:49:27 u222c2148 dhcpd[1305]: Added reverse map from 32.75.168.192.in-addr.arpa. to u222c2149.example.com
Clientからもdigコマンドで確認してみます。
<digコマンドの出力例>
root@u222c2149:~# dig u222c2149.example.com ; <<>> DiG 9.18.1-1ubuntu1.3-Ubuntu <<>> u222c2149.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33246 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;u222c2149.example.com. IN A ;; ANSWER SECTION: u222c2149.example.com. 30 IN A 192.168.75.32 ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Sun Jul 07 10:17:57 JST 2024 ;; MSG SIZE rcvd: 66 root@u222c2149:~# dig -x 192.168.75.32 ; <<>> DiG 9.18.1-1ubuntu1.3-Ubuntu <<>> -x 192.168.75.32 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17163 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;32.75.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 32.75.168.192.in-addr.arpa. 30 IN PTR u222c2149.example.com. ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Sun Jul 07 10:18:03 JST 2024 ;; MSG SIZE rcvd: 90
5-2.Zoneファイルを手動更新する場合
Zoneファイルは自動更新されるため、手動でZoneファイルを設定したい場合は、自動更新を明示的に一時停止する必要があります。
自動更新を一時停止する場合は以下のコマンド
rndc freeze
自動更新を再開する場合は以下のコマンド
rndc thaw
自動更新が始まると、/var/lib/bind/配下のZoneファイルは、以下のように更新されます。*5
<正引きファイル出力例>
root@u222c2147:~# cat /var/lib/bind/example.com.lan $ORIGIN . $TTL 60 ; 1 minute example.com IN SOA ns.example.com. root.example.com. ( 2024062435 ; serial 60 ; refresh (1 minute) 30 ; retry (30 seconds) 120 ; expire (2 minutes) 60 ; minimum (1 minute) ) NS ns.example.com. A 192.168.74.147 MX 10 ns.example.com. $ORIGIN example.com. ns A 192.168.74.147 $TTL 30 ; 30 seconds u222c2149 A 192.168.75.32 DHCID ( AAIBo4qhcLCIFqPc87yoBzE3J4JKcPgq9Ae8nrkULTsb D2A= ) ; 2 1 32 $TTL 60 ; 1 minute vyos A 192.168.74.1 A 192.168.75.1
<逆引きファイル出力例>
root@u222c2147:~# cat /var/lib/bind/75.168.192.db $ORIGIN . $TTL 60 ; 1 minute 75.168.192.in-addr.arpa IN SOA ns.example.com. root.example.com. ( 2024062420 ; serial 60 ; refresh (1 minute) 30 ; retry (30 seconds) 120 ; expire (2 minutes) 60 ; minimum (1 minute) ) NS ns.example.com. $ORIGIN 75.168.192.in-addr.arpa. 1 PTR vyos.example.com. $TTL 30 ; 30 seconds 32 PTR u222c2149.example.com.
<補足>
/var/lib/bind/配下には、.jnl(ジャーナル)ファイルが存在します。
先にジャーナルファイルが更新された後、少し時間をおいてからZoneファイルが更新されます。*6
root@u222c2147:~# ls -Fal /var/lib/bind/ total 24 drwxrwxr-x 2 root bind 4096 Jul 7 10:03 ./ drwxr-xr-x 42 root root 4096 Jul 6 18:07 ../ -rw-r--r-- 1 bind bind 404 Jul 7 10:02 75.168.192.db -rw-r--r-- 1 bind bind 3449 Jul 7 10:04 75.168.192.db.jnl -rw-r--r-- 1 bind bind 552 Jul 7 10:03 example.com.lan -rw-r--r-- 1 bind bind 2792 Jul 7 10:04 example.com.lan.jnl
以上です。
5.最後に
以下のサイトを参考にさせて頂きました。
j.eng's site: Dynamic DNS updates for DHCP hosts
[ubuntu] Dynamic DNS with BIND and ISC-DHCP
BBルータなどを使用していると、DDNSはデフォルトで良い感じに設定されているため、あまり意識しないかもしれませんが、ゼロから構築しようとするとサクッとできない部分もあるので、自分用にまとめてみました。
*2:逆引きの場合、"dig -x @192.168.74.147 192.168.75.1"とすると、上手くいかないときがあったので、仮想マシンのDNSサーバ設定を、予め明示的に192.168.74.147に設定しておいてください。
*3:DHCPサーバの居るサブネットではDHCPによるアドレス配布はしないから、といって、この設定を忘れるとDHCPサービスが起動しない、という罠にハマりがちなので要注意です。
*4:もし、/etc/dhcp/ddns-keysディレクトリが存在しない場合は、mkdirで作成してください。
*5:見てわかる通り、ZoneファイルはBIND9プロセスで制御されているため、rndc freezeをせずにviなどでZoneファイルを開くとコンフリクトなどを起こす可能性があります。
*6:ジャーナルファイルが更新された時点でDNSクエリは可能な状態になっていますので、Zoneファイルが更新されないからといって不安にならないでください。