選擇性代理繞過路由示意圖

代理環境變數讓自動化更方便,但過寬的 NO_PROXY 會悄悄把流量移出預期代理路徑,暴露用戶端網路、破壞地區測試、繞過監控,或使 CI 與正式環境行為不同。

正確目標不是盡量多地繞過代理,而是只保留業務真正需要的最小直連清單,並以正式使用的執行環境和版本驗證。

NO_PROXY 的作用

HTTP_PROXYHTTPS_PROXYALL_PROXY 選擇代理;NO_PROXYno_proxy 指定直接連線目標,通常是逗號分隔的主機、網域後綴、IP 位址,以及部分用戶端支援的連接埠或 CIDR 網路。

export HTTPS_PROXY="$PROXY_ENDPOINT"
export NO_PROXY="localhost,127.0.0.1,.internal.example,10.0.0.0/8"

範例只使用佔位符與私人網路。真實憑證必須保存在受保護的機密庫。

精確主機與網域後綴

精確主機名稱應只繞過單一主機,網域後綴可能影響全部子網域。不同用戶端對前導點與裸網域是否匹配子網域的處理不完全一致,不能假設 curl、Python、Go、Java、瀏覽器和容器行為相同。

每條規則至少測試父網域、預期子網域與一個相似但無關的網域。避免過寬字串,並注意大小寫和尾端點號。

連接埠差異

部分執行環境支援 host:port,另一些只匹配主機。一個服務可能只要求特定內部連接埠直連,其他連接埠仍應走代理。必須用實際函式庫驗證。

同時檢查預設連接埠、明確連接埠,以及重新導向後的新主機或連接埠。

IP 與 CIDR

現代 curl 支援數字 IP 和 CIDR。10.0.0.0/8 雖然簡潔,卻是很大的繞過範圍,應使用更窄網段,並確認部署版本支援 CIDR。

IPv6 字面值規則也可能不同。curl 在 NO_PROXY 中使用不帶 URL 方括號的 IPv6 數值。IPv4 與 IPv6 應分開測試。

DNS 會改變結果

網域規則不一定等同 IP 規則。用戶端可能在解析前比較主機名稱,也可能依函式庫實作檢查解析後位址。開發、CI 與正式環境的 DNS 結果也可能不同。

記錄原始主機名稱、位址家族和最終路由,但不要記錄憑證。目標位址經常變動時,優先使用已驗證的精確網域規則。

過寬繞過的風險

  • 暴露原本只應顯示代理出口的用戶端網路。
  • 繞過企業檢查或出口控制。
  • 讓不可信輸入選擇直連目標。
  • 造成 SSRF 防護不一致。
  • 使地區測試使用用戶端位置。
  • 讓不同工作節點行為不一致。

繞過清單應視為安全設定,變更需審查並指定負責人。

可重複驗證流程

  1. 盤點確實需要直連的內部 API、健康檢查、回環位址與私人網路。
  2. 為每條規則建立路由矩陣,涵蓋匹配、不匹配、父網域、子網域、IPv4、IPv6 與連接埠。
  3. 使用脫敏詳細日誌、代理存取日誌或受控測試端點確認真實路徑。
  4. 在 curl、應用程式碼、容器、CI 和瀏覽器自動化中分別測試。
  5. 將矩陣轉成回歸測試,路由意外改變時阻止部署。

常見錯誤

使用 NO_PROXY=*

星號通常會停用所有代理,只適合受控診斷,不應作為長期修復。

假設大小寫變數完全相同

不同用戶端優先順序不同,curl 對小寫 http_proxy 還有特殊處理。應刪除互相衝突的重複變數。

跨語言複製語法

Python、Go、curl、Java 和瀏覽器工具對後綴、連接埠、IPv6、CIDR 的支援不同,必須逐一驗證。

只測試成功,不測試路徑

請求直連和走代理都可能成功。應以代理是否實際收到請求為準。

正式環境檢查清單

  • 每條繞過規則都有負責人與原因。
  • 網域規則涵蓋正常與相似網域測試。
  • 連接埠行為已驗證。
  • CIDR 範圍最小且用戶端支援。
  • IPv4 與 IPv6 分開測試。
  • 大小寫環境變數不衝突。
  • 重新導向目標納入測試。
  • 設定輸出不含憑證。
  • 開發、CI 與類正式環境均執行路由測試。
  • 使用符合適用法律、目的條款與組織政策。

需要可控代理路由與地區測試時,可查看 98IP 的設定資訊。繞過規則應保持最小、可觀察,並由回歸測試保護。

內部研究依據:curl 環境變數與 --noproxy 文件、Python urllib.request 代理文件、Go 代理環境實作文件。僅列資料名稱,不提供外部連結。