
背景:这篇解决什么问题
sing-box 是一个开源的通用代理平台:既可以在服务器上跑作服务端,也可以在电脑、手机上跑作客户端,负责决定每条流量走哪条出站(也就是走哪个节点、直连还是拦截)。如果你只有一个节点,配置很简单:流量进来,走这个节点出去,完事。
但节点一多,麻烦就来了。订阅里常常有好几个节点:有的白天快、晚上慢,有的偶尔直接失联。写死一个节点,它一挂全部流量就跟着断,得手动改配置、重启客户端才能恢复;每次手动挑节点,又得反复比延迟。
这篇给的是一个两层分组结构:外层手动分组,内层自动测速分组。平时自动走延迟最低的节点;想固定某个节点时,界面点一下就能切换;某个节点挂了,下一轮测速会把它排除,不用半夜起来改配置。
前置知识:一份能跑起来的 sing-box 客户端配置,知道出站(outbound)是配置里的一组条目、每条有一个名字(tag)。路由规则写法见本站的路由规则指南。
目标结构:两层分组长什么样
流量先走到外层分组,再由内层分组决定具体节点:
- 外层:
节点选择(selector 类型):你在客户端界面看到的那个分组,可以手动点选。 - 内层:
自动测速(urltest 类型):定期向一个轻量地址发探测请求,按延迟给节点排序,自动选最快的一个。 - 底层:你已有的节点出站,比如
节点 A、节点 B、节点 C,协议、服务器等字段保持原样,本篇不动。
外层分组的候选里同时放进内层分组、每个具体节点和直连,既能选“自动”,也能直接点某个节点或直连。
配置:只加两个分组出站
在 outbounds 数组里,在已有节点出站之后追加下面两个分组。分组里写的名字必须是节点出站的 tag,一字不差,拼错会在检查时报错。
{
"type": "urltest",
"tag": "自动测速",
"outbounds": ["节点 A", "节点 B", "节点 C"],
"url": "https://cp.cloudflare.com/generate_204",
"interval": "3m",
"tolerance": 50
},
{
"type": "selector",
"tag": "节点选择",
"outbounds": ["自动测速", "节点 A", "节点 B", "节点 C", "direct"],
"default": "自动测速",
"interrupt_exist_connections": false
}
然后让路由的默认出口指向外层分组,其余规则保持不变:
"route": {
"final": "节点选择"
}
改完先检查语法,不要直接覆盖正在用的配置:
sing-box check -c config.json
检查通过后再重启客户端。
参数怎么定:三张小表
urltest 的关键字段
| 字段 | 意思 | 建议 |
|---|---|---|
url | 测速用的探测地址 | 用返回 204 的轻量地址,例如 Cloudflare 的 204 探测地址,不要用视频站或大文件地址 |
interval | 每隔多久重新测一轮 | 3m 到 5m;太短会频繁发探测、浪费流量和电量,太长则挂掉的节点要很久才被排除 |
tolerance | 新节点要比当前节点快多少才切换 | 50(单位是毫秒);设得太小,两个延迟接近的节点会来回横跳 |
selector 的关键字段
| 字段 | 意思 | 建议 |
|---|---|---|
default | 刚启动时默认选谁 | 填 自动测速,开箱就是自动模式 |
interrupt_exist_connections | 切换分组时是否切断已有连接 | 日常用 false:切换只影响新连接,正在看的视频、正在下的文件不会被打断;想立刻验证新节点时再手动重开应用 |
这样配完,日常是什么体验
| 场景 | 发生什么 |
|---|---|
| 一切正常 | 新连接走测速分组当前最快的节点 |
| 某个节点失联 | 下一轮测速把它排除,新连接自动走剩下的节点 |
| 你想固定某个节点 | 在客户端界面把外层分组从“自动测速”点成那个节点 |
| 你想临时直连 | 在外层分组里点 direct,不用改配置文件 |
验证:三步确认分组真的在工作
- 语法先过关:
sing-box check -c config.json通过,且输出里没有关于分组 tag 的报错。 - 界面看得到分组:重启后在分组列表里找到“节点选择”,点开能看到“自动测速”和各个节点。
- 手动切换能生效:把外层分组从“自动测速”切到某个具体节点,新开一个网页或应用确认流量走了这个节点,再切回“自动测速”。
注意第 3 步要“新开”才算数:interrupt_exist_connections 为 false 时,已建立的连接不会因点一下分组就迁移,这是正常现象,不是分组没生效。
四个坑:照着配最容易踩到的地方
1. 分组里不能套自己。 urltest 的候选只能是真实节点出站,不能放 selector,也不能放它自己,否则会循环引用。外层 selector 可以引用 urltest,反过来不行。
2. 延迟低不等于速度快。 urltest 只测探测往返耗时,不测带宽。延迟 80 毫秒但带宽充足的节点,下载大文件可能比延迟 40 毫秒的小水管节点更快。传大文件时,延迟分组只能帮你排除失联节点,不能替你选出下载最快的节点。
3. 测速地址别乱选。 把测速地址设成常用网站首页,首页体积大、还可能被缓存或限速,测出的延迟不准,还白白消耗节点流量。轻量 204 地址就是为这种探测设计的,用它最稳。
4. 节点全挂时分组救不了你。 三个节点同时失联,urltest 也选不出可用出口,流量会失败,而不是自动变直连——除非你手动把外层分组切到 direct。所以外层分组保留 direct,就是最后的手动逃生口。
小结
两层分组的分工很好记:urltest 负责“平时不用你管”,selector 负责“你想管时一点就管”。加进配置、检查通过、按验证三步走一遍,之后节点单点失联就不再是半夜爬起来改配置的事了。
服务器端远程管理见 API 与 Dashboard 实战;升级到 1.14 见升级指南。
