sing-box 客户端出站分组实战:selector 手动选 + urltest 自动测速,节点挂了不断线

sing-box 客户端出站分组实战:selector 手动选 + urltest 自动测速,节点挂了不断线

背景:这篇解决什么问题

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,不用改配置文件

验证:三步确认分组真的在工作

  1. 语法先过关:sing-box check -c config.json 通过,且输出里没有关于分组 tag 的报错。
  2. 界面看得到分组:重启后在分组列表里找到“节点选择”,点开能看到“自动测速”和各个节点。
  3. 手动切换能生效:把外层分组从“自动测速”切到某个具体节点,新开一个网页或应用确认流量走了这个节点,再切回“自动测速”。

注意第 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 见升级指南。