本页目录(9)
一句话结论:AnyTLS 是一个跑在标准 TLS 之上的代理协议,思路接近 Trojan,但额外加入了可由服务器下发的填充方案和强制连接复用,专门用来削弱「TLS 里再套 TLS」的流量特征;支持它的客户端主要是 mihomo、sing-box 以及 Shadowrocket、Stash、Loon 等新版。
最近不少机场的节点列表里多了 AnyTLS 节点。AnyTLS 协议是什么?它和老牌的 Trojan 看上去都是「TLS + 密码」,到底差在哪里,值不值得用?这篇文章根据 AnyTLS 官方仓库的协议文档整理,讲清它解决了什么问题、和 Trojan 的区别,以及哪些客户端能用。
AnyTLS 要解决的问题:TLS in TLS
先说背景。Trojan、VLESS + TLS 这类协议的外层都是 TLS,看起来像访问一个 HTTPS 网站。但你通过代理访问的网站本身大多也是 HTTPS,于是就出现了「外层 TLS 里面还套着一层 TLS」的结构。
内层 TLS 握手有比较固定的模式:客户端先发一个几百字节的 ClientHello,服务器回一个较大的证书响应,然后才开始传数据。外层加密能隐藏内容,却隐藏不了这些包的大小和先后顺序。研究和实践都表明,通过统计这些特征,有可能把代理流量和普通网页访问区分开,这就是 TLS in TLS 特征。
AnyTLS 官方仓库对自己的定位就是「试图缓解嵌套 TLS 握手指纹问题」。Xray 用 Vision 流控解决类似问题(见 VLESS + Reality 详解),AnyTLS 则选择在协议层面内置填充。
AnyTLS 的工作原理
认证
客户端和服务器先完成一次标准 TLS 握手。握手完成后,客户端立刻发送密码的 SHA-256 哈希,后面跟一段长度可变的填充数据。认证失败时,协议允许服务器直接断开,或者回落到一个正常的 Web 服务。
可配置的填充方案
这是 AnyTLS 的核心。协议规定了一套「填充方案」,描述连接建立后前若干个数据包应该被切分或填充成多大:数据不够就补垃圾数据,数据太大就按规定拆开发送。默认方案会处理前 8 个包,覆盖了内层 TLS 握手最容易暴露特征的阶段。
更特别的是,服务器可以向客户端下发新的填充方案。客户端连接时会带上自己当前方案的摘要,如果和服务器不同,服务器就推送新方案,客户端在后续连接中使用。这意味着机场可以在不更新客户端的情况下调整流量形态,如果某种包长模式被盯上,换一套方案即可。
强制的会话复用
AnyTLS 要求客户端必须实现多路复用:多个代理请求作为不同的「流」跑在同一条 TLS 会话里。请求结束后会话不会立即关闭,而是放回空闲池,下一个请求优先复用最近使用过的会话,长时间闲置的会话再定期清理。
好处有两个:一是新请求不用每次重新做 TLS 握手,延迟更低;二是连接建立次数减少,也减少了可被统计的握手事件。
UDP 怎么走
AnyTLS 本身基于 TCP,UDP 流量通过 sing-box 的 UDP over TCP(第 2 版)协议封装在流里传输。所以它能转发 UDP,但本质上还是走 TCP,对游戏、语音这类场景不如原生 UDP 的协议理想,详见 机场 UDP 支持说明。
AnyTLS 和 Trojan 有什么不同
| 对比项 | Trojan | AnyTLS |
|---|---|---|
| 外层 | 标准 TLS | 标准 TLS |
| 认证方式 | 密码哈希 | 密码 SHA-256 哈希 + 随机填充 |
| TLS in TLS 处理 | 协议本身不处理 | 内置填充方案,可由服务器更新 |
| 多路复用 | 协议本身无,需客户端另开 mux | 协议强制,会话复用 |
| UDP | 协议内支持 | 通过 UDP over TCP |
| 客户端支持 | 几乎所有主流客户端 | 较新的客户端 |
| 成熟度 | 多年大规模使用 | 较新,仍在演进 |
需要说明的是,Trojan 客户端也可以另外开启多路复用(mux)来减少握手,但那是客户端层面的附加功能,不同客户端的实现并不统一;AnyTLS 则把复用写进了协议本身,所有实现都必须支持。
可以这样理解:Trojan 解决的是「看起来像 HTTPS」,AnyTLS 在此基础上进一步解决「HTTPS 里跑的流量看起来也不像在套娃」。代价是协议更复杂,生态更新。
AnyTLS 客户端支持情况
以下信息来自 AnyTLS 官方仓库和 sing-box 官方文档,版本号只列出了能确认的部分:
- sing-box:1.12.0 起提供 AnyTLS 入站和出站,见 sing-box 使用教程。
- mihomo(Clash Meta):支持 AnyTLS 客户端和服务端,配置类型为
anytls。Clash Verge Rev 等使用 mihomo 内核的客户端可用,建议保持最新版。 - Shadowrocket:2.2.65 及以上版本支持。
- Stash、Loon:官方仓库列出已支持,具体最低版本以各自更新日志为准。
- 原版 Clash、旧版 Clash for Windows:不支持。
一个 mihomo 配置示例大致如下(字段以机场下发的订阅为准,一般无需手写):
- name: "AnyTLS-HK"
type: anytls
server: example.com
port: 443
password: "你的密码"
sni: example.com
udp: true
AnyTLS 和 VLESS Reality 怎么取舍
两者都是机场常用的「高抗封锁协议」,但侧重点不同:
VLESS + Reality
重点在握手伪装:借用真实网站的 TLS 握手,让主动探测拿到的是真网站。TLS in TLS 问题交给 Vision 流控处理。生态成熟,客户端支持更广。
AnyTLS
重点在流量形态:外层是标准 TLS,靠可更新的填充方案和会话复用来打乱内层握手的包长模式。协议更新,设计上更灵活。
对普通用户而言,没必要二选一。如果机场两种都提供,把它们都放进备用分组即可,哪种在当下网络环境里更稳就用哪种。Reality 的原理详见 VLESS + Reality 是什么。
AnyTLS 节点连不上怎么排查
- 确认客户端版本:这是最常见的原因。旧版客户端遇到不认识的节点类型,可能直接忽略,也可能报配置错误。
- 检查 SNI 和证书:AnyTLS 外层是标准 TLS,SNI 填写错误或证书校验失败都会导致握手失败。不要为了「能连上」随意开启跳过证书验证,那会让中间人攻击变得可能。
- 对比同地区其他协议:同一地区的 Trojan 或 VLESS 节点也连不上,问题多半在线路或服务器;只有 AnyTLS 不通,再找机场客服确认该节点状态。
- 留意空闲会话设置:因为强制复用,客户端会保留一些空闲会话。sing-box 中对应
idle_session_check_interval、idle_session_timeout等参数,默认值通常无需修改。如果遇到长时间不用后首个请求很慢,可以尝试调整这些参数。
另外,sing-box 文档注明 AnyTLS 与 TCP Fast Open 不兼容,自定义配置时不要给 AnyTLS 节点开启 TFO。如果你使用的是机场下发的完整配置文件,这些细节通常已经处理好,排查时优先怀疑版本和网络,而不是急着手动改参数。
什么时候该用 AnyTLS
- 针对 TLS in TLS 特征做了专门设计
- 填充方案可远程更新,应变灵活
- 会话复用降低新连接延迟
- 客户端支持不如 Trojan 广
- 协议较新,各实现成熟度不一
- UDP 走 TCP 封装,不适合对延迟极敏感的游戏
日常使用中,AnyTLS 和 VLESS Reality 的定位类似:作为高抗封锁的备用协议。平时让客户端在各协议节点里自动选择,遇到 敏感时期 大面积超时再手动切过去。选机场时,有没有这类协议是重要的加分项,各主流协议的整体对比可看 四大协议对比,选购思路见 怎么选机场。
常见问题
AnyTLS 和 Trojan 哪个更好?
Clash 能用 AnyTLS 吗?
type: anytls。建议把客户端和内核更新到最新版。已停更的原版 Clash 内核不支持。