外观
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.103. 验证配置 + 启动
bash
tdns --validate --config /etc/tdns/tdns.toml
sudo systemctl start tdns4. 测试
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 时:
- 在
internal.example.com区域中查找 → 命中则直接返回 AA=1 权威应答 - 未命中(如查
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 时:
- 权威区域返回 CNAME 记录
- 继续递归解析
external.example.org的 A 记录 - 返回完整答案
转发与递归的选择
混合模式同时支持转发和递归。查询路由优先级:
转发器优先 → 递归解析兜底| 条件 | 行为 |
|---|---|
配置了 [[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.workers | CPU 核心数 | 0 = 自动检测 |
cache.max-size | "2GB" ~ "4GB" | 混合模式下缓存压力大 |
cache.prefetch-enabled | true | 预热热门外部域名 |
recursion.max-concurrent-queries | 10000 ~ 20000 | 并发递归限制 |
recursion.query-timeout | "5s" | 递归超时 |