
先说背景:sing-box 是谁,这篇讲什么
sing-box 是一款开源的通用代理内核,被 NekoBox、sing-box 客户端、软路由插件等大量工具调用。它用一份 JSON 配置同时管理出站节点(VLESS、Hysteria2、WireGuard 等)、路由规则和 DNS。1.14 是它 2026 年的主力版本线。
如果你正在跑 sing-box——无论是 VPS 上的服务端,还是软路由、NAS 上的客户端——升级到 1.14 系列时有两个行为变化值得提前知道。它们来自上游 stable 分支最近的合并(比如第三方发行版 sing-box-lx 1.14.2-lx.8 的更新说明里就有详细记录),官方版同样包含。注意:这是行为变化,不是配置格式变化——旧配置文件不需要改动,但运行时的表现和以前不一样了。
变化一:不再使用的节点,闲置连接会被自动回收
以前是这样:只要一个出站(outbound)或 DNS 服务被配置进 config.json,哪怕没有任何路由规则指向它、selector/urltest 策略组也没有选中它,它的闲置连接(多路复用会话、QUIC 会话、DNS 连接)也会一直保留。
现在变了:内核会跟踪"到底什么在被使用"——路由规则、DNS 规则、endpoint、selector 或 urltest 当前选中的节点、detour 引用的节点。其余无人引用的节点,闲置连接会被关闭。
这对你意味着什么
- 内存和连接数会变少。 以前订阅里几十个节点每个都攒着空闲会话,升级后只留下真正在用的那几个。看内存占用峰值降低是正常的,不是 bug。
- 节点切换时会多一次握手。 以前切到一个"沉睡"的节点,它的多路复用会话可能还热着;现在冷切换的首次连接会多出一次握手延迟。影响是毫秒级,一般无感,但延迟敏感的游戏流量可以留意。
- 有两个例外:
urltest策略组在round_robin模式下,整个节点池都算"在使用中",不会回收——因为它真的是轮流用。- XHTTP 传输配合
xmux有自己独立的连接池规则;WireGuard / AmneziaWG 的闲置挂起(idle-suspend)行为保持不变。
Android 用户还多一个小变化:设备休眠(pause)时也会顺手关闭闲置连接,唤醒后重新建立。
变化二:udp_fragment 默认值在 Linux/Android 上终于真正生效
这一个更值得细看,因为它可能修掉一个困扰很久的怪问题。
udp_fragment 是出站 socket 的一个选项,控制 UDP 包能不能分片发送。WireGuard、AmneziaWG 和 masque 这三种出站,默认是"允许分片"的。
但问题是:在 Linux 和 Android 上,这个选项以前根本没有真正设置下去,内核自己保持着 DF(Don't Fragment,不允许分片)位。结果就是:隧道套隧道的场景下——比如 WireGuard 的外层 UDP 包再被塞进另一个隧道里传输,包一旦超过路径 MTU 就被直接丢掉。典型症状:小网站能开、大文件下载到一半卡死、ping 小包通、大包(ping -s 1400)不通,而且换 MTU 也救不回来。
新版本把这个 socket 选项显式设置下去了,默认"允许分片"真正生效。如果你还在用老办法(手动把 MTU 压到 1280 甚至更低)绕这个问题,升级后可以试着把 MTU 改回正常值,吞吐可能会明显变好。
反方向也有一个变化:Hysteria、Hysteria2 和 TUIC 这三个基于 QUIC 的出站,默认不再允许分片。理由是 QUIC 自己会做路径 MTU 探测(PMTUD),分片反而干扰它。如果你之前依赖分片来绕某些网络的分片丢包,可以显式写 "udp_fragment": true;如果想强制 DF,则写 false。
变化三:TUN 和 DNS 的几个顺手修复
- OpenVPN / OpenConnect 跑在系统 TUN 接口上时,写错误不再导致读循环整个停掉——以前隧道会莫名其妙"僵死",得重启进程。
- TUN 入站的 GSO(分段卸载)开关,现在按 endpoint 实际能承载的来决定,而不是按它的网络列表。
- 本地 DNS 服务器会尊重 systemd-resolved 的全局 DNS 服务器配置——Debian/Ubuntu 系 VPS 用户如果在
/etc/systemd/resolved.conf里配了全局 DNS,现在能正常生效了。 - 切换嵌套的
selector时,不再出现"持有组锁的同时关闭连接"的竞态。
升级实操:三步走
- 备份:先把
config.json复制一份。配置格式没变,但备份永远是好习惯。 - 校验:升级后(或升级前用新版二进制)跑
sing-box check -c config.json,配置文件必须通过校验。 - 验证版本:跑
sing-box version,确认输出是 1.14.x。如果用的是第三方发行版,会显示如1.14.2-lx.8的版本号。
升级后建议观察的两件事
- 连接数/内存:用客户端面板或 Clash API 看看活跃连接数,升级后静置时应该比以前少——这是变化一在起作用,正常。
- 嵌套隧道大包:如果你用 WireGuard 套其他隧道,跑个
ping -s 1400 <目标>对比升级前后,大包通了就说明变化二生效了。
一句话总结
1.14 的升级对配置是无感的,但对运行行为不是:闲置连接自动回收让资源占用更干净,UDP 分片默认值修正在 Linux/Android 上终于让"隧道套隧道"的大包能正常通过。理解了这两个变化,升级后看到的任何"不一样"都不会慌。
本文的行为描述基于 sing-box 上游 stable 分支的公开更新记录整理,不同发行版(官方版、第三方分支)的具体版本号和发布时间可能略有差异,升级前以你所用发行版的 Release Notes 为准。
