AnyTLS 是一种运行在 TLS 内的代理协议,它会填充每个连接的开头部分,让代理流量不再显露通常会暴露“TLS 套 TLS”的大小特征。 你用密码登录,服务器校验密码,你的连接就在一个看起来很普通的 TLS 会话中传输。AnyTLS 还会复用 TLS 连接,这样大多数新连接都能省掉一次握手。

本文介绍 AnyTLS 是什么、如何工作、与 Trojan 和 VLESS 相比处于什么位置,以及 anytls:// 链接长什么样。

AnyTLS 是什么?

AnyTLS 是一个相对年轻的协议。它在 2025 年随 anytls-go 一同出现,anytls-go 是它的参考客户端和服务端,协议规范也托管在那里。不久之后,两款广泛使用的代理内核加入了对它的支持:sing-box 和 mihomo(目前大多数 Clash 类 App 背后的内核)。

它的目标很明确。Trojan 之类的协议本来就藏在 TLS 里,观察者只能看到一个通往某台服务器的加密会话。但当你通过这样的代理打开一个 HTTPS 网站时,浏览器自己的 TLS 握手会在代理的 TLS 会话中传输。内层握手的最初几条消息有典型的大小和时序。这些特征可能透过外层加密泄露出来,因为加密能隐藏内容,却隐藏不了长度。这通常被称为“TLS 套 TLS”(TLS-in-TLS)问题。

AnyTLS 试图把这些特征模糊掉。它按照一个填充方案,把每个连接的最初几个数据包填充到特定大小,让它们不再与典型的 TLS 握手相符。

更难识别,而非无法识别。 填充让代理流量更难被识别,但不会让它无法检测,而且每个新连接都会多出一些字节。

AnyTLS 的工作原理

当你手机上的某个 App 通过 AnyTLS 服务器发起连接时,过程如下:

  1. 先建立 TLS。 客户端向服务器发起一条普通的 TLS 连接,带有服务器名称(SNI),还可以带一个类似浏览器的指纹。在网络看来,这和任何一次 HTTPS 访问没什么两样。
  2. 校验密码。 在 TLS 内,客户端发送密码的哈希和一段填充。服务器如果不认识这个密码,就会关闭连接。
  3. 填充。 每个方向的最初几个数据包会按照填充方案描述的长度被拆分和填充。服务器可以下发自己的填充方案,客户端会从下一条 TLS 连接起使用它。
  4. 你的连接。 客户端请服务器连接到目标地址,例如 example.com:443,然后双向转发数据。
  5. 复用。 这个连接结束后,TLS 会话并不会关闭,而是作为空闲会话等待,下一个连接直接使用它,而不是新开一个。每个会话同一时间只承载一个连接,所以同时有多个连接时会打开多个会话,之后再复用它们。

UDP(如语音通话或 QUIC)在同一条 TLS 连接中承载,这叫作 UDP over TCP。

填充方案

填充方案是一份简短的规则列表:要填充多少个数据包、每个包应该多长,通常是一个随机范围。默认值来自 anytls-go。服务器管理员可以修改它们,客户端会自动采用新的方案。你的设备上不需要做任何设置。

REALITY

普通的 AnyTLS 服务器需要为其域名准备 TLS 证书。sing-box 服务器则可以让 AnyTLS 搭配 REALITY 运行,借用另一个真实网站的 TLS 证书。使用 REALITY 时,你需要设置服务器的公钥和 Short ID,把所借用网站的域名作为服务器名称,并选择一个浏览器指纹,如 chrome。如果你对 REALITY 还不熟悉,请看 VLESS REALITY 是什么?

优点和缺点

优点

  • 看起来像 HTTPS。 外层是带真实服务器名称的普通 TLS,能混入普通的网页流量。
  • 隐藏“TLS 套 TLS”的大小特征。 填充针对的正是让 TLS 代理更容易被发现的那种特征。
  • 握手更少。 复用空闲会话意味着大多数新连接可以跳过 TLS 握手,这在高延迟线路上很有帮助。
  • 配置简单。 客户端只需要一个密码和常规的 TLS 设置。
  • 可搭配 REALITY(sing-box),这样你不需要自己的证书。

缺点

  • 较新,支持面较窄。 提供 AnyTLS 的服务器面板、服务商和 App 比 Trojan、Shadowsocks 或 VLESS 少。
  • 填充消耗带宽。 开销不大,但每个新会话都会多发一些字节。
  • UDP 跑在 TCP 上。 UDP over TCP 可以工作,但一旦丢包,TLS 连接里的所有内容都要等待。Hysteria 2 这类基于 QUIC 的协议更能应对丢包。
  • 没有传输方式。 AnyTLS 直接运行在 TLS 上,不提供 WebSocket 或 gRPC,所以不能像 WebSocket 上的 Trojan 或 VLESS 那样放在 CDN 后面。

AnyTLS 与相近协议对比

AnyTLS Trojan VLESS + REALITY Hysteria 2
运行于 TCP 上的 TLS TCP 上的 TLS TCP 上的 REALITY(TLS) UDP 上的 QUIC
登录方式 密码 密码 用户 ID(UUID) 密码
隐藏“TLS 套 TLS” 填充 否 使用 Vision 流控时 —
复用连接 是 否 否 是,共用一条 QUIC 连接
需要证书 是,或使用 REALITY 是,或使用 REALITY 否 是(常用自签名)
UDP UDP over TCP 经 TLS 经同一连接 QUIC 数据报

想看更全面的比较,包括 Shadowsocks、VMess 和 SOCKS5,请看代理协议对比。想深入了解它最接近的协议,请阅读 Trojan 代理是什么?

AnyTLS 分享链接长什么样

服务商通常以 anytls:// 链接分发 AnyTLS 服务器,格式遵循 anytls-go URI 格式:

anytls://password@host:port/?parameters#name

密码经过百分号编码,# 后面的名称只是一个标签。省略端口时,客户端使用 443。一台密码为 secret 的基础服务器:

anytls://secret@anytls.example.com:443/?sni=anytls.example.com#Basic

常用参数如下:

参数 含义
sni TLS 服务器名称。
insecure 为 1 时关闭证书验证。
alpn ALPN 列表,以逗号分隔并经过百分号编码。
fp 浏览器指纹,如 chrome。
hpkp 服务器证书的 SHA-256,用于固定证书。

一台使用自签名证书的服务器,通过固定证书而不是关闭验证来连接:

anytls://secret@anytls.example.com:443/?sni=anytls.example.com&fp=chrome&hpkp=abababababababababababababababababababababababababababababababab#Pinned

在 Clash 或 Mihomo 订阅中,同一台服务器是一个 type: anytls 的条目,带有 password、sni,以及 udp: true 或 client-fingerprint 等选项。Clash 条目还可以用 idle-session-check-interval、idle-session-timeout 和 min-idle-session 调整会话复用。

避免使用 insecure 模式。 insecure=1 会让你与服务器之间的任何人都能读取你的流量。如果服务器使用自签名证书,请改用 hpkp 固定证书。

在 iPhone 上使用 AnyTLS

Potatso 是一款适用于 iPhone 和 iPad 的免费代理客户端,支持 AnyTLS 的填充方案、连接复用、UDP over TCP、REALITY、ECH、证书固定和浏览器指纹。你可以通过 anytls:// 链接、Clash 或 Mihomo 订阅、Surge 配置或手动输入来添加服务器。

请按照 iPhone 使用 AnyTLS 教程一步步操作,或在 AnyTLS 参考中查看每一项支持的设置。

常见问题

AnyTLS 是用来做什么的?
AnyTLS 是一种代理协议,它把你的连接放在一条普通的 TLS 连接中传输并加以填充,让流量更难被识别为代理。如果想要一种既是 TLS 代理、又能隐藏“TLS 套 TLS”大小特征的协议,人们会用它来替代 Trojan 或 VLESS。
AnyTLS 比 Trojan 好吗?
没有哪个在所有情况下都更好。两者都运行在 TLS 内,都用密码认证。AnyTLS 增加了填充和连接复用,让代理的 HTTPS 流量更难被识别;Trojan 则更早、更简单,支持它的服务器和 App 也更多。
哪些服务端和 App 支持 AnyTLS?
参考服务端是 anytls-go。sing-box 和 mihomo 也支持 AnyTLS,sing-box 还能把它与 REALITY 结合使用。在 iPhone 和 iPad 上,Potatso 可以通过 anytls:// 链接、Clash 或 Mihomo 订阅、Surge 配置或手动填写的设置连接 AnyTLS 服务器。
AnyTLS 支持 UDP 吗?
支持。AnyTLS 在其 TLS 连接内承载 UDP,这叫作 UDP over TCP。在 Potatso 中,AnyTLS 服务器默认关闭“UDP 转发”,如果你的服务器会转发 UDP,请打开它。

其他语言版本: English · 繁體中文 · 日本語 · Русский