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