Sing-box配置报错与常见规则解析失败排查指南
[!IMPORTANT] 【快速回答】 作为新一代通用通用网络核心,Sing-box 性能极高且支持全协议(包括 Hysteria 2、TUIC、VLESS Reality 等),但由于其配置文件采用了极其严格的 JSON 格式规范,只要有一个标点符号错误就会直接拒绝启动。
最常见的三大致命报错:
- JSON 语法错误:结尾多了逗号
,、双引号未闭合或括号不匹配;- 标签不存在(Outbound not found):路由规则(
route.rules)里指定走某个出站(如"outbound": "proxy"),但在outbounds数组中该标签的拼写不一致或漏写;- 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 严格得多(不能有多余逗号,必须全部使用英文双引号):
- 常见语法陷阱:
- ❌ 末尾逗号(Trailing Comma):JSON 数组或对象的最后一个元素绝对不能有逗号;
- ❌ 单引号替代双引号:所有 key 和 string 必须用
"包裹,绝对不能用'; - ❌ 中文标点:不小心输入了中文全角逗号
,或冒号:;
- 使用在线校验工具:
- 打开 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 规则集机制。配置错误通常出现在格式定义上:
- 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"
}
]
}
}
- 核心排错要点:
- 如果
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.1或cloudflare-dns.com本身,否则会产生“为了连 DNS 必须先解析 DNS”的死循环。
步骤五:通过 sing-box check 命令行工具进行语法验证
无需频繁重启客户端软件,在本地直接使用官方二进制命令行进行自检:
- 打开终端(CMD / PowerShell / Terminal);
- 运行以下校验命令:
sing-box check -c ./config.json
- 输出分析:
- 若返回为空或无报错提示,说明当前配置文件完全符合规范,可以安全启动;
- 若存在错误,控制台会输出类似:
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. 路由出站 | 搜索配置文件中所有的 outbound 与 tag |
每一个引用均有定义 | 提示 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 避免递归死锁]
【仍然无法解决】进阶方案
- 使用可视化配置生成器构建标准模板:
- 手写复杂 JSON 极易产生疏漏,建议使用 Sing-box 官方 Web 配置生成器或第三方前端(如
Sing-box Configuration Builder)生成干净的基础骨架;
- 手写复杂 JSON 极易产生疏漏,建议使用 Sing-box 官方 Web 配置生成器或第三方前端(如
- 升级 Sing-box 至最新稳定版本:
- Sing-box 迭代节奏极快,部分新特性(如全新的
clash_mode、rule_set结构)在旧版本内核中无法被识别为合法字段; - 确保客户端与 Core 核心版本保持同步更新。
- Sing-box 迭代节奏极快,部分新特性(如全新的
【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
}
【相关阅读】
- Clash节点Timeout/握手超时怎么办?5步深度排查与修复方案
- Clash TUN虚拟网卡模式怎么开启?解决游戏与UWP应用无法代理教程
- DNS污染与DNS泄漏怎么排查?如何彻底配置防污染DNS?
- VLESS、VMess、Trojan、Shadowsocks 协议对比与选择
【服务选择指南】
针对使用 Sing-box 的进阶用户,在选择机场订阅时的核心考量:
- 原生 Sing-box 订阅支持:优先选择提供原生 Sing-box JSON 订阅分发或支持 Clash/Sing-box 双格式转换的服务商,省去繁琐的手动转换步骤;
- 前沿协议完整覆盖:Sing-box 在 Hysteria 2、TUIC v5 及 VLESS-Reality 协议上性能极为出众,选择具备这些前沿协议的专线服务商可最大化发挥其核心优势。