prefix 偽裝的連線

自 Outline 用戶端 1.9.0 版起,存取金鑰支援「prefix」選項。「prefix」是 Shadowsocks TCP 連線中做為開頭的一串位元組。這可以使連線偽裝成網路中允許的協定,從而繞過防火牆對未知通訊協定的封鎖。

何時應嘗試使用 prefix?

如果您懷疑 Outline 部署的使用者仍然受到封鎖,可以考慮嘗試幾組 prefix。

操作說明

prefix 的長度不應超過 16 個位元組。較長的 prefix 可能會導致鹽值重複,因而影響加密安全性,使得連線被偵測到。建議盡可能使用最短的 prefix 來繞過封鎖。

您使用的通訊埠應與 prefix 偽裝的通訊協定一致。在 IANA 維護的傳輸通訊協定埠號註冊表中,您可以查看各種通訊協定對應的埠號。

以下是一些模擬常見通訊協定的有效 prefix:

建議通訊埠 JSON 編碼 網址編碼
HTTP 要求 80 (http) "POST " POST%20
HTTP 回應 80 (http) "HTTP/1.1 " HTTP%2F1.1%20
DNS-over-TCP 要求 53 (dns) "\u0005\u00DC\u005F\u00E0\u0001\u0020" %05%C3%9C_%C3%A0%01%20
TLS ClientHello 443 (https)、463 (smtps)、563 (nntps)、636 (ldaps)、989 (ftps-data)、990 (ftps)、993 (imaps)、995 (pop3s)、5223 (Apple APN)、5228 (Play 商店)、5349 (turns) "\u0016\u0003\u0001\u0000\u00a8\u0001\u0001" %16%03%01%00%C2%A8%01%01
TLS 應用程式資料 443 (https)、463 (smtps)、563 (nntps)、636 (ldaps)、989 (ftps-data)、990 (ftps)、993 (imaps)、995 (pop3s)、5223 (Apple APN)、5228 (Play 商店)、5349 (turns) "\u0013\u0003\u0003\u003F" %13%03%03%3F
TLS ServerHello 443 (https)、463 (smtps)、563 (nntps)、636 (ldaps)、989 (ftps-data)、990 (ftps)、993 (imaps)、995 (pop3s)、5223 (Apple APN)、5228 (Play 商店)、5349 (turns) "\u0016\u0003\u0003\u0040\u0000\u0002" %16%03%03%40%00%02
SSH 22 (ssh)、830 (netconf-ssh)、4334 (netconf-ch-ssh)、5162 (snmpssh-trap) "SSH-2.0\r\n" SSH-2.0%0D%0A

動態存取金鑰

如要在動態存取金鑰 (ssconf://) 中使用 prefix 功能,請在 JSON 物件中新增「prefix」鍵,並將所需的 prefix 以 JSON 編碼表示 (參見上表示例)。您可以使用 \u00FF 之類的逸出代碼,表示 U+0U+FF 範圍內的不可列印 Unicode 代碼點,例如:

{
    "server": "example.com",
    "server_port": 8388,
    "password": "example",
    "method": "chacha20-ietf-poly1305",
    "prefix": "\u0005\u00DC\u005F\u00E0\u0001\u0020"
}

靜態存取金鑰

如要在靜態存取金鑰 (ss://) 中使用 prefix,您需要先修改現有金鑰再發布。如果您使用 Outline Manager 生成的靜態存取金鑰,請將您的 prefix 轉換為網址編碼版本 (參見上表示例),然後加入存取金鑰末端,如下所示:

ss://Z34nthataITHiTNIHTohithITHbVBqQ1o3bkk@127.0.0.1:33142/?outline=1&prefix=<your url-encoded prefix goes here>

對於進階使用者,您可以運用瀏覽器的 encodeURIComponent() 函式將 JSON 編碼的 prefix 轉換為網址編碼版本。如要這麼做,請開啟網頁檢查器控制台 (在 Chrome 中依序點選「Developer」>「JavaScript Web Console」) 並輸入以下內容:

encodeURIComponent("<your json-encoded prefix goes here>")

按下 Enter 鍵,生成的值即為「網址編碼」版本,例如:

encodeURIComponent("\u0016\u0003\u0001\u0000\u00a8\u0001\u0001")
'%16%03%01%00%C2%A8%01%01'