Shadowsocks 是一種加密代理協定。你的裝置會把每一條連線送往 Shadowsocks 伺服器,並以只有你和伺服器知道的金鑰加密,再由伺服器替你連上網站。它很輕量,可以承載 TCP 和 UDP,而且沒有可辨識的交握流程,所以在網路上看起來就像一串隨機位元組。

本文說明 Shadowsocks 是什麼、如何運作、該用哪種加密方式、外掛程式的作用、如何看懂 ss:// 連結,以及 Shadowsocks 和 VPN 的差別。已經有伺服器了?直接看 iPhone 怎麼用 Shadowsocks。

Shadowsocks 是什麼?

Shadowsocks 分成兩部分:裝置上的用戶端,以及由你或服務商架設的伺服器。兩者共用一種加密方式和一組密碼(最新的加密方式則改用金鑰)。每當 App 開啟一條連線,用戶端就會把它加密後送往伺服器。伺服器解密後連上真正的目的地,並在兩端之間雙向轉送資料。

這個協定是公開的,記載在 shadowsocks.org 上一系列「SIP」規格中。正因如此,它幾乎無所不在:有 Rust、C 和 Go 寫的伺服器,sing-box、Xray、Mihomo 等大多數多協定工具也都內建支援。幾乎每家代理服務商都能提供 Shadowsocks 伺服器。

發展簡史

  • 2012 年:一位名為 clowwindy 的開發者以小型 Python 專案的形式發布 Shadowsocks。它是為身處審查網路、需要比完整 VPN 更簡單輕巧工具的人所設計。
  • 2015 年:原作者停止維護專案,並從 GitHub 移除程式碼。社群透過 shadowsocks-libev 等分支延續專案,後來又出現了 shadowsocks-rust。
  • 2017 年:AEAD 加密方式(SIP004)取代原本的串流加密,成為建議選項,修正了舊設計在完整性上的問題。
  • 2022 年:Shadowsocks 2022 版(SIP022)加入固定長度金鑰和防重放保護。

Shadowsocks 的運作原理

當你 iPhone 上的 App 透過 Shadowsocks 伺服器載入網頁時,會依序發生以下事情:

  1. 用戶端 App 擷取這條連線。在 iOS 上,它是透過 VPN 設定來做到的。
  2. 用戶端以共用金鑰加密目的地(例如 example.org:443)和第一批資料,再送往伺服器的位址與連接埠。
  3. 伺服器解密。如果因為密碼或加密方式錯誤而無法解密,伺服器就直接中斷連線。
  4. 伺服器連上 example.org:443,雙向轉送資料,並把所有回傳給你的資料加密。
  5. UDP 封包(例如語音通話)會逐一加密,再送到同一個伺服器連接埠。
iPhone ──(encrypted Shadowsocks)──▶ ss.example.com:8388 ──(normal connection)──▶ example.org

整個過程沒有問候訊息,也沒有憑證交換。最前面的位元組是一段隨機 salt,接著就是密文。這讓 Shadowsocks 能很快建立連線,但也代表密碼錯誤時不會有任何錯誤訊息:連線只會逾時。

Shadowsocks 加密方式:2022、AEAD 與串流加密

加密方式決定流量如何被加密。Shadowsocks 有三大類:

類別 範例 建議
2022(SIP022) 2022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm、2022-blake3-chacha20-poly1305 伺服器支援時的最佳選擇
AEAD(SIP004) aes-256-gcm、aes-128-gcm、chacha20-ietf-poly1305 很好,支援也非常廣泛
串流加密 aes-256-cfb、chacha20-ietf、rc4-md5 舊式。只有在伺服器沒有其他選項時才使用

AEAD 加密方式會驗證每一段資料,所以伺服器會拒絕途中遭到修改的內容。舊式的串流加密只負責加密:資料可能被竄改而雙方都不會察覺,使用這類加密的伺服器也更容易被探測。

2022 加密方式更進一步。它們使用隨機金鑰而不是密碼,所以不會有弱密碼的問題;加入時間戳記和防重放保護,錄下來的連線無法直接重送;也允許多位使用者共用同一個連接埠,各自使用自己的金鑰(SIP023)。2022 金鑰是固定長度的 Base64 字串,可以這樣產生:

openssl rand -base64 16

2022-blake3-aes-128-gcm 需要 16 位元組,其他 2022 加密方式需要 32 位元組。Potatso 支援的加密方式完整清單,請見 Shadowsocks 參考文件。

Shadowsocks 外掛程式

外掛程式(SIP003)會在 Shadowsocks 連線外再包一層,讓它看起來像別的東西:

  • simple-obfs 讓連線看起來像一般的 HTTP,或 TLS 工作階段的開頭。
  • v2ray-plugin 和 gost-plugin 透過 WebSocket 傳送,也可以加上 TLS,因此能穿過 CDN 或網頁伺服器。
  • ShadowTLS、Restls 和 JLS 會先與一個掩護網站完成真正的 TLS 交握,再交棒給 Shadowsocks。

外掛程式也有代價。每一種都會增加額外負擔,而且大多只承載 TCP,所以 UDP 要不是繞過外掛程式,就是無法使用。有些外掛程式,例如 Cloak 和 kcptun,是獨立的程式,iOS App 無法在用戶端旁邊執行它們。

ss:// 連結長什麼樣子

服務商通常以 ss:// 連結(SIP002)分享伺服器,也常以 QR 碼的形式提供:

ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:8388#Tokyo
  • YWVzLTI1Ni1nY206c2VjcmV0 是 aes-256-gcm:secret 的 Base64 編碼,也就是加密方式和密碼。
  • ss.example.com:8388 是伺服器位址和連接埠。
  • #Tokyo 是 App 中顯示的名稱。

2022 伺服器會以明文、百分比編碼的形式寫出加密方式和金鑰,外掛程式則放在 plugin 參數中:

ss://2022-blake3-aes-128-gcm:MTIzNDU2Nzg5MDEyMzQ1Ng%3D%3D@ss.example.com:8388#2022
ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:443/?plugin=simple-obfs%3Bobfs%3Dtls%3Bobfs-host%3Dcdn.example.com#Obfs

伺服器很多的服務商,通常會改給你一個列出全部伺服器的訂閱 URL。請見代理訂閱是什麼?

Shadowsocks 和 VPN 的差別

很多人把 Shadowsocks 叫做 VPN,但它的運作方式和 WireGuard、OpenVPN 或 IPsec 不同:

Shadowsocks 傳統 VPN
承載內容 個別的 TCP 連線和 UDP 封包 所有 IP 封包,經由虛擬網路
交握 沒有可見的交握,看起來像隨機位元組 有可辨識的交握
路由 用戶端可以依規則逐站選擇 通常是全部流量,或依 IP 範圍
在 iPhone 上 需要用戶端 App iOS 內建 IKEv2,其他類型需要 App
伺服器看得到什麼 你連到的網站 你連到的網站

在 iPhone 上,兩者的界線變得模糊:Shadowsocks 用戶端會用 iOS 的 VPN 設定來擷取流量,所以你會看到 VPN 圖示。但從手機送出去的是 Shadowsocks,而不是 VPN 協定。

兩者都不是匿名工具。伺服器營運者看得到你連到哪裡,所以請選擇你信任的服務商,或自行架設伺服器。

優點與缺點

優點

  • 簡單輕量,額外負擔非常小。
  • 能承載 UDP,所以通話、遊戲和 QUIC 都能正常運作。
  • 幾乎所有用戶端、伺服器和服務商都支援。
  • 現代的 2022 和 AEAD 加密方式設計良好。

缺點

  • 看起來完全隨機的流量本身就可能是一種特徵。研究人員已證明這種模式可以被偵測,這也是以 TLS 為基礎的協定流行起來的原因。
  • 不用外掛程式就沒有 TLS 偽裝,而外掛程式大多不支援 UDP。
  • 舊伺服器可能仍在使用脆弱的串流加密。
  • 設定錯誤時不會有任何提示,問題更難排查。

Shadowsocks 和其他協定的比較

協定 看起來像 UDP 需要憑證
Shadowsocks 隨機位元組 是 否
Trojan HTTPS 是,在 TLS 內 是,或使用 REALITY
VLESS + REALITY 連往借用網站的 HTTPS 是 否
Hysteria 2 HTTP/3(QUIC) 是 通常需要

想看更完整的比較,請閱讀代理協定比較。

在 iPhone 上使用 Shadowsocks

iOS 本身不支援 Shadowsocks,所以你需要一個用戶端 App。Potatso 是適用於 iPhone 和 iPad 的免費代理用戶端,可以匯入 ss:// 連結、QR 碼和訂閱,支援 2022 和 AEAD 加密方式,並內建常見的外掛程式。請依照逐步教學操作:iPhone 怎麼用 Shadowsocks。

常見問題

Shadowsocks 是 VPN 嗎?
不是。Shadowsocks 是一種加密代理協定:它把 App 的連線逐一經由伺服器轉送,而 VPN 是把所有網路封包都放進通道。在 iPhone 上,用戶端 App 會用 VPN 設定來擷取流量,但送到伺服器的仍然是 Shadowsocks。
Shadowsocks 安全嗎?
使用 2022 或 AEAD 加密方式時,裝置與伺服器之間的流量會經過加密,也能防止竄改。不過伺服器仍看得到你連到哪些網站,所以只使用你信任的伺服器,並避免 rc4-md5 這類舊式串流加密。
哪一種 Shadowsocks 加密方式最好?
如果伺服器支援,請使用 2022-blake3-aes-128-gcm 這類 2022 加密方式;否則使用 aes-256-gcm 或 chacha20-ietf-poly1305。用戶端的加密方式必須和伺服器設定完全一致。
Shadowsocks 支援 UDP 嗎?
支援。Shadowsocks 能轉送 TCP 和 UDP,所以語音通話、遊戲和 QUIC 都能經由它傳送。大多數外掛程式只承載 TCP,因此使用外掛程式的伺服器,通常會讓 UDP 不經外掛程式轉送,或乾脆不轉送 UDP。
Shadowsocks 會被偵測到嗎?
它沒有可見的交握流程,所以比許多 VPN 協定更難辨識,但並非無法偵測。看起來完全隨機的流量本身就可能很顯眼,這也是外掛程式和 Trojan 這類以 TLS 為基礎的協定出現的原因。

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