我有一个带有很多区域的 BIND9 服务器,我需要将区域文件的序列号加一。一些区域使用 YYYYMMDDXX 格式,但其他区域只是将其增加一,因为它们是动态 DNS 区域,因此对我来说全部更新就可以了。
有办法做到这一点吗?我尝试过,sed
但我缺乏自动执行此操作的知识。
我有一个带有很多区域的 BIND9 服务器,我需要将区域文件的序列号加一。一些区域使用 YYYYMMDDXX 格式,但其他区域只是将其增加一,因为它们是动态 DNS 区域,因此对我来说全部更新就可以了。
有办法做到这一点吗?我尝试过,sed
但我缺乏自动执行此操作的知识。
这在“sed”中很难做到,但在“awk”中却相当容易。
如果它是 SOA 行(“SOA”前后有一个空格或制表符),则增加字段 7(序列号)。打印每一行。
这只会增加所要求的序列号,但是您仍然需要触发重新加载并通知辅助服务器以传播更改。
由于绑定区域格式非常灵活,任何简单的文本操作工具都可能有点危险。
实现目标的一种方法可能是为所有区域启用动态更新,acls 仅限制来自本地计算机的访问。然后简单地添加添加,然后用 nsupdate 在每个区域中删除一条临时记录。Bind 将为您处理更新序列。
如果您正在处理一次性事件并需要强制转移,那么
rndc retransfer
忽略序列号并执行此操作的首选工具。这种方法不应该用于日常工作(它会影响序列号的准确性),但有时对带外工作的需求更大。围绕以下内容的循环应该可以解决问题:
rndc -s ${someslave} -k ${yourkey} retransfer ${i}.example.com
(作为旁注,这也是在将来增加序列号时修复序列号的首选方式)
如果所有域的 SOA 都相同,只需将 SOA 放在单独的文件db.soa或其他文件中,然后将其包含在每个区域中:
这样,只有一个地方需要增加。此外,根据您正在执行的所有操作的确切方式,使用 UNIX 纪元时间作为串行时间而不是每次递增 1 可能更有意义。您可以创建一个脚本,比如 touch-zones.sh,它会覆盖 db.soa 文件并使用串行中的当前 unix 时间戳。然后,所有区域都将通过包含而增加其序列号。
我使用了一个名为h2n的实用程序来操作 BIND 区域文件。我首先在 O'Reilly DNS and BIND 的书上了解到它。您需要“-y”选项。
关于此的一个很好的 HOWTO 位于:http: //www.microhowto.info/howto/reset_the_serial_number_of_a_dns_zone.html
这也是 DNS & BIND 书(2006 版)中推荐的方式。要理解的重要一点是 DNS SOA 序列号“环绕”。不幸的是,典型的 YYYYMMDDXX 序列号会随着动态更新而中断,我认为最好完全放弃它,并使用单调递增的序列号并将区域文件保留在版本控制中。
对于手头的具体问题,我认为更大的挑战将是确定使所有区域都认为是一个更大的数字并将它们全部同步到那个数字。
SX 上的类似问题: