Bind

動態更新區域子域

  • December 15, 2016

我正在執行bind9(9.9.5)DNS 伺服器(在 Debian/jessie 上)。我已將一個區域配置為允許動態更新,並希望TXT為該區域內的特定主機添加記錄。

這是一個範例設置(named.conf)

zone "example.com" {
   type master;
   notify yes;
   allow-update { key secret-key; };
   file "/etc/bind/db.example.com";
};

以及隨附的 db.example.com 文件:

$ORIGIN .
$TTL 604800 ; 1 week
example.com     IN SOA  dns.example.com root.example.com. (
               1          ; serial
               10800      ; refresh (3 hours)
               3600       ; retry (1 hour)
               604800     ; expire (1 week)
               86400      ; minimum (1 day)
               )
           NS  dns.example.org.
           NS  dns1.example.org.
           NS  dns2.example.org.
$ORIGIN example.com.
*           MX  10 mail.example.com.
mail        A   127.0.0.1
http        A   127.0.1.1

使用我的secret-key,我可以直接在該區域中動態添加新記錄(例如創建TXT記錄_acme-challenge.example.com)。

但是,我真正想做的是為區域內的主機添加子域記錄。例如,在區域example.com中,有一條A記錄mail.example.com,我想為其動態添加一條TXT記錄_acme-challenge.mail.example.com

不幸的是,我的域名伺服器不喜歡這樣並且拒絕使用

密鑰:更新區域“example.com/IN”:更新失敗:對更新區域沒有權威(NOTAUTH)

可以將該記錄手動添加到 db 文件中,它工作正常。

_acme-challenge.mail TXT "secretstring"

但是,我想自動執行此操作(鑑於這是通過DNS-01質詢部署letsencrypt證書的一部分),因此手動設置記錄不是一種選擇。

任何想法出了什麼問題以及如何自動更新我的 TXT 記錄?

更新:腳本

實際的更新是用 python-dnspython 實現的,看起來像:

update = dns.update.Update("mail.example.com", ...)
update.add("_acme-challenge", 500, "TXT", token)
response = dns.query.udp(update, name_server_ip)

事實證明,問題確實是 dnspython 腳本請求更新區域的方式。

它不會請求將條目添加_acme-challenge.mailexample.com區域,而是會(並且錯誤地)請求將條目_acme-challenge添加到mail.example.com區域。

由於名稱伺服器沒有mail.example.com.區域,它會拒絕處理請求。

該問題的解決方案是反复嘗試添加到父區域,直到成功(或已達到 TLD):

  • 嘗試添加_acme-challenge到區域mail.example.com.
  • 嘗試添加_acme-challenge.mail到區域example.com.
  • 嘗試添加_acme-challenge.mail.example到區域com.
  • 失敗。

引用自:https://serverfault.com/questions/820464