單元 17 代理的端點、目的位址與解析位置
學習目標與問題
先讀 Socket、DNS、TLS。你應能畫出代理前後的連線,解釋 HTTP CONNECT、SOCKS5 的目的位址編碼,以及誰實際解析名稱。代理是代替應用連往某個目的地的服務,不自動接管電腦全部流量。
17.1 先畫三個角色
客戶 C、代理 P、目標 S。常見 TCP 代理有 C↔P 及 P↔S 兩段 TCP 連線;代理收到 bytes 後在另一條連線送出。傳輸層 ACK 的端點改變了,但內層 HTTPS 若仍在 C 與 S 間,P 不會因此自動取得 HTTP 明文。TCP 終止和 TLS 終止是不同決定。
正向代理替客戶向外連線;反向代理代表服務接收外部請求,再送後端;兩者方向是服務角色,不是有沒有加密。鏈式代理還有額外中繼與解析選擇。記錄拓樸時至少列每段來源/目的端點、轉送單位、TLS 終點與 DNS 發起者。

17.2 HTTP CONNECT
客戶向 HTTP 代理發送 CONNECT lesson.test:443 HTTP/1.1,代理建立目的 TCP 連線,成功回 2xx 後進入隧道。後續 bytes 可以是 TLS,不是每份都由代理解析為 HTTP。一般 CONNECT 建立 TCP 隧道;UDP 代理需要其他擴充,例如 CONNECT-UDP,不能把普通 CONNECT 當任意 IP VPN。
若 C↔P 本身是明文 HTTP,旁觀者可讀 CONNECT 目標,即使內層 HTTPS 仍加密。若代理入口支援 HTTPS,外層 TLS 保護 C↔P 這段,仍需驗證 P 的憑證,內層 TLS 則驗 S。Proxy-Authorization 驗證的是代理使用權,不是目標網站身分。
經正向 HTTP 代理存取未加密的 HTTP 資源時,HTTP/1.1 客戶端須以 absolute-form 送出請求目標(CONNECT 與伺服器整體 OPTIONS 除外,RFC 9112 §3.2.2),例如 GET http://lesson.test/a;P 可讀 HTTP 內容與標頭,這與 CONNECT 隧道不同。明文 C↔P 也會暴露 Proxy-Authorization 等資訊。
17.3 SOCKS5
SOCKS5 先協商驗證方式,再送命令。CONNECT 要求建立 TCP 轉送;BIND 和 UDP ASSOCIATE 是另外功能,實作不一定全支援。目的 ATYP 可表 IPv4、域名、IPv6。域名形式可把解析交給代理;本地先解析再送 IP 則把解析留在客戶。客戶軟體的選項決定實際行為。
UDP ASSOCIATE 通常有 TCP 控制連線與 UDP relay 端點;資料報還有 SOCKS UDP 標頭,不是把應用 UDP 原樣送到 TCP 埠。SOCKS5 本身不提供全面的傳輸加密;帳密驗證若走未保護路徑也不是安全傳送。不要把 SOCKS5 與加密代理協定混為一談。
17.4 完整 DNS 路徑例題
本地先解析 lesson.test 得到 192.0.2.80,再把 IP 交給代理:本地 DNS 看見名稱,代理只收到該 IP,地理選址可能依本地解析器。傳域名給代理:本地不必為該目標查 A,代理用自己的解析器取得位址,當地可能選到不同 CDN。代理本身名稱的 bootstrap 解析仍可能在本地發生。
| 資料 | 本地解析模式 | 遠端解析模式 |
|---|---|---|
| 目標名稱由誰查 | C/其解析器 | P/其解析器 |
| 代理請求目的欄位 | IP+port | 域名+port |
| 目標 TLS 預期名稱 | 仍可為 lesson.test | 同樣可為 lesson.test |
| 要查的失敗點 | 本地解析與代理連線 | 代理解析與出口連線 |
「DNS 經代理」需要具體描述 DNS 請求或解析責任走哪條路,不能只看一個 remote-DNS 開關。DNS 結果、目標名稱驗證與資料出口是三件事。
實驗、習題與檢核
L09 用真實 loopback CONNECT 及 SOCKS5 子集轉送本機 HTTP。它刻意不加密,只演示代理語義;不作公開服務或加密協定的相容性實測。
- 代理終止 TCP 時,是否一定終止內層 HTTPS?
- 普通 CONNECT 可以直接轉送任意 UDP 嗎?
- SOCKS5 域名與 IP ATYP 如何影響 DNS 位置?
- C→P 有 TLS 時,P 是否還知道目的位址?
檢核:能逐段標出 TCP/TLS 端點及誰解析。來源:RFC 9110 CONNECT、RFC 9112 請求目標形式、RFC 1928 SOCKS5、RFC 1929 帳密驗證、RFC 9298 CONNECT-UDP。