
先说背景:Snell 是什么
Snell 是 Surge 的私有代理协议。Surge 是一款 Apple 平台上的网络工具,Snell 是它自带的服务端 / 客户端协议,一直只有官方实现、没有公开规范——典型的"闭源协议"。
2026 年 9 月发布的 sing-box 1.14 把 Snell 吃了进来:服务端(inbound)与客户端(outbound)同时支持。这是 sing-box 第一次完整复刻一个主流商业软件的私有协议,值得单独讲一次。
前置知识:知道 sing-box 是代理内核、配置文件是 JSON 即可。Snell 的配置字段都抄自官方文档,可直接用。
为什么是 Snell:官方的解释很有意思
sing-box 官方在更新日志里把动机写得很直白,大意是:
Surge 认为"闭源、不扩散"能让 Snell 保持隐蔽,但到 2026 年这已经不可能了。Snell 依然有其他随机流量协议不具备的优势——支持多路复用、有完整 TCP 语义、流量特征多样——所以我们用 Go 把它实现了一遍,而不是重新发明轮子。除 v5 的 QUIC 代理模式外全部支持,行为与官方实现尽量一致,性能至少持平。
翻译一下:闭源挡不住协议被分析还原;Snell 在技术上有真东西(多路复用 + 完整 TCP 语义,意味着一条连接里可以跑多条流,且每条流的行为和普通 TCP 一样,不容易被流量分析抓到把柄);sing-box 选择"复刻"而不是"另起炉灶",是为了直接兼容 Surge 已有生态。
版本号的坑:服务端 5/6,客户端 4/6
这是最容易配错的地方,官方文档写得很清楚:
| 端 | version 可选值 | 说明 |
|---|---|---|
| 服务端 inbound | 5、6 | v5 支持 HTTP 混淆;v6 改用流量整形 |
| 客户端 outbound | 4、6 | 没有 v5 客户端——v5 的线协议与 v4 相同 |
为什么没有 v5 客户端?因为 sing-box 故意不支持 Snell v5 的 QUIC 代理模式,去掉 QUIC 之后 v5 和 v4 在协议层面是一样的,所以客户端直接用 version: 4 去连 v4/v5 服务端即可。这不是 bug,是设计。
另外两个硬性要求:
- v6 的
psk(预共享密钥)长度必须在 12 到 255 字节之间,太短会起不来; - 想尝鲜必须 sing-box 1.14.0 或更高版本(当前稳定版是 1.14.3,10 月 9 日发布;升级前先看这篇升级决策)。
服务端配置实战
一个最小可用的 v6 服务端配置(v6 是新版,新部署建议直接用):
{
"type": "snell",
"tag": "snell-in",
"listen": "0.0.0.0",
"listen_port": 8388,
"version": 6,
"psk": "<你的PSK,12到255字节>"
}
想开多用户模式(一个端口分给多人、每人独立密钥),加 users:
{
"type": "snell",
"tag": "snell-in",
"listen": "0.0.0.0",
"listen_port": 8388,
"version": 6,
"psk": "<你的PSK,12到255字节>",
"users": [
{ "name": "user-a", "userkey": "<用户A的密钥>" },
{ "name": "user-b", "userkey": "<用户B的密钥>" }
]
}
name 只出现在日志里,方便排查是谁的连接出问题;真正做认证的是 userkey。
如果要对接已有的 Surge v4/v5 服务端生态,把上面配置的 version 改成 5,并按需加 obfs_mode(其余字段不变):
{
"version": 5,
"obfs_mode": "http"
}
obfs_mode 只有 none(默认)和 http 两个选项,http 会把流量伪装成普通 HTTP 请求。v6 则用 mode 做流量整形(default / unshaped / unsafe-raw,默认 default)。
客户端配置实战
客户端连接 v6 服务端:
{
"type": "snell",
"tag": "snell-out",
"server": "<服务端IP或域名>",
"server_port": 8388,
"version": 6,
"psk": "<与服务端相同的PSK>"
}
连接 v4/v5 服务端(比如 Surge 官方服务端)时,version 填 4,不是 5:
{
"type": "snell",
"tag": "snell-out",
"server": "<服务端IP或域名>",
"server_port": 8388,
"version": 4,
"psk": "<与服务端相同的PSK>",
"obfs_mode": "http",
"obfs_host": "www.bing.com"
}
obfs_host 是 obfs_mode: http 时发出的 HTTP Host 头,默认就是 www.bing.com,不写也行。服务端开了多用户模式的话,客户端再加一行 "userkey": "<你的用户密钥>"。
配置写完先校验再重启,老流程:
sing-box check -c /etc/sing-box/config.json && systemctl restart sing-box
和 VLESS / Hysteria2 怎么选
只摆事实,不做推荐:
- Snell 的特点是流量特征随机、多路复用、完整 TCP 语义;v5 有 HTTP 混淆,v6 有流量整形。短板是生态小,客户端主要是 Surge 系和现在的 sing-box。
- VLESS + Reality / Vision 生态最大,客户端最多,调优资料也最多。
- Hysteria2 走 QUIC,弱网和高丢包环境下表现通常更好。
如果你已经在用 Surge 的 Snell 服务端,sing-box 1.14 之后终于可以用开源客户端接了——这是这次复刻最直接的受益场景。反过来,sing-box 做 Snell 服务端、Surge 做客户端,官方称行为与官方实现一致,理论上也能通(跨厂商组合建议先小流量验证)。
一句话总结
Snell 从"Surge 私有协议"变成"sing-box 原生支持的协议",意味着它的隐蔽性红利在 2026 年正式结束,但它的技术设计(多路复用、完整 TCP 语义)被开源生态吸收了。对普通用户来说,记住三件事:1.14.0+ 才有;服务端 5/6、客户端 4/6 别配反;v6 的 psk 至少 12 字节。
字段定义核实自 Snell 服务端文档 与 Snell 客户端文档;版本信息来自官方更新日志。
