我有 2 个 DNS 服务器 (BIND9)(主服务器、辅助服务器)和 1 个域。我有一个具有动态 IP 的 Web 服务器。因此,如果我的 IP 发生变化,我将无法通过域访问我的网站,因为在 DNS 服务器中,域区域 IP cot 已发生变化。
我的问题是:如何每次使用我的公共 IP 地址从我的服务器更新我的区域?有人可以给我一个 Linux(Debian 9)上的更新程序脚本吗?
谢谢
答案1
您可以使用 RFC 2136“DNS UPDATE”,通过编写工具脚本nsupdate
或使用兼容的第三方客户端:
共享密钥 (TSIG)
生成用于验证更新的密钥:
$ tsig-keygen -r /dev/urandom | tee tsig-key.private key "tsig-key" { algorithm hmac-sha256; secret "7P6HbRZRJCmtauo/lV0jwN9wkMgBTUikhf9JuaTvYT4="; };
服务器和客户端只知道这个密钥,其他人则不知道。
将打印的文本复制到您的 中
named.conf
。(您可以为不同的主机设置多个密钥,每个密钥在字段中都有唯一的名称key "…"
。)在区域配置中启用动态更新:
zone … { … update-policy { /* grant <key_name> <policy> <record_types> */ grant "tsig-key" name myserver.example.com ANY; }; };
可以使用各种不同的策略;例如
zonesub
允许更新全部的区域,subdomain dyn.example.com
含义明显。执行更新:
$ nsupdate -k tsig-key.private > zone example.com > del myserver.example.com > add myserver.example.com 3600 A 100.64.1.1 > send
有多种客户端能够自动更新。
公钥/私钥(SIG(0))
生成密钥对:
$ dnssec-keygen -r /dev/urandom -T KEY -n USER myclient.example.com $ ls K* Kmyclient.example.com.+005+07399.key Kmyclient.example.com.+005+07399.private
该
*.key
文件包含公钥 – 将其添加到您的 DNS 区域。该
*.private
文件包含私钥——将其复制到客户端计算机。(实际上,复制两个都文件传输至客户端计算机。设置
update-policy { }
方式与 TSIG 完全相同。以同样的方式使用 执行更新
nsupdate -k <filename>.private
。
(注意:虽然 TSIG 密钥名称是任意的,但 SIG(0) 密钥存储在 DNS 中,因此始终以主机名/子域名命名。密钥名称才不是但是需要与您正在更新的主机名相匹配。)
Kerberos(GSS-TSIG)
有点超出范围,但 BIND9 也支持这一点(主要用于 Active Directory)。