Skip to content

06 - 运行模式详解 ​

TDNS 支持四种运行模式,通过 server.mode 配置项一键切换。不同模式决定查询的处理路径和适用场景。


四种模式对比 ​

模式配置值权威应答递归解析上游转发典型场景
递归模式recursive否是可选企业出口 DNS、家庭网关
权威模式authoritative是否否公网权威 DNS、CDN/GSLB
转发模式forwarder否否是安全网关、内网 DNS 转发
混合模式hybrid是是可选内网解析服务、K8s 集群 DNS

混合模式(hybrid)是默认模式,适合大多数场景。

模式选择遇到困难?能直连根服务器选 recursive,不能就选 forwarder,要管自己的域名加 authoritative,又想内部权威又想外部解析就用 hybrid。


查询路由逻辑 ​

无论哪种模式,TDNS 的查询处理遵循统一的流水线:

1. ACL 检查 (allow-query)
   ↓ 不通过 → REFUSED
2. 缓存查找
   ↓ 命中 → 返回缓存结果
3. 权威区域查找 ← 仅 authoritative / hybrid 模式执行
   ↓ 命中 → 返回权威答案 (AA=1)
4. RD 标志 + 递归 ACL 检查 (allow-recursion)
   ↓ 无 RD 或 ACL 拒绝 → REFUSED
5. 转发器尝试 ← 有上游转发器时
   ↓ 成功 → 缓存 + 返回
6. 递归解析器尝试 ← recursive / hybrid 模式且有 root hints
   ↓ 成功 → 缓存 + 返回
   ↓ 失败 → Serving Stale 或 SERVFAIL + EDE

不同模式的差异在于步骤 3、5、6 是否执行:

步骤recursiveauthoritativeforwarderhybrid
3. 权威查找跳过执行跳过执行
5. 转发器可用时执行不执行执行可用时执行
6. 递归解析执行不执行不执行执行

递归模式(recursive) ​

工作原理:从根服务器开始逐级迭代解析,不依赖上游递归服务器。需要 root.hints 根提示文件。

适用场景:企业出口 DNS、家庭网络网关、需要完整解析链路控制的环境。

toml
[server]
mode = "recursive"

[recursion]
enabled = true
query-timeout = "5s"
max-concurrent-queries = 10000

[cache]
max-size = "1GB"
stale-ttl = 3600  # 上游故障时返回过期缓存(RFC 8767)

[access-control]
allow-recursion = ["trusted"]  # 必填!

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

依赖条件:需要 root.hints 文件,否则递归功能不可用(服务器仍可启动,但递归查询返回 SERVFAIL)。需要公网出站 53 端口。

验证:

bash
# 确认 root.hints 存在
ls -la /etc/tdns/root.hints

# 测试递归解析
dig @127.0.0.1 www.google.com

# 测试根服务器连通性
dig @198.41.0.4 . NS +time=5

详细使用见 08-递归解析服务


权威模式(authoritative) ​

工作原理:仅应答自身管理区域的查询,不提供递归服务。对所有非权威查询返回 REFUSED。

适用场景:公网权威 DNS、CDN/GSLB 流量分发、自有域名解析服务、内网域名权威服务。

toml
[server]
mode = "authoritative"

[[zones]]
name = "example.com"
file = "/etc/tdns/zones/example.com.zone"
type = "master"

[access-control]
allow-query = ["any"]        # 公网可查
allow-recursion = ["none"]   # 不提供递归

验证:

bash
# 查询权威区域
dig @127.0.0.1 example.com SOA
dig @127.0.0.1 www.example.com A

# 查询非权威域名(应返回 REFUSED)
dig @127.0.0.1 www.google.com

详细使用见 07-权威DNS服务


转发模式(forwarder) ​

工作原理:将所有未命中缓存的查询转发到配置的上游 DNS 服务器,自身不执行递归解析。支持条件转发和负载均衡。

适用场景:安全网关 DNS、内网 DNS 出口、条件转发(分域名路由)、网络受限无法直连根服务器的环境。

toml
[server]
mode = "forwarder"

[recursion]
enabled = false          # 转发模式不需要递归

# 全局转发
[[forwarders]]
addr = "8.8.8.8"
port = 53
priority = 1
weight = 1

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

# 条件转发:特定域名转发到指定上游
[[conditional-forwards]]
zone = "internal.corp."
forwarders = ["10.0.0.10", "10.0.0.11"]

验证:

bash
# 测试全局转发
dig @127.0.0.1 www.google.com

# 测试条件转发
dig @127.0.0.1 host.internal.corp

详细使用见 09-转发服务


混合模式(hybrid) ​

工作原理:同一实例同时提供权威服务和递归/转发服务。先查权威区域,未命中时执行递归或转发。默认模式。

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

toml
[server]
mode = "hybrid"

[recursion]
enabled = true

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

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

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

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

验证:

bash
# 内网域名(权威应答)
dig @127.0.0.1 host.internal.example.com

# 外部域名(转发或递归)
dig @127.0.0.1 www.google.com

转发与递归的选择:同时配置了 [[forwarders]] 和 root.hints 时,转发器优先,转发失败后递归兜底。推荐同时配置以实现故障转移。

详细使用见 10-混合模式


模式选择决策矩阵 ​

需求推荐模式
仅解析自有域名,拒绝其他查询authoritative
企业出口 DNS,需直接从根解析recursive
将查询转发到上游,不自行递归forwarder
同时管理自有域名 + 解析外部域名hybrid
K8s 集群 DNShybrid
家庭网关 DNSrecursive 或 hybrid
安全审计 DNS(集中转发)forwarder
公网权威服务authoritative
网络受限无法直连根服务器forwarder
需要内部权威 + 外部解析hybrid

切换模式 ​

改 server.mode 后热重载即可切换:

bash
# 1. 编辑配置
sudo vim /etc/tdns/tdns.toml
# 改 mode = "forwarder"

# 2. 验证配置
tdns --validate --config /etc/tdns/tdns.toml

# 3. 热重载(不中断服务)
sudo systemctl reload tdns
# 或
tdnsctl reload

# 4. 确认状态
tdnsctl status

注意:切换模式后,确保对应模式的必需配置已就绪(如递归模式需 root.hints,转发模式需 [[forwarders]],权威模式需 [[zones]])。