dynamic更新区域子域

我正在运行一个bind9 (9.9.5)DNS服务器(在Debian / jessie上)。 我已经configuration了一个区域来允许dynamic更新,并且希望为该区域内的特定主机添加TXTlogging。

这是一个示例设置(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 

使用我的密钥 ,我可以直接在该区域dynamic添加新的logging(例如为_acme-challenge.example.com创build一个TXTlogging)。

但是,我真正想要做的是为区域内的主机添加子域logging。 例如,在example.com区域中,有一个Aloggingmail.example.com ,我想为_acme-challenge.mail.example.comdynamic添加一个TXTlogging。

不幸的是,我的名称服务器不喜欢这个,拒绝使用

secret-key:更新区域“example.com/IN”:更新失败:更新区域无权威(NOTAUTH)

可以手动将该logging添加到数据库文件,它工作正常。

  _acme-challenge.mail TXT "secretstring" 

但是,我想自动化 (因为这是通过DNS-01挑战部署letsencrypt证书的一部分),所以手动设置logging不是一个选项。

任何想法出了什么问题,我怎样才能自动更新我的TXTlogging?

更新:脚本

实际更新是用python-dnspython实现的,如下所示:

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

事实certificate,问题确实是dnspython脚本要求更新区域的方式。

而不是请求将条目_acme-challenge.mail添加到example.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.
  • 失败。

我不认为任何事情都是“错误的”。

我们写了一个脚本,认为我们的1000年的域手动编辑DNS文件,然后重新启动DNS服务。