BIND DNS 服务器搭建完全教程 / 第 09 章:辅助服务器与区域传输
本章概述
辅助服务器(Secondary Server)通过区域传输(Zone Transfer)从主服务器同步 DNS 数据,提供冗余和负载分担。本章讲解主从架构、AXFR/IXFR 传输方式、TSIG 保护和故障排查。
9.1 主从 DNS 架构
9.1.1 为什么需要辅助服务器
| 问题 | 单主服务器的风险 | 多服务器方案 |
|---|
| 单点故障 | 服务器宕机 → DNS 不可用 | 辅助服务器接管 |
| 性能瓶颈 | 高流量 → 查询延迟 | 多服务器负载分担 |
| 地理延迟 | 远距离 → 响应慢 | 就近部署辅助服务器 |
| 容灾 | 数据中心故障 → 完全不可用 | 跨数据中心部署 |
9.1.2 主从服务器角色
| 角色 | 配置类型 | 数据来源 | 可编辑 |
|---|
| 主(Primary/Master) | type primary | 本地区域文件 | ✅ |
| 从(Secondary/Slave) | type secondary | 区域传输 | ❌(只读) |
9.1.3 典型架构
┌──────────────────┐
│ 注册商 NS 记录 │
└────────┬─────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ 主 DNS │ │ 从 DNS 1 │ │ 从 DNS 2 │
│ (北京) │ │ (上海) │ │ (广州) │
│ 192.168.1.10│ │ 192.168.2.10│ │ 192.168.3.10│
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└─────────────────┼─────────────────┘
│ 区域传输 (AXFR/IXFR)
│ TSIG 保护
▼
┌──────────────────┐
│ 区域数据同步 │
└──────────────────┘
9.2 配置主服务器
9.2.1 主服务器配置
// named.conf (主服务器)
// TSIG 密钥用于区域传输认证
key "transfer-key" {
algorithm hmac-sha256;
secret "transfer-secret-base64-here";
};
acl "secondary-servers" {
192.168.1.11; // 从服务器 1
192.168.2.10; // 从服务器 2
192.168.3.10; // 从服务器 3
};
zone "example.com" {
type primary;
file "primary/example.com.zone";
// 允许区域传输的服务器
allow-transfer {
key transfer-key; // 优先使用 TSIG 认证
// secondary-servers; // 也可以用 IP
};
// 通知从服务器更新
also-notify {
192.168.1.11;
192.168.2.10;
192.168.3.10;
};
// 或者自动通知所有 NS 记录(默认行为)
// notify yes; // 默认值
};
9.2.2 notify 机制
// notify 控制主服务器何时通知从服务器
zone "example.com" {
type primary;
file "primary/example.com.zone";
// notify 模式
notify yes; // 通知所有 NS 记录中的服务器(默认)
// notify explicit; // 仅通知 also-notify 中的服务器
// notify no; // 不通知(不推荐)
also-notify {
192.168.1.11;
};
};
| 模式 | 行为 | 适用场景 |
|---|
yes(默认) | 通知所有 NS 记录的服务器 | 标准主从架构 |
explicit | 仅通知 also-notify 列表 | 精确控制 |
no | 不发送通知 | 仅靠轮询(不推荐) |
9.3 配置从服务器
9.3.1 从服务器配置
// named.conf (从服务器)
key "transfer-key" {
algorithm hmac-sha256;
secret "transfer-secret-base64-here";
};
zone "example.com" {
type secondary;
// 主服务器地址
masters {
192.168.1.10 key transfer-key; // 使用 TSIG 认证
};
// 区域文件存储位置
file "secondary/example.com.zone";
// 允许查询
allow-query { any; };
};
9.3.2 从服务器目录结构
# 创建从服务器目录
sudo mkdir -p /var/cache/bind/secondary
sudo chown bind:bind /var/cache/bind/secondary
# 区域文件会自动传输并保存
ls -la /var/cache/bind/secondary/
# example.com.zone ← 自动从主服务器传输
9.3.3 从服务器的行为
启动 → 向主服务器发送 SOA 查询
→ 比较 Serial 号
→ 如果主服务器 Serial 更大 → 发起区域传输
→ 传输完成 → 更新本地文件
→ 定期检查(根据 SOA Refresh)
9.4 区域传输类型
9.4.1 AXFR(Full Zone Transfer)
AXFR 是完整的区域传输,传输整个区域文件。
# 手动触发 AXFR
dig @192.168.1.10 example.com AXFR
# 使用 TSIG 认证的 AXFR
dig @192.168.1.10 example.com AXFR -k /etc/bind/transfer.key
| 特性 | 说明 |
|---|
| 传输内容 | 整个区域文件 |
| 网络开销 | 大(取决于区域大小) |
| 适用场景 | 首次同步、Serial 差距过大 |
| 触发条件 | 从服务器启动、Serial 不匹配 |
9.4.2 IXFR(Incremental Zone Transfer)
IXFR 仅传输变更的记录,大大减少网络流量。
# 手动触发 IXFR(需要指定起始 Serial)
dig @192.168.1.10 example.com IXFR=2026051000
| 特性 | 说明 |
|---|
| 传输内容 | 仅变更的记录(增删) |
| 网络开销 | 小 |
| 适用场景 | 日常更新 |
| 触发条件 | Serial 变化小 |
9.4.3 AXFR vs IXFR
| 维度 | AXFR | IXFR |
|---|
| 数据量 | 整个区域 | 仅变更部分 |
| 速度 | 慢 | 快 |
| 适用 | 首次/大量变更 | 日常少量变更 |
| 回退 | 无 | 如果 IXFR 失败,自动回退到 AXFR |
9.4.4 BIND 的传输策略
// BIND 默认行为:
// 1. 如果从服务器没有区域文件 → AXFR
// 2. 如果 Serial 差距小 → IXFR
// 3. 如果 IXFR 失败或差距太大 → AXFR
// 4. 主服务器保留 IXFR 日志(默认最多保留)
zone "example.com" {
type primary;
file "primary/example.com.zone";
// IXFR 日志大小限制
max-journal-size 100m; // 日志文件最大 100MB
// 禁用 IXFR(强制 AXFR)
// ixfr-from-differences no;
};
9.5 TSIG 保护区域传输
9.5.1 生成传输密钥
# 生成 TSIG 密钥
tsig-keygen -a hmac-sha256 transfer-key > /etc/bind/transfer.key
# 查看密钥
cat /etc/bind/transfer.key
9.5.2 在主从服务器配置
// 主服务器和从服务器使用相同的密钥
// /etc/bind/transfer.key(主从各一份,内容相同)
key "transfer-key" {
algorithm hmac-sha256;
secret "base64-secret-here";
};
// 主服务器配置
zone "example.com" {
type primary;
file "primary/example.com.zone";
allow-transfer { key transfer-key; };
};
// 从服务器配置
zone "example.com" {
type secondary;
masters { 192.168.1.10 key transfer-key; };
file "secondary/example.com.zone";
};
9.5.3 多从服务器独立密钥(推荐)
# 每个从服务器使用不同的密钥
tsig-keygen -a hmac-sha256 transfer-key-slave1 > /etc/bind/transfer-slave1.key
tsig-keygen -a hmac-sha256 transfer-key-slave2 > /etc/bind/transfer-slave2.key
// 主服务器配置
include "/etc/bind/transfer-slave1.key";
include "/etc/bind/transfer-slave2.key";
zone "example.com" {
type primary;
file "primary/example.com.zone";
allow-transfer {
key transfer-key-slave1;
key transfer-key-slave2;
};
also-notify {
192.168.1.11 key transfer-key-slave1;
192.168.2.10 key transfer-key-slave2;
};
};
9.6 Stub Zone
Stub Zone 与 Secondary Zone 类似,但只传输 NS 和 SOA 记录。
// 当需要知道另一个区域的权威服务器时使用
zone "partner.com" {
type stub;
masters { 172.16.1.100; };
file "stub/partner.com.zone"; // 只存储 NS 和 SOA
};
| 类型 | 传输内容 | 使用场景 |
|---|
secondary | 完整区域 | 冗余 DNS |
stub | 仅 NS + SOA | 知道权威服务器位置 |
forward | 无传输 | 条件转发 |
9.7 高级配置
9.7.1 多主服务器架构
// 从服务器可以配置多个主服务器
zone "example.com" {
type secondary;
masters {
192.168.1.10; // 主服务器 1(优先)
192.168.1.12; // 主服务器 2(备选)
};
file "secondary/example.com.zone";
};
9.7.2 从服务器提升为主服务器
# 场景:主服务器永久不可用,需要将从服务器提升
# 1. 修改配置
# 将 type secondary 改为 type primary
zone "example.com" {
type primary; // 从 secondary 改为 primary
file "secondary/example.com.zone";
allow-update { none; }; // 关闭动态更新
};
# 2. 重载配置
rndc reload example.com
# 3. 更新注册商 NS 记录(如果需要)
9.7.3 使用 catalog zone(BIND 9.18+)
Catalog Zone 是一种自动管理从服务器区域列表的方式:
// 主服务器 - catalog zone
zone "catalog.example" {
type primary;
file "primary/catalog.example.zone";
allow-update { key catalog-key; };
};
// 从服务器 - catalog zone
zone "catalog.example" {
type secondary;
masters { 192.168.1.10 key catalog-key; };
file "secondary/catalog.example.zone";
// 启用 catalog zone
catalog-zone "catalog.example" {
default-masters { 192.168.1.10 key catalog-key; };
};
};
9.8 区域传输监控
9.8.1 启用传输日志
logging {
channel transfer_log {
file "/var/log/named/transfer.log" versions 10 size 50m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
category xfer-in { transfer_log; }; // 接收传输
category xfer-out { transfer_log; }; // 发送传输
category notify { transfer_log; }; // 通知事件
};
9.8.2 查看传输状态
# 查看从服务器区域状态
rndc zonestatus example.com
# 输出示例:
# name: example.com
# type: secondary
# files: secondary/example.com.zone
# serial: 2026051001
# nodes: 50
# last successful transfer: 2026-05-10 14:30:00
# 手动触发传输
rndc retransfer example.com # 强制 AXFR
rndc refresh example.com # 检查是否需要更新
# 查看传输日志
tail -f /var/log/named/transfer.log
9.8.3 检查主从一致性
# 比较主从 Serial
dig @192.168.1.10 example.com SOA +short
# ns1.example.com. admin.example.com. 2026051001 3600 900 1209600 86400
dig @192.168.1.11 example.com SOA +short
# 应该显示相同的 Serial
# 比较完整记录
dig @192.168.1.10 example.com AXFR | sort > /tmp/master.txt
dig @192.168.1.11 example.com AXFR | sort > /tmp/slave.txt
diff /tmp/master.txt /tmp/slave.txt
9.9 故障排查
9.9.1 常见问题
| 症状 | 可能原因 | 排查步骤 |
|---|
| 从服务器数据不更新 | Serial 未递增 | 检查主服务器 Serial |
| 传输失败 | TSIG 密钥不匹配 | 比较主从密钥 |
| 传输超时 | 防火墙阻断 TCP 53 | 检查防火墙规则 |
| 从服务器无法启动 | 区域文件损坏 | 删除文件,重新传输 |
| IXFR 失败 | 日志文件损坏 | 强制 AXFR |
9.9.2 排查命令
# 1. 检查主服务器是否允许传输
dig @192.168.1.10 example.com AXFR
# 如果返回 "Transfer failed" → 检查 allow-transfer
# 2. 测试 TSIG 认证
dig @192.168.1.10 example.com AXFR -k /etc/bind/transfer.key
# 3. 检查 TCP 53 端口连通性
nc -zv 192.168.1.10 53
# 4. 查看主服务器日志
tail -f /var/log/named/transfer.log
# 搜索 "transfer" 关键字
# 5. 强制重新传输
rndc retransfer example.com
# 6. 检查从服务器文件权限
ls -la /var/cache/bind/secondary/
9.9.3 区域文件损坏恢复
# 如果从服务器区域文件损坏:
sudo rndc freeze example.com
sudo rm /var/cache/bind/secondary/example.com.zone
sudo rndc thaw example.com
# BIND 会自动重新传输
9.10 本章小结
| 配置项 | 主服务器 | 从服务器 |
|---|
| 区域类型 | type primary | type secondary |
| 数据来源 | 本地文件 | 区域传输 |
| 传输控制 | allow-transfer | masters |
| 通知 | notify, also-notify | 接收 NOTIFY |
| 密钥 | allow-transfer { key ... } | masters { ... key ... } |
| 文件 | 可读写 | 只读 |
💡 小技巧
- 必须使用 TSIG 保护区域传输:防止未授权服务器获取区域数据。
also-notify 加速同步:不等待 SOA Refresh 间隔。- 每个从服务器使用独立密钥:便于审计和撤销。
- 定期检查主从 Serial 一致性:通过监控脚本自动检查。
- IXFR 失败会自动回退到 AXFR:无需手动干预。
📖 扩展阅读