
背景
sing-box 是一个开源的通用代理平台:既可以在 VPS 上跑作服务端(VLESS、Trojan、Hysteria2 等入站),也可以在电脑、手机上跑作客户端(路由、分流、TUN 透明代理)。自建节点的玩家大多用它当主力。
近两年的趋势很明显:封锁手段从"封 IP、封端口"转向了流量特征识别——即便你用的是正规 TLS 协议,对方也能从握手的流量特征里分辨出"这是代理流量还是真网页流量"。sing-box 的回应是一连串藏在 TLS 层的反识别特性:1.12 加入了 AnyTLS 协议和 TLS 分片,1.14 加入了伪造 ClientHello(spoof)。这篇把三件套的原理、适用场景和配置一次讲清。
前置知识:一台能装软件的 VPS(Debian/Ubuntu 最常见),能用 SSH 登录,sing-box 建议升级到 1.14.3(当前最新稳定版)。TLS 层相关的特性全部配置在客户端的 tls 字段里。
1. AnyTLS 协议:让代理流量不像代理流量
AnyTLS 是 sing-box 1.12 引入的新协议。官方更新日志的说法很克制:"claims to mitigate TLS proxy traffic characteristics"(声称能缓解 TLS 代理的流量特征问题),并带了一套新的多路复用方案。
它解决了哪类问题?传统代理协议(如 VMess、Trojan)要么握手包有固定特征,要么在一条连接上传很多流,流量模式一眼可辨。AnyTLS 的思路是在 TLS 之上再做一层填充(padding)和随机化,让代理连接的包长、发包节奏更接近普通 HTTPS 流量。它不是"隐形",而是"降噪"——减少被特征引擎盯上的概率。
服务端配置(VPS 上):
{
"type": "anytls",
"tag": "anytls-in",
"listen": "::",
"listen_port": 443,
"users": [
{ "name": "user1", "password": "<你的密码>" }
],
"tls": {
"enabled": true,
"server_name": "你的域名",
"certificate_path": "/etc/sing-box/cert.pem",
"key_path": "/etc/sing-box/key.pem"
}
}
padding_scheme 是填充方案数组,默认已经有一套官方调优的方案,不懂的话不要改。
客户端配置:
{
"type": "anytls",
"tag": "anytls-out",
"server": "你的服务器地址",
"server_port": 443,
"password": "<你的密码>",
"tls": {
"enabled": true,
"server_name": "你的域名"
}
}
小提醒:AnyTLS 客户端早期版本默认会上传一些客户端元数据,但这些数据开源服务端根本用不到,还有厂商拿它做识别用途的报告。所以官方从 1.13.16 起把它挪到 client_metadata 字段、默认不再上传。升级到新版客户端就能白嫖这个改进,不用手动改。
AnyTLS 与 VLESS+Reality 的关系:两者不冲突。VLESS+Reality 解决的是"服务端伪装"(让握手看起来像在访问真网站),AnyTLS 解决的是"流量特征降噪",可以配合使用,也可以单独用 AnyTLS+普通 TLS(适合没有域名的场景)。
2. TLS 分片:先试 record_fragment
有些网络环境做的是"明文包匹配":防火墙直接读 TCP 包里的明文字节,看 ClientHello 里有没有被标记的域名,一匹配就掐。对付这种粗糙但有效率的手段,sing-box 1.12 引入了两种分片:
record_fragment:把 TLS 握手拆成多个 TLS 记录发送。实现成本低、性能影响小,官方建议先用它。fragment:把 TCP 数据包本身切碎,配合延迟探测。性能较差,是备选方案。
配置很简单,客户端 outbound 的 tls 里加一行:
"tls": {
"enabled": true,
"server_name": "你的域名",
"record_fragment": true
}
注意两个细节:
- 这两个特性只适用于基于明文匹配的简单防火墙——sing-box 官方文档原话:"should not be used to circumvent real censorship"(不适用于对抗真正的审查手段)。别把它当成万能药。
- 不要全局开:它只对握手阶段有用,开给全部连接只会拖慢速度。可以配合路由动作,只对被拦截的域名启用——1.12 起路由 action 也支持 TLS 分片选项。分流路由的玩法可以参考站内文章 sing-box 1.14 新特性解读:Snell 协议、远程面板与升级要点 里的路由写法思路。
3. 伪造 ClientHello:骗过 SNI 白名单(spoof)
1.14 的新特性 spoof 是三件套里最"黑科技"的一个,用来对付 SNI 白名单式的中间盒:只允许访问名单里的域名(比如知名大站),其他 SNI 一律阻断。
原理分两步:
- 客户端在真正的 ClientHello 之前,先注入一段伪造的 ClientHello,里面带一个白名单里的 SNI(比如某个大公司的域名)。中间盒看到白名单域名,放行。
- 真服务器收到这段伪造的包,会因为
spoof_method指定的"拒绝方式"把它丢弃(默认wrong-sequence:把伪造包的 TCP 序列号放在服务器接收窗口之外,服务器直接忽略),然后继续处理真正的 ClientHello。
配置同样在客户端 tls 里:
"tls": {
"enabled": true,
"server_name": "你的域名",
"spoof": "白名单里的域名"
}
硬性要求:注入伪造包需要提权——Linux 需要 CAP_NET_RAW 和 CAP_NET_ADMIN 能力,macOS 需要 root,Windows 需要管理员权限(ARM64 的 Windows 不支持)。手机客户端基本用不上这个特性,它是给桌面端和网关设备准备的。
spoof_method 一共有五种拒绝方式(wrong-sequence 默认、wrong-checksum、wrong-ack、wrong-md5、wrong-timestamp),默认一般不用改;如果默认方式在你的网络里不起作用,再逐个试。
4. 选购顺序:按"成本从低到高"叠加
三件套不是三选一,而是可以按顺序叠加,成本从低到高:
record_fragment:零成本,先开,尤其适合明文 SNI 匹配的网络。- AnyTLS:换协议,把流量特征压低。需要服务端配合部署。
spoof:对抗 SNI 白名单的利器,但需要提权、只支持桌面/网关客户端。
一个务实的组合:服务端 AnyTLS + 普通 TLS(免去域名和证书麻烦),客户端开 record_fragment。这是目前折腾成本最低、隐蔽性还不错的方案。
顺带一提,sing-box 1.15 测试版还在憋大招:MASQUE(基于 HTTP 的 CONNECT-IP 代理)、HTTP 代理的 HTTP/2、HTTP/3 和 UDP 支持、全证书 pinning。等 1.15 正式版发布,本站会再出一篇解读。
