Sing-box配置报错与常见规则解析失败排查指南

[!IMPORTANT] 【快速回答】 作为新一代通用通用网络核心,Sing-box 性能极高且支持全协议(包括 Hysteria 2、TUIC、VLESS Reality 等),但由于其配置文件采用了极其严格的 JSON 格式规范,只要有一个标点符号错误就会直接拒绝启动。

最常见的三大致命报错

  1. JSON 语法错误:结尾多了逗号 ,、双引号未闭合或括号不匹配;
  2. 标签不存在(Outbound not found):路由规则(route.rules)里指定走某个出站(如 "outbound": "proxy"),但在 outbounds 数组中该标签的拼写不一致或漏写;
  3. Rule-set 规则集加载失败:引用了已失效的远程规则链接或 binary 预编译规则版本不匹配。

一键诊断命令:在终端运行 sing-box check -c config.json,核心会立刻输出具体在第几行、缺少什么字段。


【常见原因】报错现象与机理对照表

典型控制台报错 核心诱因 产生位置 严重等级
decode config: invalid character '}' JSON 格式损坏(多余逗号或括号不匹配) 全局 JSON 结构 P0(直接无法启动)
panic: outbound not found: "proxy" 路由规则引用的出站 Tag 标签不存在 route.rules / dns.servers P0
download rule-set [...] failed: 404 远程规则集链接失效或无网络导致下载超时 route.rule_set P1(规则回退或报错)
dns: circular dependency detected DNS 服务器查询依赖自身出站,引发死锁 dns 模块配置 P1(全部域名解析超时)
inbound/tun: configure interface failed 缺少管理员权限或虚拟网卡驱动未就绪 inbounds TUN 模块 P1

【解决方法】5步排查与精准修复

步骤一:排查并修复 JSON 语法错误

JSON 格式要求比 YAML 严格得多(不能有多余逗号,必须全部使用英文双引号):

  1. 常见语法陷阱
    • 末尾逗号(Trailing Comma):JSON 数组或对象的最后一个元素绝对不能有逗号
    • 单引号替代双引号:所有 key 和 string 必须用 " 包裹,绝对不能用 '
    • 中文标点:不小心输入了中文全角逗号 或冒号
  2. 使用在线校验工具
    • 打开 jsonlint.com 或 VS Code 编辑器;
    • 粘贴你的完整配置文件,校验工具会自动标红定位具体出错的行与字符。

步骤二:核对 Inbounds 与 Outbounds 的 Tag 标签精准匹配

在 Sing-box 中,所有数据包的流向都依赖 tag 字符串建立绑定关系:

{
  "outbounds": [
    {
      "type": "selector",
      "tag": "node-select", // 出站标签 1
      "outbounds": ["hk-01", "jp-01"]
    },
    {
      "type": "direct",
      "tag": "direct-out" // 出站标签 2
    },
    {
      "type": "block",
      "tag": "block-out" // 出站标签 3
    }
  ],
  "route": {
    "rules": [
      {
        "rule_set": "geosite-geolocation-cn",
        "outbound": "direct-out" // 必须与 outbounds 中的 tag 一字不差匹配
      },
      {
        "rule_set": "geosite-category-ads-all",
        "outbound": "block-out" // 必须精确匹配
      }
    ],
    "final": "node-select" // 兜底出站也必须存在
  }
}

[!WARNING] 检查 route.rules 中的每一个 "outbound" 以及 "final" 字段,确保所引用的标签在 outbounds 列表中真实存在,区分英文字母大小写


步骤三:正确配置 Rule-set(规则集)与使用 .srs 二进制格式

Sing-box 引入了高性能的 rule_set 规则集机制。配置错误通常出现在格式定义上:

  1. Rule-set 配置范例
{
  "route": {
    "rule_set": [
      {
        "tag": "geosite-geolocation-cn",
        "type": "remote",
        "format": "binary", // 若为 .srs 必须写 binary;若为 .json 必须写 source
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-geolocation-cn.srs",
        "download_detour": "direct-out", // 指定下载该规则集走直连还是代理
        "update_interval": "1d"
      }
    ]
  }
}
  1. 核心排错要点
    • 如果 url 结尾是 .srs 文件,format 必须明确声明为 "binary"
    • 如果 url 结尾是 .json 纯文本,format 必须声明为 "source"
    • download_detour 参数建议指定为 "direct-out"(直连)或已配置好的代理出站,避免在规则未就绪时发生下载死锁。

步骤四:配置 DNS 模块解耦,杜绝递归解析死锁

DNS 解析配置不当会导致客户端无法启动或任何外网域名均无法解析:

{
  "dns": {
    "servers": [
      {
        "tag": "dns-remote",
        "address": "https://1.1.1.1/dns-query",
        "address_resolver": "dns-direct", // 关键:指定用直连 DNS 解析 DoH 域名
        "detour": "node-select"
      },
      {
        "tag": "dns-direct",
        "address": "223.5.5.5",
        "address_resolver": "dns-local",
        "detour": "direct-out"
      },
      {
        "tag": "dns-local",
        "address": "local",
        "detour": "direct-out"
      }
    ],
    "rules": [
      {
        "rule_set": "geosite-geolocation-cn",
        "server": "dns-direct"
      }
    ],
    "final": "dns-remote",
    "strategy": "prefer_ipv4"
  }
}

[!TIP] 当使用 DoH(如 https://1.1.1.1/dns-query)作为远端 DNS 时,必须指定 address_resolver 使用基础 IP DNS(如 223.5.5.5)来解析 1.1.1.1cloudflare-dns.com 本身,否则会产生“为了连 DNS 必须先解析 DNS”的死循环。


步骤五:通过 sing-box check 命令行工具进行语法验证

无需频繁重启客户端软件,在本地直接使用官方二进制命令行进行自检:

  1. 打开终端(CMD / PowerShell / Terminal);
  2. 运行以下校验命令:
sing-box check -c ./config.json
  1. 输出分析
    • 若返回为空或无报错提示,说明当前配置文件完全符合规范,可以安全启动;
    • 若存在错误,控制台会输出类似:
      FATAL[0000] decode config: json: cannot unmarshal string into Go struct field RouteOptions.rules of type []rule at line 48
      直接定位到第 48 行进行修改即可。

【如何判断问题来源】5维排查诊断矩阵

排查维度 诊断操作 正常指标 故障表现与归因
1. 语法结构 运行 sing-box check -c config.json 零输出退出代码 0 输出 decode config failed,JSON 语法损坏
2. 路由出站 搜索配置文件中所有的 outboundtag 每一个引用均有定义 提示 outbound not found,标签名称拼写错误
3. 规则集加载 检查 Sing-box 工作目录下的 rule_set/ 缓存 存在生成的 .srs 缓存 提示 download failed,规则集源地址被墙或 404
4. DNS 解析链 观察运行时的 DNS 日志输出 显示 exchange google.com via dns-remote 提示 address resolver not found 或解析超时死锁
5. 内核版本 运行 sing-box version 查看版本号 与配置参数版本匹配 使用了 v1.8+ 新语法但在旧版 v1.3 内核上运行报错
flowchart TD
    A[Sing-box 报错无法运行] --> B[运行终端命令 sing-box check -c config.json]
    B --> C{是否提示 decode config 报错?}
    C ----> D[使用 JSONLint 检查多余逗号或未闭合括号]
    C ----> E{是否提示 outbound not found?}
    E ----> F[检查 route.rules 中的 outbound 字段与 outbounds tag 是否拼写一致]
    E ----> G{是否提示 download rule-set failed?}
    G ----> H[检查 rule-set URL 可达性, 将 format 调整为 binary/source]
    G ----> I[检查 DNS address_resolver 避免递归死锁]

【仍然无法解决】进阶方案

  1. 使用可视化配置生成器构建标准模板
    • 手写复杂 JSON 极易产生疏漏,建议使用 Sing-box 官方 Web 配置生成器或第三方前端(如 Sing-box Configuration Builder)生成干净的基础骨架;
  2. 升级 Sing-box 至最新稳定版本
    • Sing-box 迭代节奏极快,部分新特性(如全新的 clash_moderule_set 结构)在旧版本内核中无法被识别为合法字段;
    • 确保客户端与 Core 核心版本保持同步更新。

【FAQ 常见疑问】

Q1:Sing-box 的 .srs 二进制规则集相比传统 .json 规则集有什么优势?

.srs(Sing-box Rule Set)是官方专为高性能路由设计的预编译二进制格式。相比于启动时需要由 CPU 逐行解析的大型 .json 文本,.srs 文件体积减少 70% 以上,内存占用极低,且核心加载毫秒级完成,大幅提升客户端启动与匹配效率。

Q2:为什么 Sing-box 相比 Clash 对配置报错更加敏感?

:Clash 的 YAML 解析器相对宽容(会自动忽略不支持的未知字段),而 Sing-box 是基于严格的 Go 结构体反序列化规范设计的,对类型安全、字段合法性有极高的要求,任何未知字段或类型不匹配都会直接拦截报错。这种严格性保证了其运行期极致的高性能与低内存开销。

Q3:如何在 Sing-box 中配置延迟最低的自动选择(URL-Test)策略?

:在 outbounds 中添加一个类型为 "urltest" 的出站即可:

{
  "type": "urltest",
  "tag": "auto-fast",
  "outbounds": ["hk-node-01", "hk-node-02", "jp-node-01"],
  "url": "https://www.gstatic.com/generate_204",
  "interval": "3m",
  "tolerance": 50
}

【相关阅读】


【服务选择指南】

针对使用 Sing-box 的进阶用户,在选择机场订阅时的核心考量:

  1. 原生 Sing-box 订阅支持:优先选择提供原生 Sing-box JSON 订阅分发或支持 Clash/Sing-box 双格式转换的服务商,省去繁琐的手动转换步骤;
  2. 前沿协议完整覆盖:Sing-box 在 Hysteria 2、TUIC v5 及 VLESS-Reality 协议上性能极为出众,选择具备这些前沿协议的专线服务商可最大化发挥其核心优势。