AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 60360
Accepted
Pablo
Pablo
Asked: 2009-08-30 10:48:45 +0800 CST2009-08-30 10:48:45 +0800 CST 2009-08-30 10:48:45 +0800 CST

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

  • 772

有没有办法在 BIND (9) 服务器之间自动同步所有区域,以便在将区域添加到主服务器时不必将区域添加到从服务器?

bind dns-zone
  • 9 9 个回答
  • 21163 Views

9 个回答

  • Voted
  1. Knobee
    2010-10-27T04:42:17+08:002010-10-27T04:42:17+08:00

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

    • 14
  2. Daniel Lawson
    2009-08-30T15:02:22+08:002009-08-30T15:02:22+08:00

    如果您使用的是平面文件后端,我不知道有任何方法可以在本机上执行此操作。有各种由数据库支持的系统可以帮助实现自动化。或者你可以编写脚本:

    我用区域列表和区域的主要 NS IP 填充一个文本文件,并将其粘贴在我允许我的奴隶访问的网站上。slaves 周期性地获取这个文件,如果它已经改变,他们会解析它生成一个 named.conf,并告诉 bind 重新加载配置。它是“自动的”,因为我不必手动 ssh 到我的辅助服务器并更新配置,但它仍然在 bind9 外部。

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

    • 4
  3. Tim Howland
    2009-08-30T18:48:36+08:002009-08-30T18:48:36+08:00

    也许您正在寻找像Puppet或CFEngine 这样的配置管理系统?涉及额外的基础设施,但他们可以处理分发大量配置内容,并且也可以轻松包含这些内容。

    • 4
  4. John Gardeniers
    2009-08-30T17:41:19+08:002009-08-30T17:41:19+08:00

    Bind 自己做不到。更重要的是,让它这样做是不可取的。在许多情况下,任何给定的从站都应该只复制某些域。

    • 2
  5. easel
    2009-08-30T17:34:31+08:002009-08-30T17:34:31+08:00

    如果您正确编写区域并确保named.conf 位于/var/named 中,则在整个/var/named 树上使用rsync 效果会非常好。但是,它不适用于动态更新,并且与“应该如何做”的方式相悖。

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

    在每个人和他们的妈妈都拥有自己的域的日子里,令我惊讶的是,现在还没有一个很好的解决方案来与 Bind 集成 =/

    • 1
  6. Greeblesnort
    2009-08-30T20:44:16+08:002009-08-30T20:44:16+08:00

    我第二(或第三)以上建议检查 Puppet 或 CFEngine。此外,您可以查看将文件签入和签出 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
  7. Best Answer
    Pablo
    2009-09-13T01:16:00+08:002009-09-13T01:16:00+08:00

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

    • 0
  8. naught101
    2009-12-02T22:07:01+08:002009-12-02T22:07:01+08:00
    1. 创建一个脚本以从主服务器中提取所有区域文件名(ls -1 将完成大部分操作)。
    2. 在从站上创建一个脚本,它将区域文件列表作为输入,并从该列表中创建一个 named.conf.local(格式非常简单),并替换现有的 named.conf.local(您可以使用另一个名称,如果您想安全起见,请从 named.conf.local 中包含它)
    3. 在从站上为“rndc reload”创建一个单命令无密码 sudo 访问。
    4. 创建一个一次性 ssh 密钥,允许您从主服务器发送区域列表,并将其通过管道传输到从属脚本,然后运行“sudo rndc reload”。您现在可以将区域从主设备推送到从设备。
    5. (可选)创建一个 cron 作业来每天推送区域,或者任何时候。

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

    • 0
  9. BobMorley
    2018-07-27T04:30:45+08:002018-07-27T04:30:45+08:00

    这是主服务器可以运行以创建列表的一些 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);
    }}
    
    }
    

    “区域”目录需要是可写的

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

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

    */10 * * * * /home/bob/dns_sync.sh
    
    • 0

相关问题

  • 配置仅在短时间内缓存的本地 DNS 解析器

  • BIND 服务器无法解析 us3.php.net!

  • DNS - 有什么方法可以强制名称服务器更新域的记录?

  • BIND/Named:禁用递归,客户端使用替代服务器

  • DR 站点中 Windows 域的 BIND

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve