$zones = file(URL TO MASTER SERVER);
if($zones != ""){
$header = "// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
";
file_put_contents("/var/www/html/zone/zones.txt", $header);
foreach($zones as $zone){
if($zone != "") {
$zone = preg_replace('~[[:cntrl:]]~', '', $zone);
$config = 'zone "' . $zone.'" {
type slave;
masters {lemming; };
allow-transfer {none; };
file "/var/lib/bind/db.'.$zone.'";
};
';
file_put_contents('/var/www/html/zone/zones.txt', $config, FILE_APPEND);
}}
}
“区域”目录需要是可写的
然后像这样创建一个 bash 脚本:
#!/bin/bash
php /var/www/html/index.php
cp /var/www/html/zone/zones.txt /etc/bind/named.conf
service bind9 restart
logger DNS Zones pulled from master and bind restarted /home/bob/dns_sync.sh
查看 BIND 9.7.2-P2,其中有“rndc addzone”和“rndc delzone”语句,允许您从正在运行的服务器“远程”添加和删除区域。
我有一篇论文提供了我上个月在 NANOG 上提供的一些示例。
ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf
虽然这不会回过头来清理您当前的任何混乱,但它确实使您能够使用“rndc”管理的机器非常容易同步。
[是的,回复一个相当老的帖子,但 BIND 9.7.2-P2 足够酷,可以保证它]
添加另一个更新(事后多年,但希望它可以帮助在搜索结果中遇到此问题的人),我想推荐使用目录区域。
BIND 9.11 (2018) 中引入的目录区域允许通过在主服务器和辅助服务器之间共享的特殊区域自动配置区域(添加和删除)。
有关完整信息,请参阅: https ://kb.isc.org/docs/aa-01401
如果您使用的是平面文件后端,我不知道有任何方法可以在本机上执行此操作。有各种由数据库支持的系统可以帮助实现自动化。或者你可以编写脚本:
我用区域列表和区域的主要 NS IP 填充一个文本文件,并将其粘贴在我允许我的奴隶访问的网站上。slaves 周期性地获取这个文件,如果它已经改变,他们会解析它生成一个 named.conf,并告诉 bind 重新加载配置。它是“自动的”,因为我不必手动 ssh 到我的辅助服务器并更新配置,但它仍然在 bind9 外部。
您还可以使用更高级别的配置管理系统(例如puppet)来管理您的整个 DNS 基础设施。不过这有点复杂。
也许您正在寻找像Puppet或CFEngine 这样的配置管理系统?涉及额外的基础设施,但他们可以处理分发大量配置内容,并且也可以轻松包含这些内容。
Bind 自己做不到。更重要的是,让它这样做是不可取的。在许多情况下,任何给定的从站都应该只复制某些域。
如果您正确编写区域并确保named.conf 位于/var/named 中,则在整个/var/named 树上使用rsync 效果会非常好。但是,它不适用于动态更新,并且与“应该如何做”的方式相悖。
我还尝试填充所有域以传播到一个特殊区域,并在从属设备上使用一个简单的脚本根据他们在主区域中看到的内容重建 named.conf。基本上与上面的文本文件相同,但从 DNS 提供它以将所有内容保持在带内。我可能应该在最终丢失之前发布脚本 =/
在每个人和他们的妈妈都拥有自己的域的日子里,令我惊讶的是,现在还没有一个很好的解决方案来与 Bind 集成 =/
我第二(或第三)以上建议检查 Puppet 或 CFEngine。此外,您可以查看将文件签入和签出 CVS/SVN。如果您对脚本解决方案感兴趣,这是我使用的:
ssh 密钥对于此设置非常重要。我并不声称拥有非凡的脚本能力,因此请随意批评,但要温柔。
对于我拥有的区域数量,手动同步最终比使用任何其他解决方案更容易。如果我有更多区域,我会研究建议的解决方案。
很好的经验,正在解决这个问题。如果有人想要,我可以发布我的脚本。
这是主服务器可以运行以创建列表的一些 php 代码。然后选项可能是将其上传到数据库或其他 DNS 服务器可以通过 http/s 将其拉取。
主服务器可以运行这个:
从服务器可以运行这个:
“区域”目录需要是可写的
然后像这样创建一个 bash 脚本:
然后以 root 身份创建一个 chronjob (crontab -e):