订阅链接转 sing-box 配置:sub2sing-box 新版实战与排错

订阅链接转 sing-box 配置:sub2sing-box 新版实战与排错

手里有一堆分享链接(vless://…、trojan://…),但 sing-box 要的是 JSON 配置——手写出站(outbound)既慢又容易错。先补个背景:sing-box 是开源通用代理内核,支持 VLESS、Trojan、Shadowsocks、Hysteria2 等协议,可当服务端节点也可当客户端;分享链接 是类似 trojan://密码@服务器:端口?参数#备注 的 URL,各代理客户端都认,但不是 sing-box 的原生格式;sub2sing-box 是开源小工具(GitHub 项目),专干一件事——把分享链接批量转成 sing-box 能用的 JSON,还能套模板生成带路由、DNS 的完整配置。

2026 年 9 月 24 日,sub2sing-box 合并了一批重要更新:新增 TUIC、SSH、NaïveProxy、HTTP(S) 代理四个解析器,并把含糊的「unknown proxy format」换成了带明确原因的提示。本文基于最新代码实测。

这批更新和 sing-box 1.13/1.14 的语法清理是呼应的——本站文章《sing-box 1.14 升级实战:TUN DNS 接管变了,升级前先看这三件事》讲过 1.14 移除的旧语法;sub2sing-box 的自带模板也同步做了迁移,文末有对照表。

安装:装最新版,别用老 release

小坑:截至本文写作时,sub2sing-box 的 GitHub Releases 最新标签还是 2024 年的 v0.0.6,想用新解析器必须从源码编译最新版:

go install github.com/bestnite/sub2sing-box@latest
sub2sing-box version

另有 Docker 镜像和网页 UI(sub2sing-box server),转换逻辑同一套。

支持的协议:新增的四个最值得看

2026-09-24 的提交补齐了之前缺失的四个解析器。当前支持的分享链接协议:

协议链接格式缺省端口
Shadowsocksss://(SIP002 / SIP008)链接必填
VMessvmess://链接必填
VLESSvless://链接必填
Trojantrojan://链接必填
Hysteriahysteria://链接必填
Hysteria2hysteria2://、hy2://链接必填
TUICtuic://链接必填
AnyTLSanytls://链接必填
SOCKSsocks://、socks5://链接必填
SSHssh://user:password@host:port?private_key=...&host_key=...#备注22
NaïveProxynaive+https://…、naive+quic://…443
HTTP(S) 代理proxy-http://…、proxy-https://…80 / 443

两处设计值得解释:为什么 HTTP 代理用 proxy-http:// 而不是裸 http://? 裸 scheme 会和订阅地址、订阅正文里的推广链接撞车,被误当成节点;proxy- 前缀明确表达「这是 HTTP 代理节点」。SSH 参数里 private_key / host_key 可选,端口缺省 22。

基本用法:两个场景

场景一:几个链接直接转

sub2sing-box convert -t sing-box-template.json -p "vless://…" -p "trojan://…" -o config.json

多个链接要重复写 -p 参数,别用空格拼在一个 -p 后面——空格后面的会被当成位置参数直接忽略。

场景二:链接含逗号,用配置文件

命令行框架会把参数里的逗号当分隔符拆开。比如 SSH 链接里的 host_key_algorithms=ssh-ed25519,rsa-sha2-256,这个逗号会把链接拦腰截断,此时改用配置文件 sub2sing-box.json:

{
  "template": "sing-box-template.json",
  "proxy": ["ssh://root:password@host:22?host_key_algorithms=ssh-ed25519,rsa-sha2-256#SSH"],
  "output": "config.json"
}
sub2sing-box convert -c sub2sing-box.json

实测确认:同一条带逗号的 ssh 链接用 -p 传会报 Conversion error: unknown proxy format;改用配置文件的 proxy 数组后转换成功,host_key_algorithms 被正确解析成 ["ssh-ed25519", "rsa-sha2-256"]。

实测排错:新版修好的三个真实坑

以下三处都来自项目 2026-09-23 的修复提交,是真实用户踩过的坑。新版已修好,了解它们能帮你读懂报错。

1. unknown network: ws —— 传输类型写错了字段。 分享链接里传输层类型(ws、grpc)放在 type 参数里,但 sing-box 出站的 network 字段只接受 tcp / udp。旧版直接把传输类型写进 network,内核校验就拒绝整个出站。新版 trojan 解析器不再写 Network,hysteria2 用 ParseNetworkList 丢掉非 tcp/udp 的值。实测带 type=ws 的 trojan 链接,输出里只有 "transport": {"type": "ws", "path": "/trojan"},不再有 network 字段。手写配置记住:network 只填 tcp/udp,传输类型走 transport。

2. invalid format: 100 —— 带宽数字缺单位。 hysteria 链接常用裸数字写带宽(upmbps=100),但 sing-box 只接受 "100 Mbps" 这种带单位的写法。新版 ParseBandwidth 给裸数字自动补 Mbps 单位。实测 upmbps=100&downmbps=200 的链接,输出变成 "up": "100 Mbps", "down": "200 Mbps",一次通过。

3. duplicate outbound/endpoint tag —— 备注名重复被当成同一个节点。 旧去重只比较 type+tag,两个不同服务器用同一备注名会被悄悄丢掉一个;重名标签还从未被改名,导致内核拒绝启动。新版去重比较完整配置内容,重名自动改名。手动维护多服务器配置时,给每个出站起唯一 tag。

顺带:旧版按国家分组时,「US Socks 01」会误分到库克群岛("Socks" 里的 "ck" 被子串匹配命中);新版改成按词边界精确匹配两位国家码。分组错乱看起来像玄学,根因往往是这种小 bug。

哪些链接转不了:明确的「不支持」比含糊的报错好

以下四种没有对应的 sing-box 出站,新版给出带原因的明确报错(实测确认):

链接格式原因
ssr://ShadowsocksR 出站已在 sing-box 1.6.0 被移除,永远转不了
wireguard:// / wg://1.13.0 起 WireGuard 改用 endpoint 形式,不再是出站
juicity://sing-box 内核没有这个出站
snell://没有通用的分享链接格式(报错建议直接把 snell 出站写进模板)

从旧订阅里捞出一堆 ssr:// 就别折腾转换器了——这是内核层面的移除,换协议是唯一出路。订阅转换时这些链接会被跳过并在 stderr 打印警告,方便核对。

模板与内核版本:1.13/1.14 用户注意

模板语法必须和 sing-box 内核版本匹配。2026-09-23 的提交迁移了 1.13/1.14 移除的旧语法:

旧写法新写法
DNS 服务器的 legacy addresshttps / h3 等类型化服务器
rcode://refused 服务器DNS 规则 predefined 动作配 rcode: REFUSED
DNS 规则里的 "outbound": "any"route.default_domain_resolver
inbound 里的 legacy sniff(1.13.0 移除)嗅探已是 route 规则动作的一部分

1.12 及更早手写的配置,升级 1.14 前先对照上表改一遍,否则内核直接拒绝启动。

小结

sub2sing-box 的价值在于把各家客户端五花八门的分享链接,收敛成 sing-box 认可的 JSON。这次更新补齐了 TUIC / SSH / Naïve / HTTP 四个解析器,报错带原因,还修掉了带宽单位、传输字段、标签去重几个真实坑。

上手路径:go install 装最新版,-p 传链接、-t 套模板、-o 输出;链接里有逗号改用 -c 配置文件。转换完先跑 sing-box check -c config.json 再上线。