本文写给第一次遇到 Sing-box 配置报错、不懂 JSON、只想快点修好的朋友。如果你已经是老手,可直接跳到文末「完整配置模板」复制即用。


一、先别慌:你遇到的其实是「版本不认老配置」

如果你的客户端(比如 SFI、ShellCraft、ikwei、Mihomo Party 里跑的 sing-box 内核)某天更新后,突然弹出类似下面的报错:

PLAINTEXT
ERROR[0000] decode config: fail to decode rule_set: unknown field
ERROR[0000] initialize rule-set: load rule-set: invalid format

或者客户端直接闪退、连不上网——这 99% 不是你操作失误,而是 Sing-box 这个工具在 1.8、1.12、1.13、1.14 几次大版本里,悄悄改了配置文件的「写法规矩」。

打个比方:就像你拿着 2015 年的 Word 文档,用最新版 Word 打开时格式乱了。文档没坏,只是「打开方式」变了。

本文目标:不解释枯燥的原理,只带你把旧配置改成新版本认得的样子,10 分钟搞定。


二、三句话搞懂 Sing-box 是什么

  1. Sing-box 是「代理内核」:你手机/电脑上那些叫「SFI」「NekoBox」「ShellCraft」的 app,背后真正干活的引擎就是它。你平时只管填订阅链接,很少直接碰它。
  2. 为什么有人用它:它速度快、省内存,而且原生支持 Reality、Hysteria2、TUIC 这些新协议(简单理解:就是更隐蔽、更不容易被墙发现)。
  3. 配置文件长什么样:一个 .json 文本文件,里面用大括号 {} 一层套一层写规则。你不用自己写,通常是「订阅链接自动生成」,但版本一升级,自动生成的格式也得跟着变

如果你用的是 Clash / Mihomo(另一种内核),本文不适用,但思路类似——也是「版本升级→配置格式变」。


三、动手前,先备好这 3 样东西

你要准备 怎么拿到 用途
① 你的订阅链接 机场后台复制,形如 https://xxx.com/subscribe?token=... 生成新配置用
② 一个文本编辑器 电脑自带「备忘录/记事本」就够,或下载 VS Code 查看和微调配置
③ 旧的配置文件(如果有) 客户端里「导出配置」或文件管理器找 config.json 对照哪些地方要改

最重要的一步——备份! 在改任何东西之前,把现在的配置文件复制一份存好。万一改砸了,还能退回去。


四、三大变化,逐个改(看着吓人,其实就换写法)

Sing-box 升级后,旧配置主要在这 3 个地方「不认了」。我们一个一个改,每个都给你**旧写法(报错)新写法(能用)**对照。

变化 1:规则集从「数据库」变成「.srs 文件」

大白话:以前 Sing-box 要在本地放两个超大文件(geoip.dbgeosite.db)来识别「哪些是国外网站、哪些是国内的」。现在改成从网上下载一个更小更快的 .srs 二进制文件。

比喻:以前是背着一本厚字典查字,现在是手机扫码查——快多了,但写法不一样了。

旧写法(新版会报错)

JSON
{
  "geosite": ["google", "youtube"],
  "outbound": "proxy"
}

新写法(1.12+ 推荐):先在配置里「声明规则集从哪下载」,再在路由里「引用它」:

JSON
{
  "route": {
    "rules": [
      {
        "rule_set": ["geosite-google", "geosite-youtube"],
        "outbound": "proxy"
      }
    ],
    "rule_sets": [
      {
        "tag": "geosite-google",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/google.srs",
        "download_detour": "direct"
      },
      {
        "tag": "geosite-youtube",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/youtube.srs",
        "download_detour": "direct"
      }
    ]
  }
}

小白提示download_detour: direct 意思是「下载这些规则文件时走直连,别走代理」,不然可能死循环卡住。这行一定要留着。

变化 2:DNS 规则被「独立」出去了

大白话:以前你可以在「DNS 设置」里直接写「这个域名用那个服务器解析」。新版本不让这么写了,要求把所有「按域名分流解析」的规则,统一搬到专门的 dns.rules 区域。

旧写法(混在 dns.servers 里,新版报错)

JSON
{
  "dns": {
    "servers": [
      { "tag": "google", "address": "8.8.8.8", "domains": ["geosite:google"] }
    ]
  }
}

新写法(分流规则独立成 dns.rules)

JSON
{
  "dns": {
    "servers": [
      { "tag": "google", "address": "8.8.8.8" },
      { "tag": "local", "address": "223.5.5.5" }
    ],
    "rules": [
      { "rule_set": ["geosite-google"], "server": "google" },
      { "outbound": "direct", "server": "local" }
    ],
    "final": "google"
  }
}

为什么这么改:相当于把「快递分拣规则」和「快递柜」分开管理,逻辑更清楚,也不容易冲突。

变化 3:连接参数被收进 dial

大白话:以前每个「出口」(比如你的代理节点)里,零散写着「开不开 TCP 快速握手」「走哪个网卡」这类连接设置。新版本要求把这些「拨号参数」统一塞进一个叫 dial 的小抽屉里。

旧写法(参数散落在外)

JSON
{
  "type": "shadowsocks",
  "server": "1.2.3.4",
  "tcp_fast_open": true,
  "detour": "interface-eth0"
}

新写法(收进 dial 块)

JSON
{
  "type": "shadowsocks",
  "server": "1.2.3.4",
  "dial": {
    "tcp_fast_open": true,
    "bind_interface": "eth0"
  }
}

如果你是用订阅链接自动生成的配置,这一项通常客户端已经帮你改好了。只有手动写过配置的才需要管。


五、四步无痛迁移法(实操,按顺序来)

下面假设你手里有订阅链接,要从零生成一份新版可用配置。如果你是在改旧配置,对应把上面三处改掉即可。

第 1 步:拿到订阅的「转换链接」

大多数机场后台现在都直接提供「Sing-box 格式」订阅。如果你只有通用订阅,用在线转换工具(如 sub.store 自建、或客户端自带的「订阅转换」)选 Sing-box 1.12+ 格式导出。

小白问:什么是「转换」?就是把机场给的一串通用链接,翻译成 Sing-box 认得的 .json。客户端里点一下就行,不用懂原理。

第 2 步:确认配置里用了 rule_set 而非 geosite

打开生成的 json,搜一下有没有 "geosite":"geoip": 这种写法。如果有,按「变化 1」改成 rule_set + rule_sets 的写法。

第 3 步:检查 DNS 区块

"dns",看里面有没有把域名分流规则直接写在 servers 里。如果有,按「变化 2」挪到 dns.rules

第 4 步:一键验证

把配置导入客户端,点「启动」。如果:


六、完整配置模板(复制即用)

下面是一份精简但完整、新版认得的 Sing-box 1.13/1.14 配置骨架。把 你的订阅 换成你的节点信息来源即可(实际使用时通常由订阅转换工具生成,这里给你看结构):

JSON
{
  "log": { "level": "info" },
  "dns": {
    "servers": [
      { "tag": "remote", "address": "https://1.1.1.1/dns-query" },
      { "tag": "local", "address": "223.5.5.5" }
    ],
    "rules": [
      { "outbound": "direct", "server": "local" }
    ],
    "final": "remote"
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "inet4_address": "172.19.0.1/30"
    }
  ],
  "outbounds": [
    {
      "type": "selector",
      "tag": "proxy",
      "outbounds": ["auto", "direct"]
    },
    {
      "type": "urltest",
      "tag": "auto",
      "outbounds": ["subscription"],
      "url": "https://www.gstatic.com/generate_204",
      "interval": "300s"
    },
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "vless",
      "tag": "subscription",
      "server": "你的节点地址",
      "server_port": 443,
      "uuid": "你的UUID",
      "tls": { "enabled": true, "utls": { "enabled": true, "fingerprint": "chrome" } }
    }
  ],
  "route": {
    "rules": [
      { "rule_set": ["geosite-cn"], "outbound": "direct" },
      { "rule_set": ["geoip-cn"], "outbound": "direct" },
      { "match": "all", "outbound": "proxy" }
    ],
    "rule_sets": [
      {
        "tag": "geosite-cn",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/cn.srs",
        "download_detour": "direct"
      },
      {
        "tag": "geoip-cn",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/cn.srs",
        "download_detour": "direct"
      }
    ],
    "final": "proxy",
    "auto_detect_interface": true
  }
}

注意:上面 subscription 那一项通常是订阅转换工具自动展开成一堆具体节点的,不用手填。你直接用转换工具导出的 json 即可,这里只是让你看懂「一份能用的配置长啥样」。


七、怎么确认「真的成功了」

别只看客户端显示「已连接」就以为好了。请实际验证:

  1. 打开 https://www.google.com —— 能开 = 代理通了
  2. 打开 https://ip.skk.moe —— 显示的 IP 不在国内 = 节点生效
  3. 打开一个国内网站(如 bilibili.com)—— 速度正常、没走代理 = 分流对了
  4. 看客户端日志(log 级别 info)—— 没有红色 ERROR 行 = 配置文件被完整认下了

四步全过,恭喜,迁移彻底成功。


八、常见报错速查表(现象 → 原因 → 解决)

现象(报错关键词) 大概率是 解决办法
unknown field "geosite" 还在用旧的 geosite 写法 按「变化 1」改成 rule_set + rule_sets
load rule-set: invalid format 规则集没下下来 / URL 错了 检查 rule_sets 里的 url 是否能浏览器打开;确认有 download_detour: direct
decode dns: unknown field "domains" DNS 分流规则写错位置 按「变化 2」把 domains 挪到 dns.rules
unknown field "tcp_fast_open" 连接参数没收进 dial 按「变化 3」包进 dial
启动就闪退、无日志 JSON 格式本身错了(少逗号/括号) jsonlint.com 粘贴校验,看哪行红
能连但国内网站变慢 国内流量没走直连 确认 route.rules 里有 geoip-cn / geosite-cndirect

万能排查法:把红色报错那句话整句复制到搜索引擎(加「sing-box」),90% 能直接找到答案。别自己瞎猜。


九、1.13 / 1.14 还有啥新花样?(可选进阶)

如果你已经顺利迁移,新版本还偷偷塞了几个「锦上添花」的功能,了解一下即可,不影响日常使用:


十、一句话总结

Sing-box 升级后老配置报错,不是你错了,是写法规矩变了。 记住三件事:规则集改 .srs、DNS 规则挪 dns.rules、连接参数收 dial 块。用订阅转换工具重新导一份 1.12+ 格式,基本能一键解决;手写的按上面对照表改,10 分钟搞定。

觉得有用就收藏,下次客户端更新炸了直接翻出来对照。有问题看第八节报错表,基本都能自救。


本文基于 Sing-box 1.8 / 1.12 / 1.13 / 1.14-beta(2026-07-23 发布)实测整理。配置语法以你客户端实际内核版本为准,若版本差异较大请以官方 changelog 为准。

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/sing-box-1.12-migration-guide/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。