兩個獨立網際網路代理閘道之間的受控切換路徑

curl 8.22 調整了重用 curl easy handle 時的一項關鍵行為:修改 CURLOPT_PROXYPORT 現在會被視為更換代理,下一次傳輸前會重設與代理相關的快取狀態。

這個模型更安全。同一主機名稱的不同連接埠可能對應不同產品、地區、驗證領域、上游集區或政策邊界。設定中只改一個數字,並不代表它仍是同一代理端點。

本次變更內容

舊版本在代理主機名稱變更時會重設相關狀態。curl 8.22 把相同邊界延伸至僅代理連接埠變更的情況。上游實作讓主機名稱與連接埠變更共用代理變更處理,並加入迴歸測試。

營運上應採用明確規則:同一主機名稱的連接埠 A 與 B,按兩個獨立代理端點測試。

正式環境為何只切換連接埠

  • 不同連接埠選擇黏性或輪換工作階段;
  • 不同連接埠對應國家、產品或線路集區;
  • 藍綠閘道共用一個 DNS 名稱;
  • 應用程式容錯移轉至備援監聽器;
  • 各監聽器採用不同憑證或驗證政策;
  • 控制平面只改連接埠而不重建客戶端。

因此,連接埠變更既是路由邊界,也可能是安全邊界。

設定狀態不等於連線狀態

修改 easy handle 選項,不能證明下一個請求必定走預期路線。連線重用、多工、DNS 快取、share handle、代理驗證與重試邏輯都會影響實際結果。

測試要同時保留兩類證據:

  1. 設定證據:記錄預期主機、連接埠、代理類型、工作階段政策與請求編號。
  2. 傳輸證據:確認哪個受控監聽器收到請求、是否建立新連線,以及驗證是否針對該監聽器重新協商。

不要只依賴回應本文判斷路由。

建立雙連接埠迴歸測試夾具

準備兩個自行控制的代理監聽器,為它們設定不同的伺服器端標記與驗證領域,避免在日誌或命令歷史中寫入密鑰。

使用同一個 easy handle 執行:

  1. 設定監聽器 A 並完成成功請求。
  2. 只把 CURLOPT_PROXYPORT 改為監聽器 B。
  3. 再請求一次,確認 B 實際收到流量。
  4. 把連接埠切回 A 並重複驗證。
  5. 分別在允許與禁止連線重用時測試。
  6. 依正式環境的 multi handle 與 share handle 拓撲再次測試。

驗收重點不只是「請求成功」,而是每個監聽器只收到所屬流量,並執行各自的驗證流程。

建議記錄的診斷欄位

  • 應用程式請求 ID 與測試案例 ID;
  • curl 版本及建置特性;
  • 預期代理主機名稱與連接埠;
  • 代理模式與工作階段政策;
  • 新建或重用連線;
  • HTTP 狀態與 curl 結果碼;
  • 受控監聽器觀察到的標記;
  • 重試次數與最終路由決策。

使用者名稱、密碼、權杖、工作階段識別碼及完整代理 URL 必須遮罩。日誌應能說明狀態是否跨越連接埠邊界,但不能洩漏憑證。

不洩漏憑證地測試驗證

為 A 與 B 使用不同的測試憑證或驗證領域。A 接受的憑證不應在 B 上表現為已驗證。至少加入以下負向案例:

  • B 拒絕 A 的測試憑證;
  • 407 Proxy Authentication Required 被識別為驗證失敗;
  • 重試不會退回直接連線;
  • 政策錯誤不會觸發無限輪換;
  • 日誌只記錄遮罩後的端點標籤。

遇到 407 時,可依照代理驗證 407 疑難排解指南逐層檢查。

升級驗收清單

  • 盤點所有在重用 handle 上修改 CURLOPT_PROXYPORT 的程式路徑。
  • 用受控監聽器完成 A → B → A 測試。
  • 涵蓋新連線、重用連線、multi handle 與 share handle。
  • 驗證各連接埠獨立驗證及伺服器端路由證據。
  • 確認重試有上限且留在核准的代理路徑。
  • 除非政策明確允許,否則禁止直接連線回退。
  • 清除日誌中的憑證與工作階段權杖。
  • 比較升級前後錯誤率、407 比例、延遲及連線重用率。
  • 分階段推出,並保留已驗證的復原程序。

也可搭配代理憑證輪換代理繞過稽核代理容錯移轉復原演練完成上線準備。

常見問題

新連接埠一定代表不同伺服器嗎?

基礎設施層不一定,但應用程式應將它視為不同端點,除非營運方已透過測試證明政策完全一致。

請求成功就代表升級驗證通過嗎?

不代表。錯誤路線重用或錯誤驗證狀態仍可能回傳成功。必須驗證接收方監聽器及連線生命週期。

每次請求都要新建 easy handle 嗎?

不需要。重用 handle 合法且有效率,關鍵是驗證真實生命週期中的端點切換會重設正確狀態。

新連接埠驗證失敗時怎麼辦?

應故障關閉、清楚回報 407、執行有上限的重試,絕不能靜默繞過代理。

來源說明與合規

本文依據 curl 於 2026 年 9 月 2 日發布的 8.22 變更記錄,以及 curl 專案於 2026 年 5 月 3 日合併的變更集 21485。來源地址只保留在內部營運記錄。

代理只能用於獲授權的系統與資料。請遵守合約、隱私要求、速率限制、適用的 robots 指示及地區法律。本文不建議繞過存取控制或平台防護。