DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
雨云;给项目一台云服务器
RackNerd;$21.99/年 · 1GB KVM

BIND 改了 allow-transfer 仍报 REFUSED:先确认 chroot 内的实际配置

BIND区域传送持续REFUSED时,核对named的chroot和实际配置入口,按相同根目录校验并加载最小授权,不放宽传送权限。

主服务器能回答普通 DNS 查询,secondary 发起区域传送却收到 REFUSED,主服务器日志同时记录 zone transfer ... denied。明明已经修改 allow-transfer,反复加载仍没有变化时,需要确认改的是这个 named 实际读取的配置。

下面针对 BIND 9 的 chroot 部署,命令含义按 BIND 9.20 核对。发行版可能用绑定挂载或服务脚本组织 chroot 文件,不能把某个固定目录当作所有机器的标准路径。REFUSED 也可能来自真正的授权拒绝;只有确认配置路径不一致,才能归到本文这条分支。

日志已经证明请求到达时,先核对配置入口

记录主服务器日志里发起传送的来源地址、区域名,以及 secondary 联系的主服务器地址。普通查询成功只证明查询路径可用,不表示已经获得区域传送权限。allow-query 和 allow-transfer 不是同一项授权。

核对目标 named 的启动参数和服务管理配置:-c 指定配置文件,-t 指定 chroot 目录;未指定 -c 时通常读取 /etc/named.conf。路径必须从进程的根目录解释。

例如,只有实际启动参数采用下面这种组合时:

-t /var/named/chroot -c /etc/named.conf

进程所见的 /etc/named.conf 才对应 chroot 根目录中的那份文件。宿主机上单独的 /etc/named.conf 可能并未被读取。还要查看服务脚本是否把宿主配置挂载进 chroot;两边可能是同一份文件,不能只看路径字符串就重复复制。

容器、多个 named 实例和不同 view 也会影响判断。确保检查的是监听目标地址的那个实例,以及接收该 secondary 请求的配置作用域;另一个 named 的校验和加载成功不能证明目标实例已更新。

在相同根目录下检查文件和 include

以下是与上面启动参数对应的校验示例,路径应替换成实际值:

sudo named-checkconf -t /var/named/chroot /etc/named.conf

-t 让检查时的 include 等路径按同一个 chroot 环境解释。这里的 /etc/named.conf 是 chroot 内路径,不要再给它重复加上宿主机 chroot 前缀。

校验通过只能说明所检查配置的语法等检查没有报错,不能证明运行进程已经加载它,也不能证明所有运行条件都满足。继续核对权限、include 的真实内容和该区域所在的 view。不要公开输出包含 TSIG 密钥的完整配置。

在已经确认的配置中,保留必要的最小授权。例如,仅在原策略就是按固定 secondary 地址授权、且没有额外 TSIG 身份要求时,对应作用域可使用:

allow-transfer { 192.0.2.20; };

192.0.2.20 是示例地址,应替换为日志里确认的合法 secondary 来源地址。已有密钥授权时应保留原身份规则,不用这个地址示例替换它。区域内的 allow-transfer 会覆盖 options 或 view 中的设置,因此还要排除局部规则覆盖。

不要改为 any 来证明“改对了文件”,也不要关闭防火墙或 SELinux。区域传送可能暴露整个区域内容;路径错误应通过配置入口和加载日志确认,而不是靠扩大权限试出来。

加载后从合法 secondary 验证

先备份实际生效的配置及关联 include,再修改已确认的那份文件。校验通过后,使用原有的受控管理方式加载目标实例;如果当前 rndc 已配置为连接这一个实例,可以使用:

sudo rndc reconfig

它重新读取配置并加载新区域,不会因为现有区域文件内容改了就重新加载那些文件。本问题处理的是传送授权配置,不需要冻结动态区域、删除 journal 或重建 secondary 数据。

查看命令返回值和 named 日志,确认重新读取没有失败。然后从合法 secondary 所在环境,使用实际区域和主服务器地址检查传送。仅适用于既有地址授权测试的例子是:

dig @192.0.2.10 example.com. AXFR

有 TSIG 等认证要求时,要沿用原来安全的认证流程;不带认证的测试被拒绝并不能证明已配置的 secondary 同样失败。传送结果包含区域数据,应留在受控环境。再检查正常 secondary 同步是否完成、SOA serial 和预期记录是否一致,不能只根据一次 reconfig 返回成功结案。

若日志仍明确拒绝,应重新核对请求来源、目标实例、view 和授权规则,而不是继续复制同名配置。回退时恢复备份中的实际配置,重新校验并加载同一实例;保留已经有效的区域数据,不靠删除文件迫使全量重传。