SOCKS5 和 HTTP 代理最主要的差別,在於它們能承載什麼。HTTP 代理使用 HTTP,以 CONNECT 方法建立 TCP 通道;SOCKS5 代理則運作在更底層,可以轉送任何 TCP 連線,也能轉送通話、遊戲和 QUIC 需要的 UDP。兩者本身都不會加密你的流量。
本文詳細比較 SOCKS5 與 HTTP 代理:UDP、DNS 和 socks5h、HTTPS 代理與 SOCKS5 over TLS 的加密、速度,以及該如何選擇。
SOCKS5 與 HTTP 代理一覽
| HTTP 代理 | SOCKS5 代理 | |
|---|---|---|
| 標準 | HTTP CONNECT(RFC 9110) |
RFC 1928 |
| TCP | 是 | 是 |
| UDP | 否 | 是,需伺服器允許 |
| 由誰查詢網域名稱 | 一律由代理 | 你的裝置或代理(socks5h) |
| 驗證 | 使用者名稱和密碼(Basic) | 使用者名稱和密碼(RFC 1929) |
| 加密 | 否;HTTPS 代理會加上 TLS | 否;SOCKS5 over TLS 會為 TCP 加上 TLS |
| 能讀取一般 HTTP 請求 | 是,在轉發模式下 | 否 |
| 常見連接埠 | 8080、3128 | 1080 |
| iOS「設定」內建 | 是,需逐一為每個 Wi-Fi 網路設定 | 否 |
HTTP 代理如何運作
HTTP 代理看得懂網頁請求,它有兩種運作方式:
- 轉發。 對於一般的
http://網頁,瀏覽器會把整個請求交給代理,由代理取回網頁。代理看得到、也能修改所有內容。 - 通道。 對於其他所有流量(包括每一個 HTTPS 網站),用戶端會送出
CONNECT請求,代理就開啟一條原始的 TCP 通道:
CONNECT example.org:443 HTTP/1.1
Host: example.org:443
Proxy-Authorization: Basic YWxpY2U6czNjcmV0
代理回應 200 後,用戶端就透過這條通道與網站進行 TLS。代理只看得到目的地名稱和連接埠。請注意,Proxy-Authorization 這一行其實只是 alice:s3cret 的 Base64 編碼,所以使用一般 HTTP 代理時,傳輸路徑上的任何人都能讀到你的密碼。
SOCKS5 代理如何運作
SOCKS5 是一個小巧的二進位協定,完全不管你透過它傳送什麼。用戶端先向伺服器打招呼、議定驗證方式,再送出三種指令之一:
- CONNECT:開啟一條 TCP 連線,目標可以是 IPv4、IPv6 位址或網域名稱。
- UDP ASSOCIATE:在另一個連接埠上建立 UDP 轉送。
- BIND:接受傳入的連線,少數舊協定(例如主動模式 FTP)會用到。
因為 SOCKS5 從不檢查你的流量內容,所以任何 App 都能使用,不限於網頁瀏覽器。
UDP:實際使用上最大的差別
語音和視訊通話、許多線上遊戲、DNS,以及 HTTP/3 底層的傳輸協定 QUIC,都使用 UDP。HTTP 代理只承載 TCP。雖然已有較新的標準 CONNECT-UDP,但支援的代理很少。
SOCKS5 可以轉送 UDP,但前提是伺服器有開啟這項功能,而且防火牆允許 UDP 連接埠通過。許多服務商並未開啟,所以在依賴它之前請先確認。
UDP 無法經由代理傳送時,會出現以下兩種情況之一:
- App 改用 TCP。瀏覽器通常會從 QUIC 切換到 HTTP/2,所以網站仍能正常使用。
- UDP 流量直接連線,或是失敗。直接連線的 UDP 會使用你的真實 IP 位址;如果你使用代理是為了隱私,這點就很重要。
DNS:遠端查詢與 socks5h
連上 example.org 之前,必須有人查出它的 IP 位址。
- HTTP 代理一律會在
CONNECT請求中收到名稱,並自行查詢。 - SOCKS5 用戶端可以在本地查詢名稱後送出 IP,也可以直接送出名稱,交給伺服器查詢。後者稱為遠端 DNS,curl 等工具將它寫成
socks5h://。
通常你會想用遠端 DNS。你的本地網路看不到你查詢了哪些名稱,而且你取得的結果會符合代理所在地,這對有地區限制的網站很重要。Potatso 在 TCP 連線上一律送出名稱,所以 socks5:// 和 socks5h:// 連結的效果相同。請見 SOCKS5 參考文件。
加密:HTTPS 代理與 SOCKS5 over TLS
一般的 HTTP 和 SOCKS5 代理,會以明文傳送你和代理之間的所有內容,包括代理密碼和你造訪的網站名稱。HTTPS 網站仍然是端對端加密,但一般 HTTP 流量就不是了。
有兩種變體會在你和代理之間加上 TLS:
- HTTPS 代理是透過 TLS 連上的 HTTP 代理。所有內容(包括
CONNECT請求和密碼)都會加密。請見 HTTP 與 HTTPS 參考文件。 - SOCKS5 over TLS 把 SOCKS5 連線包在 TLS 裡。TCP 會加密,但 SOCKS5 仍在 TLS 連線之外傳送 UDP,所以 UDP 抵達伺服器時是未加密的。
對於檢查流量的人來說,這兩者看起來仍然是代理。如果你需要更難被辨識的流量,請考慮專為此設計的協定,例如 Shadowsocks 或 Trojan。
速度
連線建立後,兩種協定幾乎不會增加負擔:每條連線多幾個位元組,之後資料就直接通過。SOCKS5 的交握稍微精簡一些,HTTP 代理則可能多加一兩個標頭。實際上,決定速度的主要是伺服器的距離、負載和頻寬,而不是協定。加上 TLS 則會讓每條連線多一次交握。
該選哪一種?
- 選 SOCKS5:如果你想讓整台裝置都經由代理,或需要 UDP 來進行通話、玩遊戲或使用 QUIC。對瀏覽器以外的 App 來說,它也是更好的選擇。
- 選 HTTP:如果你只瀏覽網頁、服務商只提供 HTTP,或你想使用 iOS 內建的 Wi-Fi 代理設定(只接受 HTTP)。
- 選 TLS 變體(HTTPS 代理或 SOCKS5 over TLS):只要通往代理的路徑會經過你不信任的網路,例如公共 Wi-Fi。
- 同一組帳密兩種都有? 許多住宅和機房代理服務商會同時提供 HTTP 連接埠和 SOCKS5 連接埠。選 SOCKS5,並保留 HTTP 作為備用。
在 iPhone 上使用 SOCKS5 或 HTTP 代理
iOS 只有逐一為每個 Wi-Fi 網路設定的 HTTP 代理選項,沒有 SOCKS5,也不適用於行動數據。Potatso 是適用於 iPhone 和 iPad 的免費代理用戶端,支援 SOCKS5、SOCKS5 over TLS、HTTP 和 HTTPS 代理,能在任何網路上讓整台裝置經由代理。請依照教學操作:iPhone 如何使用 SOCKS5 代理。若想與加密協定比較,請閱讀代理協定比較。
常見問題
- SOCKS5 比 HTTP 代理快嗎?
- 差別通常感覺不出來。連線建立後,兩者增加的額外負擔都非常小。伺服器的位置、負載和頻寬,遠比你用哪一種協定重要。
- SOCKS5 代理會加密我的流量嗎?
- 不會。一般的 SOCKS5 和 HTTP 代理不會加密任何內容,連代理密碼也不例外。HTTPS 網站仍然是端對端加密,但若要保護你和代理之間的連線,請使用 SOCKS5 over TLS、HTTPS 代理,或 Shadowsocks、Trojan 等加密協定。
- socks5h 是什麼?
- socks5h 表示由代理伺服器(而不是你的裝置)查詢網站的網域名稱。curl 等工具以 socks5h:// 表示這種方式。它讓 DNS 查詢不經過你的本地網路,取得的結果也和代理所在地看到的一致。
- HTTP 代理能處理 HTTPS 網站嗎?
- 可以。用戶端會以 HTTP CONNECT 請求要求代理開啟通道,再透過這條通道與網站進行 TLS。代理看得到網站名稱和連接埠,但看不到網頁內容或資料。
- 哪一種代理支援 UDP?
- SOCKS5,透過它的 UDP ASSOCIATE 指令,前提是伺服器有開啟這項功能。HTTP 代理只承載 TCP,所以語音通話、許多遊戲和 QUIC 都無法經由它傳送。