
代理環境變數讓自動化更方便,但過寬的 NO_PROXY 會悄悄把流量移出預期代理路徑,暴露用戶端網路、破壞地區測試、繞過監控,或使 CI 與正式環境行為不同。
正確目標不是盡量多地繞過代理,而是只保留業務真正需要的最小直連清單,並以正式使用的執行環境和版本驗證。
NO_PROXY 的作用
HTTP_PROXY、HTTPS_PROXY 與 ALL_PROXY 選擇代理;NO_PROXY 或 no_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 防護不一致。
- 使地區測試使用用戶端位置。
- 讓不同工作節點行為不一致。
繞過清單應視為安全設定,變更需審查並指定負責人。
可重複驗證流程
- 盤點確實需要直連的內部 API、健康檢查、回環位址與私人網路。
- 為每條規則建立路由矩陣,涵蓋匹配、不匹配、父網域、子網域、IPv4、IPv6 與連接埠。
- 使用脫敏詳細日誌、代理存取日誌或受控測試端點確認真實路徑。
- 在 curl、應用程式碼、容器、CI 和瀏覽器自動化中分別測試。
- 將矩陣轉成回歸測試,路由意外改變時阻止部署。
常見錯誤
使用 NO_PROXY=*
星號通常會停用所有代理,只適合受控診斷,不應作為長期修復。
假設大小寫變數完全相同
不同用戶端優先順序不同,curl 對小寫 http_proxy 還有特殊處理。應刪除互相衝突的重複變數。
跨語言複製語法
Python、Go、curl、Java 和瀏覽器工具對後綴、連接埠、IPv6、CIDR 的支援不同,必須逐一驗證。
只測試成功,不測試路徑
請求直連和走代理都可能成功。應以代理是否實際收到請求為準。
正式環境檢查清單
- 每條繞過規則都有負責人與原因。
- 網域規則涵蓋正常與相似網域測試。
- 連接埠行為已驗證。
- CIDR 範圍最小且用戶端支援。
- IPv4 與 IPv6 分開測試。
- 大小寫環境變數不衝突。
- 重新導向目標納入測試。
- 設定輸出不含憑證。
- 開發、CI 與類正式環境均執行路由測試。
- 使用符合適用法律、目的條款與組織政策。
需要可控代理路由與地區測試時,可查看 98IP 的設定資訊。繞過規則應保持最小、可觀察,並由回歸測試保護。
內部研究依據:curl 環境變數與 --noproxy 文件、Python urllib.request 代理文件、Go 代理環境實作文件。僅列資料名稱,不提供外部連結。