强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 ... }
文件 可读写 只读

💡 小技巧

  1. 必须使用 TSIG 保护区域传输:防止未授权服务器获取区域数据。
  2. also-notify 加速同步:不等待 SOA Refresh 间隔。
  3. 每个从服务器使用独立密钥:便于审计和撤销。
  4. 定期检查主从 Serial 一致性:通过监控脚本自动检查。
  5. IXFR 失败会自动回退到 AXFR:无需手动干预。

📖 扩展阅读