Trojan 是一種藏身在 TLS 裡的代理協定,而 TLS 正是保護 HTTPS 網站的那套加密。你的裝置會與伺服器建立一條普通的 TLS 連線(通常在 443 連接埠),並在連線中送出密碼和你要連往的位址。如果密碼錯誤,伺服器就表現得像一般網站,所以在旁觀者眼中,Trojan 代理協定看起來就像日常的 HTTPS 瀏覽。
本文說明 Trojan 是什麼、如何運作、它的傳輸方式和 REALITY、優缺點,以及如何看懂 trojan:// 連結。準備好要設定了?請見 iPhone 怎麼用 Trojan。
Trojan 代理協定是什麼?
雖然名字叫 Trojan,但它和惡意軟體毫無關係。這個名字來自特洛伊木馬:代理流量藏在看起來無害又熟悉的東西裡面傳送。
Trojan 沒有自創加密方式。加密交給 TLS 處理,它只在上面加一個非常小的標頭:密碼的雜湊值、一個指令,以及目的地位址。這讓協定本身很簡單,也代表它的加密就是銀行和瀏覽器都在用、經過充分研究的 TLS。
它的設計目標是融入一般流量。現今網際網路上大部分的流量,都是 443 連接埠上的 HTTPS。Trojan 伺服器就架在這個連接埠上,搭配真正的網域名稱和憑證;任何不是有效 Trojan 用戶端的連線,都只會收到一個真正的網頁。
發展簡史
最初的實作 trojan-gfw 以 C++ 撰寫,大約在 2019 年問世,規格公布在專案的協定頁面上。之後出現了以 Go 重寫的 trojan-go,加入 WebSocket 傳輸和多工。如今 Xray、sing-box 和 Mihomo 等大多數多協定伺服器與用戶端都內建 Trojan,這些專案也陸續加入更多傳輸方式和 REALITY 支援。
Trojan 的運作原理
- TLS 交握。 用戶端連上伺服器(通常是 443 連接埠),並以
trojan.example.com之類的伺服器名稱(SNI)開始 TLS。伺服器出示該名稱的有效憑證。 - Trojan 請求。 在加密的連線中,用戶端送出密碼的 SHA-224 雜湊值、一個指令(connect 或 UDP associate),以及目的地,例如
example.org:443。 - 檢查。 伺服器將雜湊值與使用者的密碼比對。
- 轉送或回落。 雜湊值相符時,伺服器連上目的地並雙向轉送資料;不相符時,伺服器把整條連線交給回落(fallback)網頁伺服器,讓訪客看到一個普通網站。
- UDP。 UDP 封包會加上框架,在同一條 TLS 連線中傳送。
iPhone ──TLS (SNI trojan.example.com)──▶ Trojan server ──▶ example.org
│
wrong password ──────┴──▶ ordinary website (fallback)
回落機制正是 Trojan 和 Shadowsocks 不同的地方。連上伺服器的探測只會拿到一個正常網頁,而不是被中斷的連線。
傳輸方式:純 TLS、WebSocket 與 gRPC
基本的 Trojan 直接在 TLS 上執行。大多數伺服器也會提供某種傳輸方式,把 Trojan 資料流包在另一個協定中傳送:
- WebSocket 在一般的 HTTPS 請求中執行。由於 CDN 和反向代理都認得 WebSocket,伺服器可以架在 CDN 後面,隱藏真實 IP 位址。
- gRPC 透過 HTTP/2 執行,同樣能穿過許多 CDN 和反向代理。
- HTTP/2 和 HTTP Upgrade 是部分伺服器使用的類似選項。
傳輸方式會增加一些額外負擔,也多了需要正確設定的項目,例如路徑或服務名稱。只有在伺服器有設定時才使用。
Trojan 搭配 REALITY
傳統的 Trojan 伺服器需要自己的網域和憑證。Xray 專案推出的 REALITY 免除了這個需求:伺服器借用一個真實、無關網站的 TLS 交握。知道伺服器公鑰和 short ID 的用戶端可以使用代理,其他人則被轉給那個真實網站。
REALITY 通常與 VLESS 搭配,但 Trojan 伺服器也能使用。詳情請見 VLESS + REALITY 是什麼?
優點與缺點
優點
- 看起來就像 443 連接埠上的一般 HTTPS。
- 被探測時以真正的網站回應,而不是毫無反應。
- 使用標準 TLS,而非自訂的加密演算法。
- 實作簡單,因此支援廣泛。
- 能承載 TCP 和 UDP。
缺點
- 需要網域和有效憑證,除非使用 REALITY。
- 用戶端的 TLS 交握可能和瀏覽器不同。用戶端提供瀏覽器指紋選項來模仿,但終究只是模仿。
- 研究人員已證明,TLS 包在 TLS 裡(例如透過 Trojan 瀏覽 HTTPS 網站)可能在封包大小和時序上留下特徵。
- 密碼錯誤時不會有錯誤訊息,只會出現回落網站,讓錯誤更難察覺。
- UDP 包在 TCP 連線裡,遇到掉封包時表現會變差,遊戲和通話會感受得到。
Trojan、Shadowsocks、VLESS、VMess 比較
| Trojan | Shadowsocks | VLESS | VMess | |
|---|---|---|---|---|
| 加密 | TLS | 自有加密方式 | TLS 或 REALITY | 自有加密,可選用 TLS |
| 看起來像 | HTTPS | 隨機位元組 | HTTPS | 隨機位元組,搭配 TLS 時像 HTTPS |
| 需要憑證 | 是,或使用 REALITY | 否 | 是,或使用 REALITY | 僅在使用 TLS 時 |
| UDP | 是 | 是 | 是 | 是 |
| 憑證資訊 | 密碼 | 密碼或金鑰 | UUID | UUID |
想深入比較,請閱讀 Shadowsocks 是什麼?、VMess 與 VLESS 比較和代理協定比較。
trojan:// 連結長什麼樣子
服務商以 trojan:// 連結分享 Trojan 伺服器,也常以 QR 碼的形式提供:
trojan://password@host:port?parameters#name
password是伺服器密碼,經過百分比編碼。host和port是伺服器位址和連接埠(省略時為 443)。parameters設定 TLS 和傳輸方式:sni是伺服器名稱,type是傳輸方式(tcp、ws、grpc),host和path用於 WebSocket,serviceName用於 gRPC,security=reality搭配pbk和sid用於 REALITY。name是 App 中顯示的名稱。
以下是幾個範例,密碼都是 secret:
trojan://secret@trojan.example.com:443?sni=trojan.example.com#Basic
trojan://secret@trojan.example.com:443?security=tls&type=ws&host=cdn.example.com&path=%2Fws#WebSocket
trojan://secret@trojan.example.com:443?security=tls&type=grpc&serviceName=TrojanGun#gRPC
trojan://secret@trojan.example.com:443?security=reality&sni=www.example.com&pbk=Z84J2IelR9ch3k8VtlVhhs5ycBUlXA7wHBWcBrjqnAw&sid=0123abcd&fp=chrome#REALITY
Potatso 讀取的所有參數,都列在 Trojan 參考文件中。
在 iPhone 上使用 Trojan
iOS 沒有內建 Trojan 支援,所以你需要一個用戶端 App。Potatso 是適用於 iPhone 和 iPad 的免費代理用戶端,可以匯入 trojan:// 和 trojan-go:// 連結、QR 碼和 Clash 訂閱,並支援 WebSocket、gRPC、HTTP/2、HTTP Upgrade 和 REALITY。請依照逐步教學操作:iPhone 怎麼用 Trojan。
常見問題
- Trojan 代理協定是病毒嗎?
- 不是。Trojan 是一種代理協定,不是惡意軟體。它取名自特洛伊木馬,是因為它把代理流量藏在看似普通的 HTTPS 連線裡,而不是因為它會傷害你的裝置。
- Trojan 需要網域名稱和憑證嗎?
- 傳統的 Trojan 伺服器需要網域名稱和有效的 TLS 憑證,因為它的連線是真正的 TLS。使用 REALITY 的 Trojan 伺服器則借用其他網站的 TLS 交握,所以不需要自己的憑證。
- Trojan 使用哪個連接埠?
- 通常是 HTTPS 的標準連接埠 443,讓連線看起來就像一般的網頁流量。只要伺服器有設定,任何連接埠都可以;trojan:// 連結沒寫連接埠時,就使用 443。
- Trojan 支援 UDP 嗎?
- 支援。Trojan 在與 TCP 相同的 TLS 連線中承載 UDP。在 Potatso 等相容 Clash 的用戶端中,Trojan 伺服器的 UDP 預設為關閉;如果你的伺服器轉送 UDP,請將它開啟。
- Trojan 比 Shadowsocks 好嗎?
- 要看網路環境。Trojan 看起來像 HTTPS,被探測時也會像真正的網站一樣回應;Shadowsocks 則更簡單、不需要憑證,額外負擔也較小。許多服務商兩種都有提供,你可以都試試看。