选择性代理绕过路由示意图

代理环境变量让自动化更方便,但过宽的 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 代理环境实现文档。仅列资料名称,不提供外部链接。