我正在运行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.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 服务。