有没有一种方法可以自动同步BIND(9)服务器之间的所有区域,以便我将它们添加到主服务器时不必将区域添加到从服务器?
查看BIND 9.7.2-P2,其中有“rndc addzone”和“rndc delzone”语句,允许您“远程”添加和删除正在运行的服务器的区域。
我有一篇论文,提供了上个月在NANOG上给出的一些例子。
ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf
虽然这不会回头清理你目前所遇到的任何问题,但它确实使得你可以使用“rndc”进行pipe理的机器同步变得非常简单。
[是的,回应一个相当古老的职位,但BIND 9.7.2-P2是足够酷,以保证]
如果您使用的是flatfile后端,我不知道有什么办法可以在本地执行bind9。 有各种DB支持的系统可以帮助自动化。 或者你可以编写脚本:
我使用区域列表和区域的主要NS IP填充文本文件,并将其粘贴在允许我的奴隶访问的网站上。 从属文件定期获取这个文件,如果它已经改变,他们parsing它会生成一个named.conf,并告诉绑定重新加载configuration。 这是“自动”的意义上,我不必手动ssh我的辅助和更新configuration,但它仍然是外部的bind9。
您还可以使用更高级别的configurationpipe理系统(如puppet )来pipe理整个DNS基础架构。 虽然这有点复杂。
也许你正在寻找像Puppet或CFEngine这样的configurationpipe理系统? 有额外的基础设施,但他们可以处理分发大量的configuration的东西,也可以很容易地包括这一点。
绑定本身不能做到这一点。 更重要的是,这样做是不可取的。 在许多情况下,只有某些域应该与任何给定的从域复制。
在整个/ var / named树上使用rsync可以很好的工作,如果你正确的编写你的区域并确保named.conf位于/ var / named。 它不会与dynamic更新一起工作,而且对于“应该怎么做”这个问题,还算不上什么。
我也尝试过将所有的域填充到一个特殊的区域中,并且使用一个简单的脚本来重buildnamed.conf文件。 基本上与上面的文本文件相同的处理,但从DNS提供,以保持一切带内。 我应该在我最终失去它之前发布脚本= /
在每个人和他们的妈妈都有自己的领域的时代,令我惊讶的是现在没有一个好的解决scheme,
我第二次(或第三次)上述build议检查出木偶或CFEngine。 另外,你可以看看你的文件进出CVS / SVN。 如果您对脚本解决scheme感兴趣,请使用以下代码:
#!/bin/bash DATE=`date +%Y-%m-%d` archive='/root/dns' cd $archive [ $1 ] && DEBUG=$1 if [ "$DEBUG" == "-debug" ]; then echo "Debugging activated..." else unset DEBUG fi for server in dnsm02 dnsm03 dnsm51 dnsm52; do for file in named.conf named.cfx.conf named.external.conf named.internal.conf named.logging.conf named.options.conf; do PATCHDIR="$archive/$server/$DATE/patch" && [ $DEBUG ] && echo "PATCHDIR = $PATCHDIR" SRVDIR="$archive/$server/$DATE" && [ $DEBUG ] && echo "SRVDIR = $SRVDIR" ## Fetch bind config files from $server, put them in date stamped $archive/$server [ ! -d $PATCHDIR ] && mkdir -p $PATCHDIR && [ $DEBUG ] && echo "Created archive directory" scp -q user@$server:/etc/bind/$file $archive/$server/$DATE/$file && [ $DEBUG ] && echo "Copied remote $file from $server..." ## diff fetched file against template file and create a patch [ $DEBUG ] && echo "Creating patch file..." diff -u $SRVDIR/$file $archive/$server/$file > $PATCHDIR/patch.$file [ ! -s $PATCHDIR/patch.$file ] && rm -f $PATCHDIR/patch.$file && [ $DEBUG ] && echo "no differences , no patch created for $server $file" [ -s $PATCHDIR/patch.$file ] && patch $SRVDIR/$file $PATCHDIR/patch.$file && ssh user@$server "sudo scp user@dnsm01:$SRVDIR/$file /etc/bind/$file" && [ $DEBUG ] && echo "$file patched and uploaded" done [ $DEBUG ] && echo "Checking whether patch directory is empty..." [ $(ls -1A $PATCHDIR | wc -l) -eq 0 ] && rmdir $PATCHDIR && [ $DEBUG ] && echo "$PATCHDIR empty, removing..." ssh user@$server "sudo rndc reload" done
SSH密钥是非常重要的这个设置。 我不要求非凡的脚本权力,所以可以批评,但要温和。
对于我拥有的区域数量,手动同步最终比其他解决scheme的工作更容易。 如果我有更多的区域,我会研究提出的解决scheme。
良好的经验,解决这个问题。 我可以发布我的脚本,如果有人想要他们。