自动同步BIND 9之间的所有区域


9

有没有一种方法可以自动同步BIND(9)服务器之间的所有区域,以便在将它们添加到主服务器时不必将这些区域添加到从服务器?


1
除了手动将它们添加到named.conf之外,我看不到其他方式;如果那是您的要求
quaie

Answers:


12

查看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


在推广与您相关联的软件时,请提供一些有关该事实的参考(即使该软件是免费的)。谢谢,欢迎来到服务器故障。
克里斯·S

是的,我为ISC工作,负责BIND和ISC DHCP的工作。:)
Knobee

4

如果您使用的是flatfile后端,我不知道有什么方法可以在本地对bind9进行此操作。有各种支持DB的系统可以帮助实现自动化。或者您可以编写脚本:

我用一个区域列表和该区域的主要NS IP填充文本文件,并将其粘贴在允许我的从属访问的网站上。从站会定期获取此文件,如果已更改,则它们会解析该文件,生成一个named.conf,并告诉bind重新加载配置。从某种意义上说,它是“自动的”,我不必手动ssh到我的辅助数据库并更新配置,但是bind9仍然在外部。

您还可以使用更高级别的配置管理系统(例如puppet)来管理整个DNS基础结构。不过,这有点复杂。


1
+1-我本人使用了类似(但可能效率较低)的技术,它似乎工作可靠。为了将新更改​​快速传播到从属服务器,他们需要频繁地轮询主文档(我发现每十分钟要足够频繁)。
David Spillett,

回到自动化和Tinydns的双重宗教之前,我有一个脚本,它解析主服务器的区域配置列表以获取通过inetd公开的区域列表,然后是一个从服务器上的脚本,该脚本轮询了任意数量的主IP。地址(并将该地址用作其从属配置中的主IP地址)。梦想成真。
womble

4

也许您正在寻找像PuppetCFEngine这样的配置管理系统涉及到额外的基础架构,但是它们可以处理许多配置内容的分发,并且也可以轻松地包含其中。


2

绑定本身无法做到。更重要的是,这样做是不可取的。在许多情况下,任何给定的从站都应仅复制某些域。


现在BIND显然可以了,请参阅@Knobee的答案。
Volker Stolz,

@mad_vs-谢谢,否则我不会看到那个答案。
John Gardeniers

1

如果正确编写区域并确保named.conf位于/ var / named中,则在整个/ var / named树上使用rsync效果很好。但是,它不适用于动态更新,并且有点“应如何做”。

我还尝试填充所有域以传播到一个特殊区域,并在从属服务器上使用简单的脚本根据它们在主服务器区域中看到的内容来重建named.conf。基本上与上面的文本文件相同,但是从DNS馈送它以将所有内容保持在带内。我可能应该在最终丢失脚本之前发布脚本= /

在每个人和他们的妈妈拥有自己的域名的日子里,令我感到惊讶的是,目前与Bind集成的这种解决方案还没有一个好的解决方案= /


0

我第二(或第三)条以上建议来检查Puppet或CFEngine。另外,您可以查看将文件签入CVS / SVN和签出CVS / SVN。如果您对脚本解决方案感兴趣,请使用以下方法:

#!/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键对于此设置非常重要。我并没有声称具有非凡的脚本赋权,因此可以自由批评,但要谦虚。


0

对于我所拥有的区域数量,手动同步最终比使任何其他解决方案更容易上手。如果我还有更多区域,我将研究建议的解决方案。


0
  1. 创建一个脚本以从主机中提取所有区域文件名(ls -1将完成大部分操作)。
  2. 在从服务器上创建一个脚本,它将区域文件列表作为输入,并从该列表中创建一个named.conf.local(格式非常简单),并替换现有的named.conf.local(您可以使用另一个名称,如果您想安全播放的话,请从named.conf.local包含它)
  3. 为从站上的“ rndc reload”创建一个单命令无密码sudo访问。
  4. 创建一个一次性使用的ssh密钥,该密钥允许您从主服务器发送区域列表,并将其通过管道传输到从属脚本中,然后运行“ sudo rndc reload”。现在,您可以将区域从主机推送到从机。
  5. (可选)创建Cron作业,以每天或以其他方式推送区域。

好的经验,解决这个问题。如果有人需要,我可以发布我的脚本。


@ naught101,您可以张贴脚本吗?

0

这是主服务器可以运行以创建列表的一些php代码。然后可以选择将其上载到数据库,或者其他DNS服务器可以将其拉到http / s上。

主服务器可以运行以下命令:

$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
    $zoneparts = explode(".hosts", $file);
   if(count($zoneparts) > 1){
       echo $zoneparts[0] . "\r\n";
   }
}

从服务器可以运行以下命令:

$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);
}}

}

“ zone”目录将需要可写

然后创建一个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

然后以根用户身份创建一个chronjob(crontab -e):

*/10 * * * * /home/bob/dns_sync.sh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.