sing-box 订阅转换后无法使用?先查返回格式与配置校验
简答:先别重复转换:确认订阅返回的是 sing-box JSON,不是 HTML、YAML 或错误页;随后执行核心校验。若校验通过仍无法连接,再检查本地回环地址、内核版本、DNS、路由和节点参数。
定义:sing-box 订阅转换后无法使用,是指转换结果无法导入、配置无法通过核心校验、启动报错,或启动后节点持续超时。
先判断卡在哪一阶段
本文与 sing-box 项目及其开发者无隶属关系。先不要连续更换转换模板,先确认失败发生在下载、导入、启动还是运行阶段。sing-box 配置文件采用 JSON,并提供 check 与 format 命令,具体命令以sing-box 配置文件说明为准。
| 现象 | 先检查什么 | 正常判定 |
|---|---|---|
| 链接打不开、导入为空 | HTTP 响应、返回正文、订阅地址 | 能取得正文,且不是 HTML、登录页、错误提示或 YAML |
| 保存后立即报错 | JSON 语法、字段名、字段类型 | sing-box check 能通过,日志不再出现解析或未知字段错误 |
| 能启动但节点全部 Timeout | DNS、路由、节点域名、端口和 TLS | 至少一个节点能完成解析与连接,不再停留在同一种超时错误 |
| 电脑能加载、手机不能加载 | 转换地址是否为本地回环地址 | 手机访问的是手机可达的远程地址,而不是电脑上的 127.0.0.1 或 localhost |
第一步:确认转换结果确实是 sing-box JSON
- 复制转换后的完整地址,先不要直接导入客户端。
- 在电脑终端执行下面的命令,其中
https://example.com/converted.json只是示例,请替换为你的实际转换地址。
curl -L --fail --show-error --max-time 20 -D headers.txt -o converted.json "https://example.com/converted.json"
-L用于跟随重定向,--fail用于把 HTTP 错误返回为失败,-D保存响应头,-o保存正文。- Windows 10/11、macOS 和多数 Linux 环境通常已有 curl;若终端提示找不到命令,可用浏览器保存响应内容后继续检查。
- macOS/Linux 可执行
head -c 200 converted.json;PowerShell 可执行Get-Content .\converted.json -TotalCount 5。
如果开头是 <html、登录页、验证码、错误文本或 YAML 常见的 proxies:,就不能把它当作 sing-box JSON 配置直接导入。此时应回到转换端核对输入订阅是否仍可访问、输出格式是否选对;转换工具当前是否正常,本文未核实。
如果返回的是 JSON,但只有错误字段、节点列表为空,或明显缺少配置所需的 outbounds,请先保存原始响应,不要直接手改整份配置。sing-box 配置结构可对照sing-box 配置文件说明核验。
第二步:用核心命令区分格式错误与运行错误
把响应文件另存为本地配置,例如 converted.json,然后执行:
sing-box check -c converted.json
官方配置文档列出了 sing-box check 和 sing-box format -w -c config.json 的用法;如果你安装的构建版本不接受 -c,先执行 sing-box check --help,以本机帮助输出为准。相关命令见sing-box 配置文件说明。
- 出现
JSON parse error:检查逗号、引号、括号、注释和重复字段。JSON 文件不能直接保留部分模板语法。 - 出现
unknown field、unknown type或invalid value:记下完整字段名,再查当前核心对应的配置文档,不要把其他客户端字段直接照搬。 - 校验通过:只说明当前核心能够读取基础配置,不代表节点、DNS、路由和 TLS 一定可用,仍需继续运行测试。
为了便于定位行号,可先复制备份,再执行 sing-box format -w -c converted.json。如果该命令在你的版本中参数不同,执行 sing-box format --help,不要覆盖唯一的原始配置。
第三步:检查内核版本与 DNS 字段迁移
如果错误集中在 DNS 字段,先对照sing-box Migration 迁移文档。官方迁移资料说明,旧的 DNS 服务器写法需要改为新的类型化结构,例如旧的 address: local 对应新的 type: local,旧的地址形式也可能需要拆分为 type 与 server。
| 报错线索 | 处理动作 | 复核标准 |
|---|---|---|
legacy DNS、旧 address 写法 | 按迁移文档逐个转换 DNS server 字段 | 重新执行 check 后不再出现同一字段的弃用或解析错误 |
independent_cache | 备份配置后核对是否可以移除 | 配置通过校验,且启动日志不再指向该字段 |
match_response、ip_cidr 组合报错 | 逐项核对 DNS rule、evaluate 与响应匹配顺序 | 启动阶段不再出现规则组合不兼容提示 |
当前 DNS 文档将 independent_cache 标为弃用,并说明后续版本会移除;不要根据其他教程猜测版本行为,应以sing-box DNS 配置说明和迁移文档逐项核对。
查看本机核心版本可执行 sing-box version,再与sing-box 官方发布页中的版本说明对照。版本号、配置字段和迁移结论必须以你实际安装的核心为准。
第四步:配置能启动但所有节点都 Timeout
- 先看 DNS 错误:如果日志出现
lookup timeout、no such host或解析失败,先处理 DNS,不要先批量更换节点。 - 核对节点成组参数:检查服务器域名、端口、协议、TLS 开关、服务器名称和传输参数是否完整,不能把其他格式的字段直接拼接进 sing-box 配置。
- 核对路由标签:检查默认出站、DNS 使用的出站以及规则引用的标签是否真实存在。标签拼写不一致时,可能启动失败或请求未按预期转发。
- 检查系统时间:如果系统时间明显错误,先开启自动校时,再重新测试 TLS 连接。
- 一次只改一个变量:记录修改前后的日志,观察错误是否从 DNS 超时变为 TLS 握手错误,或是否已经能完成 TCP 连接。
如果电脑可以加载而手机不能,先检查转换地址是否包含 127.0.0.1、localhost 或仅电脑可访问的局域网地址。回环地址指向当前设备本身,所以手机访问电脑上的回环地址时不会取得电脑上的内容;应改用手机可访问的远程地址,或在手机端重新获取订阅。
如果配置使用较新的 DNS 规则或出站字段,先以当前核心文档为准,尤其核对 DNS server、DNS rule、路由和出站的字段结构。相关字段可分别参考DNS 配置说明与路由规则说明。
最后复核:保留原始文件再重新导入
- 原始转换响应已保存,并确认不是 HTML、YAML、登录页或错误提示。
- 当前核心能够通过
sing-box check。 - DNS 字段已与当前迁移文档对照,未盲目保留已弃用字段。
- 订阅地址不是仅本机可访问的回环地址。
- 启动日志与运行日志分开判断:启动报错先修配置,Timeout 再查 DNS、路由和节点连接。
- 每次只改一个变量,并保留一份未修改的原始配置,便于回滚。
- 公开排查信息时,删除订阅令牌、节点密码、服务器凭据和完整私密地址。
如果仍无法定位,请整理失败阶段、完整错误行、核心版本、系统平台,以及已脱敏的相关字段。不要只提供“不能用”或客户端状态截图,否则很难区分转换返回错误、配置不兼容和实际连接失败。
常见问题
订阅转换后返回 YAML,sing-box 能直接导入吗?
通常不能直接按 sing-box JSON 配置使用。先确认返回内容;如果出现 proxies、proxy-groups 等 YAML 结构,应重新选择能输出 sing-box JSON 的转换方式,或使用适配该格式的客户端。
为什么配置保存成功,启动时仍然报错?
保存成功只代表客户端接受了文本,不代表核心已经校验通过。把配置导出后执行 sing-box check,再根据完整错误检查 JSON 语法、字段类型、DNS 迁移和核心版本。
电脑能加载订阅,手机却无法使用,先查什么?
先看订阅转换地址是否为 127.0.0.1、localhost 或电脑局域网地址。手机访问这些地址时指向手机自己或不可达设备,应改用手机能访问的远程地址,或在手机端重新获取订阅。
所有节点都显示 Timeout,应该先换节点还是先查配置?
先查配置和网络路径。确认 DNS 能解析、默认出站和规则标签存在、节点域名与端口未被截断,再做单节点测试;如果错误类型发生变化,说明排查可能进入了下一层。