sing-box 升级 1.13/1.14 后 DNS 起不来?旧配置格式迁移与排错实战

sing-box 升级 1.13/1.14 后 DNS 起不来?旧配置格式迁移与排错实战

先说背景:这篇讲什么

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 的内核适配更新说明。