Skip to content

10 - 混合模式 ​

概述 ​

混合模式(hybrid)是 TDNS 的默认运行模式,同一实例同时提供权威服务和递归/转发服务。客户端查询先匹配本地权威区域,未命中时执行递归解析或转发到上游。

适用场景:内网 DNS 综合服务、K8s 集群 DNS、企业内部 DNS、开发测试环境。


快速上手:四步跑通混合模式 ​

1. 配置 ​

toml
# /etc/tdns/tdns.toml
[server]
mode = "hybrid"
listen-addrs = ["0.0.0.0", "::"]
listen-port = 53
workers = 0                # 自动检测 CPU 核心数

[recursion]
enabled = true
query-timeout = "5s"
max-depth = 16

[cache]
enabled = true
max-size = "1GB"
min-ttl = 60
max-ttl = 86400
negative-ttl = 300
stale-ttl = 3600

# 内部域名权威区域
[[zones]]
name = "internal.example.com"
file = "/etc/tdns/zones/internal.example.com.zone"
type = "master"

# 外部域名转发(可选,替代递归)
[[forwarders]]
addr = "8.8.8.8"
port = 53
priority = 1
weight = 1

[[forwarders]]
addr = "1.1.1.1"
port = 53
priority = 1
weight = 1

[access-control]
allow-query = ["trusted"]
allow-recursion = ["trusted"]
allow-transfer = ["management"]

[acl.trusted]
addresses = ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]

[acl.management]
addresses = ["127.0.0.1", "10.0.0.100"]

2. 编写 Zone 文件 ​

text
; /etc/tdns/zones/internal.example.com.zone
$TTL 3600
@       IN  SOA ns1.internal.example.com. admin.internal.example.com. (
            2026081001  ; Serial
            3600        ; Refresh
            1800        ; Retry
            604800      ; Expire
            86400 )     ; Minimum TTL

        IN  NS  ns1.internal.example.com.
ns1     IN  A   10.0.0.53

; 内部服务
web     IN  A   10.0.10.10
api     IN  A   10.0.10.20
db      IN  A   10.0.20.10

3. 验证配置 + 启动 ​

bash
tdns --validate --config /etc/tdns/tdns.toml
sudo systemctl start tdns

4. 测试 ​

bash
# 内网域名(权威应答,AA=1)
dig @127.0.0.1 web.internal.example.com

# 外部域名(转发到上游或递归解析)
dig @127.0.0.1 www.google.com

查询处理流程 ​

客户端查询 www.example.com A (RD=1)
    │
    ▼
1. ACL 检查 (allow-query)
    ↓ 不通过 → REFUSED
    │
    ▼
2. 缓存查找
    ↓ 命中 → 返回缓存结果
    │
    ▼
3. 权威区域查找 ← 先匹配本地区域
    ↓ 命中 → 返回权威答案 (AA=1)
    │
    ▼
4. RD 标志 + 递归 ACL 检查 (allow-recursion)
    ↓ 无 RD 或 ACL 拒绝 → REFUSED
    │
    ▼
5. 转发器尝试(如配置了 forwarders)
    ↓ 成功 → 缓存 + 返回
    │
    ▼
6. 递归解析器尝试(如配置了 root hints)
    ↓ 成功 → 缓存 + 返回
    ↓ 失败 → Serving Stale 或 SERVFAIL + EDE

混合模式的核心优势:自有域名在本地权威应答(低延迟),外部域名通过递归或转发解析(全可达)。


权威与递归的协同 ​

区域优先 ​

混合模式下,权威区域的优先级最高。查询 www.internal.example.com 时:

  1. 在 internal.example.com 区域中查找 → 命中则直接返回 AA=1 权威应答
  2. 未命中(如查 www.google.com)→ 进入递归或转发流程

区域间委托 ​

区域中可定义子域 NS 记录实现委托:

text
; internal.example.com.zone
subdept    IN  NS  ns-subdept.internal.example.com.
ns-subdept IN  A   10.0.1.1

查询 host.subdept.internal.example.com 时,返回 Referral 响应(包含子域 NS 和胶水记录)。

CNAME 跨域追踪 ​

权威区域中的 CNAME 指向外部域名时,混合模式可继续递归解析:

text
; internal.example.com.zone
external-link  IN  CNAME  external.example.org.

查询 external-link.internal.example.com 时:

  1. 权威区域返回 CNAME 记录
  2. 继续递归解析 external.example.org 的 A 记录
  3. 返回完整答案

转发与递归的选择 ​

混合模式同时支持转发和递归。查询路由优先级:

转发器优先 → 递归解析兜底
条件行为
配置了 [[forwarders]] 且无 root.hints所有外部查询走转发
配置了 [[forwarders]] 且有 root.hints转发器优先,转发失败后递归兜底
无 [[forwarders]] 但有 root.hints所有外部查询走递归
无 [[forwarders]] 且无 root.hints外部查询返回 SERVFAIL

推荐同时配置转发器和 root.hints,实现故障转移:转发器不可用时自动切换到递归解析。


典型部署场景 ​

K8s 集群 DNS ​

toml
[server]
mode = "hybrid"
listen-port = 53

[recursion]
enabled = true

# 集群内部服务发现区域
[[zones]]
name = "cluster.local"
file = "/etc/tdns/zones/cluster.local.zone"
type = "master"

# 集群外部域名转发到上游
[[forwarders]]
addr = "8.8.8.8"
port = 53
priority = 1
weight = 1

[cache]
max-size = "512MB"
prefetch-enabled = true

[access-control]
allow-query = ["any"]
allow-recursion = ["any"]

开发测试环境 ​

toml
[server]
mode = "hybrid"
listen-port = 5353          # 非特权端口,无需 root
log-level = "debug"
log-format = "text"

[recursion]
enabled = true

# 测试域名
[[zones]]
name = "test.local"
file = "/etc/tdns/zones/test.local.zone"
type = "master"

# 无转发器,仅递归解析外部域名

[access-control]
allow-query = ["any"]
allow-recursion = ["any"]

缓存策略 ​

混合模式下,权威应答和递归/转发结果使用不同缓存策略:

响应类型缓存行为TTL 来源
权威应答 (AA=1)可缓存Zone 文件中的 TTL
递归结果缓存(受 min-ttl/max-ttl 约束)上游响应 TTL
转发结果缓存(受 min-ttl/max-ttl 约束)上游响应 TTL
负缓存 (NXDOMAIN/NODATA)缓存negative-ttl

典型部署拓扑 ​

                ┌─────────────────┐
                │   TDNS (hybrid)  │
内网客户端 ───→ │  权威+递归+转发  │ ────→ 上游 DNS (8.8.8.8)
                │                 │ ────→ 根服务器 (递归兜底)
                └────────┬────────┘
                         │
                ┌────────┴────────┐
                │  权威区域数据    │
                │  internal.local │
                │  cluster.local  │
                │  rev zones      │
                └─────────────────┘
  • 内网客户端查询 host.internal.local → 权威应答(AA=1)
  • 内网客户端查询 www.google.com → 转发到上游或递归解析
  • 外部客户端查询 → ACL 拒绝(REFUSED)

性能建议 ​

toml
# 高负载混合模式推荐配置
[server]
workers = 0                     # 自动检测

[cache]
max-size = "2GB"               # 混合模式下缓存压力大
prefetch-enabled = true        # 预热热门外部域名

[recursion]
max-concurrent-queries = 20000 # 高并发递归
query-timeout = "5s"
参数建议值说明
server.workersCPU 核心数0 = 自动检测
cache.max-size"2GB" ~ "4GB"混合模式下缓存压力大
cache.prefetch-enabledtrue预热热门外部域名
recursion.max-concurrent-queries10000 ~ 20000并发递归限制
recursion.query-timeout"5s"递归超时