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