
先说背景:这篇讲什么
sing-box 是一款开源的通用代理内核,被软路由插件、NekoBox 等客户端广泛调用,用一份 JSON 配置同时管出站节点、路由规则和 DNS。它的 DNS 模块决定每个域名走哪台 DNS 解析——配错了,轻则打开网页慢半拍,重则 DNS 泄漏。
如果你最近升级到 1.13/1.14 后 DNS 配置报错、服务起不来,大概率踩中了配置格式变迁:1.12 起官方引入新的 DNS server 写法,1.13/1.14 起旧写法逐渐不再兼容。
变化一:server 写法变了
旧写法(很多 2025 年前的教程都这么教):
{
"tag": "remote",
"address": "tls://dns.google",
"address_resolver": "local",
"address_strategy": "prefer_ipv4",
"strategy": "ipv4_only",
"detour": "proxy"
}
新写法按类型声明字段(以 DNS over TLS 为例):
{
"type": "tls",
"tag": "remote",
"server": "dns.google",
"server_port": 853,
"tls": { "enabled": true },
"domain_resolver": "local",
"domain_strategy": "prefer_ipv4"
}
对照关系:address 里的协议前缀被拆成独立的 type 字段;address_resolver/address_strategy/strategy 改名为 domain_resolver/domain_strategy,顶层与 server 级的旧 strategy 一并被移除——原来靠顶层 strategy 统一指定解析偏好的,要逐个 server 补上 domain_strategy。
变化二:detour 不写就报错
这是升级后最常见的翻车点:旧写法里 detour 可选,不写走默认出站;新格式里 DNS server 的拨号行为和出站看齐,空的 direct 出站会被拒绝,典型报错:
detour to an empty direct outbound makes no sense
修法:每个 DNS server 都显式声明 "detour": "proxy"(走代理)或 "detour": "direct"(直连),不要留空。server 写了域名时(如 dns.google),domain_resolver 不能丢——它是解析 DNS 服务器自身域名的前置 DNS,丢了会鸡生蛋死循环。
常见报错对照表
| 报错关键词 | 含义 | 修法 |
|---|---|---|
unknown field strategy / unknown field address | 旧字段已移除 | 按对照表改成新字段 |
detour to an empty direct outbound makes no sense | 没显式指定出站 | 加 "detour": "proxy" 或 "direct" |
domain_resolver must be set | 域名型 server 缺前置解析 | 加 "domain_resolver": "local" |
| DNS 规则引用的 server tag 不存在 | 迁移时漏了某个 server | 检查 dns.rules[].server 的 tag 是否都在 dns.servers 里 |
迁移实操
先备份,再改写。旧配置里的"国内直连 + 国外经代理 + 拒答"三件套:
"dns": {
"strategy": "prefer_ipv4",
"servers": [
{ "tag": "local", "address": "223.5.5.5", "detour": "direct" },
{ "tag": "remote", "address": "tls://dns.google",
"address_resolver": "local", "detour": "proxy" },
{ "tag": "block", "address": "rcode://refused" }
]
}
改成:
"dns": {
"servers": [
{
"type": "udp", "tag": "local",
"server": "223.5.5.5", "detour": "direct",
"domain_strategy": "prefer_ipv4"
},
{
"type": "tls", "tag": "remote",
"server": "dns.google", "server_port": 853,
"tls": { "enabled": true },
"domain_resolver": "local",
"domain_strategy": "prefer_ipv4",
"detour": "proxy"
},
{ "type": "rcode", "tag": "block", "rcode": "refused" }
]
}
升级前校验:sing-box check -c config.json。通过后启动,看一眼日志里的 DNS 相关 warning,确认国内外域名的解析走向符合预期。
一句话总结
sing-box 的 DNS 配置从"一个 address 字符串包打天下",改成了按类型声明独立字段的新格式。迁移原则:每个 DNS server 都显式写清类型、服务器、解析它的前置 DNS 和要走的出站,然后 sing-box check 验收。
参考:新 DNS server 各类型字段结构见 sing-box DNS 文档(DoT 示例);1.13 迁移背景可见 sing-box-windows 的内核适配更新说明。
