BIND9 Secondary DNS从服务器仅同步部分区域文件如何全量同步
从节点仅能同步部分Zone的核心诱因通常有三类:主服务器部分Zone未开放传输权限、节点防火墙未放通Zone传输所需的TCP 53端口、从节点手动逐Zone配置存在遗漏。以下是Ubuntu 18.04.6环境下验证可用的全量同步配置方法:
1. 主服务器侧全局配置(避免逐Zone配权限漏项)
BIND配置文件默认路径为/etc/bind/named.conf.options,直接在options段配置全局传输规则,所有Zone默认继承该配置,无需单独给每个Zone加规则:
options { directory "/var/cache/bind"; dnssec-validation auto; listen-on { any; }; listen-on-v6 { any; }; // 替换为你的从节点IP,全局允许该IP拉取所有Zone allow-transfer { 10.0.0.2; }; // Zone变更时主动通知从节点触发同步,不用等从节点按刷新周期轮询 also-notify { 10.0.0.2; }; notify yes; };
注意:如果之前给单个Zone单独配置过
allow-transfer规则,该规则优先级高于全局配置,需要逐段检查删掉重复配置,或者统一补上从节点IP,避免部分Zone权限缺失。
配置完成后先做语法校验,无报错再重启服务:
named-checkconf systemctl restart bind9
2. 防火墙规则校验
Zone传输默认走TCP 53端口,普通DNS查询走UDP 53,很多部署场景只放通了UDP 53,会导致响应包超过512字节的大Zone同步失败,仅小Zone能正常拉取。需要在主从节点的本地防火墙、云平台安全组同时放通双向TCP/UDP 53端口。
3. 从节点侧配置(无需逐Zone手动声明)
Ubuntu 18.04默认源搭载的BIND 9.11版本支持动态Zone接收,先在/etc/bind/named.conf.options的options段开启权限:
options { directory "/var/cache/bind"; dnssec-validation auto; listen-on { any; }; listen-on-v6 { any; }; allow-new-zones yes; // 允许自动接收主节点同步的Zone,无需手动写Zone配置段 };
为避免IP伪造的非法Zone传输,建议配置TSIG密钥做传输认证:
- 在主节点生成同步专用密钥:
rndc-confgen -a -c /etc/bind/zone-sync.key -n zone -k sync-key chown bind:bind /etc/bind/zone-sync.key chmod 640 /etc/bind/zone-sync.key
- 将生成的
zone-sync.key文件拷贝到从节点的/etc/bind/目录,保持相同的属主和权限。 - 在主从节点的
/etc/bind/named.conf顶部添加密钥引入配置:
include "/etc/bind/zone-sync.key";
- 将主节点全局配置中的
allow-transfer段修改为密钥+IP双重校验:
allow-transfer { key sync-key; 10.0.0.2; };
配置完成后在从节点执行命令触发全量同步:
named-checkconf systemctl restart bind9 rndc reconfig rndc refresh *
4. 同步结果验证
在从节点执行以下命令查看已同步的Zone列表:
ls /var/cache/bind/ | grep ".zone" // 查看本地缓存的Zone文件 rndc zonestatus | grep "zone:" // 查看BIND运行中加载的Zone
如果仍有个别Zone同步失败,直接查看系统日志定位具体原因:
grep named /var/log/syslog | grep -i "transfer\|error"
常见报错原因包括主节点对应Zone的SOA序列号未递增、主节点Zone文件语法错误、网络链路丢包。
内容的提问来源于stack exchange,提问作者user2958548

