AnyTLS 是一種在 TLS 內執行的代理協定,它會填充每條連線的開頭,讓代理流量不再顯示那些通常會洩漏「TLS 套 TLS」的封包大小特徵。 你用密碼登入,伺服器驗證後,你的連線就在一條看似普通的 TLS 工作階段中傳送。AnyTLS 也會重複使用它的 TLS 連線,讓大多數新連線省下一次交握。
本文會說明 AnyTLS 是什麼、如何運作、和 Trojan 與 VLESS 相比定位如何,以及 anytls:// 連結長什麼樣子。
AnyTLS 是什麼?
AnyTLS 是一個相當年輕的協定。它在 2025 年隨著 anytls-go 出現,這是它的參考用戶端與伺服器,協定規格也放在這裡。不久之後,兩個廣泛使用的代理核心也加入了支援:sing-box 和 mihomo(目前大多數 Clash 類 App 背後的核心)。
它的目標很明確。像 Trojan 這樣的協定本來就藏在 TLS 裡,觀察者只會看到一條連往某台伺服器的加密工作階段。但當你透過這種代理打開 HTTPS 網站時,瀏覽器自己的 TLS 交握會在代理的 TLS 工作階段裡傳送。內層交握最初的幾則訊息有典型的大小和時序。由於加密只隱藏內容、不隱藏長度,這些特徵可能透過外層加密洩漏出來。這通常被稱為「TLS 套 TLS」問題。
AnyTLS 試圖模糊這些特徵。它會依照填充方案,把每條連線最初的幾個封包填充到特定大小,讓它們不再符合典型的 TLS 交握。
更難,但不是不可能。 填充讓代理流量更難被辨識,但並不能讓它無法偵測,而且每條新連線都會多出一些位元組。
AnyTLS 如何運作
當你手機上的 App 透過 AnyTLS 伺服器開啟一條連線時,會發生以下事情:
- 先建立 TLS。 你的用戶端向伺服器開啟一條普通的 TLS 連線,帶有伺服器名稱(SNI),也可以選用類似瀏覽器的指紋。在網路上看起來,這就和任何 HTTPS 瀏覽一樣。
- 驗證密碼。 在 TLS 內,用戶端送出密碼的雜湊值和一段填充資料。伺服器不認得這個密碼時,會直接關閉連線。
- 填充。 兩個方向最初的幾個封包,都會依照填充方案描述的長度被分割並填充。伺服器可以傳送自己的填充方案,用戶端會從下一條 TLS 連線開始採用。
- 你的連線。 用戶端請伺服器開啟一條通往目的地的連線,例如
example.com:443,並雙向轉送資料。 - 重複使用。 這條連線結束後,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 datagram |
想看包含 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,請將它開啟。