本篇文章僅限 BIND 的 DDNS (Dynamic DNS) 設定方式
不另說明 DNS 及 BIND 的架構和觀念
範例
Domain: example.com
master (Primary) server: dns.example.com (192.168.1.1)
slave (Secondary) server: ns1.example.com (192.168.1.2)
先用 dnssec-keygen 產生需要的 TSIG key,存放在 /var/named/keys
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | mkdir -p /var/named/keys chmod 0760 /var/named/keys chown root.named /var/named/keys cd /var/named/keys // dnssec-keygen -a (演算法) -b (金鑰大小) -n (金鑰類型) Name dnssec-keygen -a hmac-sha512 -b 128 -n HOST ddns Kddns.+165+12457 // 會產生兩個 Kddns 開頭的檔案 // 格式說明 // K(Name).+(演算法)+(keyId).key // K(Name).+(演算法)+(keyId).private ll Kddns* Kddns.+165+12457.key Kddns.+165+12457.private cat Kddns.+165+12457.key ddns. IN KEY 512 3 165 waAzR8JieB2vcRX42R9dEg== | 
其中 waAzR8JieB2vcRX42R9dEg== 是我們需要的資訊
接著在 named.conf 中新增一個 zone 和 一個 key
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | key "ddns" {         algorithm hmac-sha512;         secret "waAzR8JieB2vcRX42R9dEg=="; }; zone "example.com" {         type master;         file "/var/named/dynamic/example.com.hosts";         allow-query { any; };         allow-update { key "ddns"; 127.0.0.1; };         // 允許使用 ddns 這組 key 來進行更新         // 也允許來源IP為 127.0.0.1(及本機) 進行更新 (風險很高) }; | 
再來是正解資料的設定, 檔案內容只需要 SOA 和 NS 紀錄
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /var/named/dynamic/example.com.hosts touch /var/named/dynamic/example.com.hosts chown named.named /var/named/dynamic/example.com.hosts // 以下是檔案內容 $TTL 432000     ; 5 days example.com. IN SOA dns.example.com. root.example.com. (                 2018121200 ; serial                 86400      ; refresh (1 day)                 3600       ; retry (1 hour)                 604800     ; expire (1 week)                 86400      ; minimum (1 day)                 ) example.com. IN NS dns.example.com. example.com. IN NS ns1.example.com. dns          IN A 192.168.1.1 ; 依照實際狀況置換IP ns1          IN A 192.168.1.2 ; 依照實際狀況置換IP | 
然後重新啟動 bind (named / named-chroot )
這樣就算是把環境建置完成囉
將 /var/name/keys/Kddns.+165+12457.key 和 /var/name/keys/Kddns.+165+12457.private 兩個檔案複製到需要用來更新 dns 紀錄的 client 端
接下來就是使用 nsupdate 來異動相關 dns 紀錄,以下範例的 TTL 都是 86400
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | $ nsupdate -k /var/named/keys/Kddns.+165+12457.key  // 或使用下面的方式則不需要 .key 和 .private 檔案 $ nsupdate -y hmac-sha512:ddns:waAzR8JieB2vcRX42R9dEg== // 要更新的 name server IP > server 192.168.1.1 // 新增 www 的 A 紀錄 > update add www.example.com. 86400 A 192.168.1.1 > send // 新增 www 的 AAAA 紀錄 > update add hinet.example.com. 86400 AAAA 2001:b000:168::1 > send // 新增 example.com 的 NS 紀錄 ns2.example.com IP 是 192.168.1.1 > update add example.com. 86400 NS ns2.example.com. > update add ns2.example.com. 86400 A 192.168.1.3 > send // 刪除 NS 相關紀錄 > update delete example.com. 86400 NS ns2.example.com. > update delete ns2.example.com. 86400 A 192.168.1.3 > send // 刪除 www 的 A 紀錄 (可以不指明 IP) > update delete www.example.com. 86400 A > send // 刪除 www 的 AAAA 紀錄 (也可以連 TTL 都不指明) > update delete hinet.example.com. AAAA > send | 
因為 named.conf 中的 allow-update 設定 127.0.0.1 這個 IP
所以若是本機操作,則連 key 都可以不用指定
| 1 2 3 | $ nsupdate > server 127.0.0.1 > | 
這樣就可以直接開始異動 dns 紀錄
但是這個設定方式風險很高,只要能執行 nsupdate 的使用者都可以異動dns紀錄
以上 BIND 基本的 動態DNS 運作方式
如果 FQDN 中包含「_」下底線,則 send 指令送出後會返回 update failed: REFUSED 訊息
而 log 檔案中出現 bad owner name (check-names) 的錯誤訊息
解決方式是在 named.conf 的 options 加入以下三行設定
| 1 2 3 | check-names master ignore; check-names slave ignore; check-names response ignore; | 
另外 allow-update 這個設定方式給的權限很大,如果要做比較細部的個別授權可以參考 BIND 9 開始支援的另一個設定方式 update-policy (與 allow-update 互斥,只能擇一使用)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | zone "example.com" {         type master;         file "/var/named/dynamic/example.com.hosts";         allow-query { any; };         update-policy {             // 授權 ddns key 只能更新 www.example.com 的 A 紀錄             grant "ddns" name www.example.com. A;             // 授權 ddns key 可以更新 web.example.com 的 所以紀錄             grant "ddns" name web.example.com. ANY;             // 授權 ddns key 可以更新 ddns.example.com             // 和 ddns.example.com 整個子網域的所有 A/AAAA 紀錄             grant "ddns" subdomain ddns.example.com A AAAA;         }; }; | 
注意!
使用 update-policy 可以定義多個授權,判斷到第一個符合的條件的授權後就不會再判斷其他的授權條件是否符合了
有興趣的,自己開發一下 Web 管理界面就可以在瀏覽器進行 DNS 設定
甚至可以對外提供 DDNS 服務囉!