什么是 DNS 区域传输(AXFR/IXFR)?
DNS 区域传输(Zone Transfer)是主从 DNS 服务器之间同步区域数据的核心机制。主服务器(Master)将完整的区域文件或增量变更推送给从服务器(Slave),保证所有权威服务器数据一致。理解区域传输是运维和网络面试的高频考点。
AXFR:全量区域传输
AXFR 传输完整的区域文件,从服务器收到的是一份全量副本。
触发场景:从服务器首次加入集群、Serial 回绕、或主服务器无法提供增量数据时。
传输流程:
- 从服务器向主服务器发送 AXFR 请求(TCP 53 端口)
- 主服务器校验权限后,先发送 SOA 记录
- 依次发送所有资源记录(A、CNAME、MX、NS 等)
- 再次发送 SOA 记录作为结束标记
- 从服务器验证完整性后替换本地数据
为什么用 TCP? 区域传输数据量可能远超单个 UDP 报文的 512 字节限制,且传输必须可靠,所以 AXFR 固定使用 TCP。
IXFR:增量区域传输
IXFR 只传输自上次同步以来变更的记录,是日常同步的首选方式。
触发条件:从服务器的 SOA Serial 小于主服务器时,且主服务器保存了变更日志。
传输流程:
- 从服务器发送 IXFR 请求,携带当前 SOA Serial
- 主服务器比较 Serial,相同则返回 SOA(无需更新)
- Serial 不同时,主服务器发送增量变更(新增 + 删除的记录对)
- 以 SOA 记录结束
- 从服务器按序应用变更
与 AXFR 的关键区别:IXFR 数据量小、同步快、带宽占用低,但要求主服务器维护变更历史。如果变更日志不足,会降级为 AXFR。
SOA Serial:版本判断的依据
SOA 记录中的 Serial 字段是区域文件的版本号,从服务器通过比较 Serial 决定是否发起传输。
dnsexample.com. 3600 IN SOA ns1.example.com. admin.example.com. ( 2024010101 ; Serial 3600 ; Refresh - 从服务器检查间隔 1800 ; Retry - 刷新失败重试间隔 604800 ; Expire - 数据过期时间 86400 ) ; Minimum TTL
Serial 常见格式:
| 格式 | 示例 | 说明 |
|---|---|---|
| YYYYMMDDNN | 2024010101 | 年月日+当日序号,最常用 |
| Unix 时间戳 | 1704067200 | 简单但可读性差 |
| 自定义递增 | 1001 | 小规模场景可用 |
比较规则:从服务器发现主服务器 Serial 更大,就发起传输。Serial 必须严格递增,回退会导致从服务器不更新。
区域传输配置实践
主服务器配置
bindzone "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; }; };
从服务器配置
bindzone "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 一致性:
bashdig @master SOA example.com +short dig @slave SOA example.com +short # 两者 Serial 应相同,否则传输可能失败
查看传输日志:
bashtail -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 解决了什么问题?
将同步模式从被动轮询变为主动推送,主服务器变更后立即通知从服务器,大幅缩短传播延迟。