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

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

维度AXFRIXFR
数据量整个区域仅变更部分
速度
适用首次/大量变更日常少量变更
回退如果 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 primarytype secondary
数据来源本地文件区域传输
传输控制allow-transfermasters
通知notify, also-notify接收 NOTIFY
密钥allow-transfer { key ... }masters { ... key ... }
文件可读写只读

💡 小技巧

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

📖 扩展阅读