动态更新区域子域

动态更新区域子域

我正在运行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.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.
  • 失败。

答案2

我不认为有什么“错误”。

我们编写了一个脚本,该脚本会遍历我们的数千个域,手动编辑 DNS 文件,然后重新启动 DNS 服务。

相关内容