我正在运行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
使用我的密钥,我可以直接在该区域中动态添加新记录(例如创建一个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)
答案1
事实证明,问题确实出在 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.
- 失败。
答案2
我不认为有什么“错误”。
我们编写了一个脚本,该脚本会遍历我们的数千个域,手动编辑 DNS 文件,然后重新启动 DNS 服务。