5月28日 01:47

什么是 DNS 区域传输(AXFR/IXFR)?

DNS 区域传输(Zone Transfer)是主从 DNS 服务器之间同步区域数据的核心机制。主服务器(Master)将完整的区域文件或增量变更推送给从服务器(Slave),保证所有权威服务器数据一致。理解区域传输是运维和网络面试的高频考点。

AXFR:全量区域传输

AXFR 传输完整的区域文件,从服务器收到的是一份全量副本。

触发场景:从服务器首次加入集群、Serial 回绕、或主服务器无法提供增量数据时。

传输流程:

  1. 从服务器向主服务器发送 AXFR 请求(TCP 53 端口)
  2. 主服务器校验权限后,先发送 SOA 记录
  3. 依次发送所有资源记录(A、CNAME、MX、NS 等)
  4. 再次发送 SOA 记录作为结束标记
  5. 从服务器验证完整性后替换本地数据

为什么用 TCP? 区域传输数据量可能远超单个 UDP 报文的 512 字节限制,且传输必须可靠,所以 AXFR 固定使用 TCP。

IXFR:增量区域传输

IXFR 只传输自上次同步以来变更的记录,是日常同步的首选方式。

触发条件:从服务器的 SOA Serial 小于主服务器时,且主服务器保存了变更日志。

传输流程:

  1. 从服务器发送 IXFR 请求,携带当前 SOA Serial
  2. 主服务器比较 Serial,相同则返回 SOA(无需更新)
  3. Serial 不同时,主服务器发送增量变更(新增 + 删除的记录对)
  4. 以 SOA 记录结束
  5. 从服务器按序应用变更

与 AXFR 的关键区别:IXFR 数据量小、同步快、带宽占用低,但要求主服务器维护变更历史。如果变更日志不足,会降级为 AXFR。

SOA Serial:版本判断的依据

SOA 记录中的 Serial 字段是区域文件的版本号,从服务器通过比较 Serial 决定是否发起传输。

dns
example.com. 3600 IN SOA ns1.example.com. admin.example.com. ( 2024010101 ; Serial 3600 ; Refresh - 从服务器检查间隔 1800 ; Retry - 刷新失败重试间隔 604800 ; Expire - 数据过期时间 86400 ) ; Minimum TTL

Serial 常见格式:

格式示例说明
YYYYMMDDNN2024010101年月日+当日序号,最常用
Unix 时间戳1704067200简单但可读性差
自定义递增1001小规模场景可用

比较规则:从服务器发现主服务器 Serial 更大,就发起传输。Serial 必须严格递增,回退会导致从服务器不更新。

区域传输配置实践

主服务器配置

bind
zone "example.com" { type master; file "/etc/bind/db.example.com"; allow-transfer { 192.0.2.10; // 从服务器 1 192.0.2.11; // 从服务器 2 key tsig-key; // TSIG 认证 }; also-notify { 192.0.2.10; 192.0.2.11; }; };

从服务器配置

bind
zone "example.com" { type slave; file "/etc/bind/db.example.com.slave"; masters { 192.0.2.1; }; allow-notify { 192.0.2.1; }; };

TSIG 认证

TSIG 用共享密钥对传输报文做 HMAC 签名,防止未授权服务器窃取区域数据。

bash
# 生成密钥 dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST -T KEY tsig-key

主从服务器配置相同的 key 名称和 secret,传输时自动签名验证。生产环境强烈建议启用 TSIG。

NOTIFY 机制:被动轮询到主动推送

传统模式下从服务器按 Refresh 间隔轮询主服务器,延迟较大。NOTIFY 让主服务器在区域变更后主动通知从服务器,从服务器收到通知后立即发起传输。

优势:变更传播延迟从分钟级降到秒级,减少无效轮询。

安全风险与防护

区域传输泄露是经典安全漏洞。如果 allow-transfer 未限制,任何人都可以用 dig axfr @target domain.com 获取完整区域数据,暴露内部主机名和 IP 映射。

防护措施:

  • 严格配置 allow-transfer,只允许已知从服务器
  • 启用 TSIG 认证,防止 IP 伪造
  • 在边界防火墙限制 TCP 53 端口的外部访问
  • 定期审计区域传输日志,检测异常请求

监控与排障

检查 Serial 一致性:

bash
dig @master SOA example.com +short dig @slave SOA example.com +short # 两者 Serial 应相同,否则传输可能失败

查看传输日志:

bash
tail -f /var/log/syslog | grep -E "AXFR|IXFR|transfer"

常见问题:

  • Serial 未更新:修改记录后忘记递增 Serial,从服务器永远不会拉取新数据
  • allow-transfer 阻断:从服务器 IP 未加入白名单
  • 防火墙拦截:TCP 53 被防火墙阻断,AXFR 无法完成
  • TSIG 密钥不匹配:主从配置的 secret 不一致

面试核心问答

Q: AXFR 和 IXFR 的区别?

AXFR 传完整区域,数据量大,用 TCP,适合首次同步;IXFR 只传增量变更,数据量小,日常同步首选。当主服务器无法提供增量数据时,IXFR 会降级为 AXFR。

Q: 区域传输为什么用 TCP?

传输数据量可能远超 UDP 512 字节限制,且需要保证数据完整可靠到达,TCP 的有序交付和重传机制满足这一需求。

Q: 如何防止区域传输被恶意利用?

配置 allow-transfer 白名单限制可传输的 IP,启用 TSIG 认证防止伪造,在边界防火墙封堵外部 TCP 53 访问,并审计传输日志。

Q: Serial 不递增会怎样?

从服务器比较后发现 Serial 未变大,不会发起传输,修改内容永远不会同步到从服务器。这是运维中常见的疏忽。

Q: NOTIFY 解决了什么问题?

将同步模式从被动轮询变为主动推送,主服务器变更后立即通知从服务器,大幅缩短传播延迟。

标签:DNS