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 的運作原理

  1. TLS 交握。 用戶端連上伺服器(通常是 443 連接埠),並以 trojan.example.com 之類的伺服器名稱(SNI)開始 TLS。伺服器出示該名稱的有效憑證。
  2. Trojan 請求。 在加密的連線中,用戶端送出密碼的 SHA-224 雜湊值、一個指令(connect 或 UDP associate),以及目的地,例如 example.org:443。
  3. 檢查。 伺服器將雜湊值與使用者的密碼比對。
  4. 轉送或回落。 雜湊值相符時,伺服器連上目的地並雙向轉送資料;不相符時,伺服器把整條連線交給回落(fallback)網頁伺服器,讓訪客看到一個普通網站。
  5. 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 則更簡單、不需要憑證,額外負擔也較小。許多服務商兩種都有提供,你可以都試試看。

其他語言版本: English · 简体中文 · 日本語 · Русский