### [代理IP明明已配置却被NO_PROXY绕过?环境变量、CIDR与进程继承排查](https://www.jiyueip.com/article/13397) **Published:** 2026-07-30T05:38:25 **Author:** 斑斓 **Excerpt:** 配置了HTTP或SOCKS5代理却发现请求仍从直连出口发出,常见原因不是代理失效,而是NO_PROXY规则命中… 代理IP配置后,浏览器或脚本仍访问到直连出口,先别急着更换代理。很多客户端会读取 `NO_PROXY`(也写作 `no_proxy`)并对本地域名、内网地址、后缀或CIDR执行直连;另外,Shell里设置的变量不一定会传给systemd、Docker或IDE启动的进程。要判断问题,必须同时核对规则、进程环境和实际请求路径。 ## NO\_PROXY到底控制什么 `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY`用于声明代理入口,`NO_PROXY`用于声明例外。不同库对通配符、端口、前导点、CIDR和IPv6的支持并不完全一致;同一个值在curl、Python requests、Node或Java进程中的解释可能不同。因此不要只看变量“有没有”,还要确认客户端文档定义和最终命中规则。 ## 先在受控目标上做直连/代理对照 准备一个自己管理的回显接口,返回请求到达的时间、连接信息和应用记录的来源地址,不要把真实账号、Cookie或业务数据发送到第三方测试站。先显式指定代理,再清空NO\_PROXY进行对照: ``` curl -v --proxy http://user:password@proxy.example:port https://echo.example.test/trace curl -v --proxy http://user:password@proxy.example:port --noproxy "" https://echo.example.test/trace ``` 命令中的主机、凭据和测试域名均为占位符。观察curl输出的连接目标、CONNECT过程和自有接口日志;如果第二条才经过代理,说明原来的例外规则命中了,而不是代理入口必然失效。 ## 检查大小写和进程继承 ``` env | grep -iE '^(http|https|all|no)_proxy=' systemctl show --property=Environment docker exec sh -c 'env | grep -iE "^(http|https|all|no)_proxy="' ``` 有些程序优先读取小写变量,有些会在大小写同时存在时采用其中一个;还可能因systemd环境文件、Docker Compose、CI变量或IDE启动配置而与当前终端不同。修改Shell并不会自动改变已经运行的服务,重启前应先在受控环境验证变量值和作用范围。 ## 逐项审查规则,而不是简单删掉NO\_PROXY 把规则拆成域名、主机名、IP、端口和网段,确认是否包含目标地址或其父域名。常见误区包括: - 把 `.example.test` 当成所有客户端都支持的后缀匹配。 - 使用过宽的 `*`,导致所有请求直连。 - 只写IPv4,却因解析优先级实际连接到IPv6。 - 在容器里写了服务名,客户端却按最终解析IP判断。 - 规则带端口,而目标请求使用了另一个端口。 规则应按最小例外原则编写,只绕过确实需要直连的内部服务;不要为了“看起来能用”把整个网段或所有域名加入例外。 ## 不同客户端的验证方式 Python requests默认可能信任环境变量,可在测试代码中明确设置 `trust_env` 或传入 `proxies`,再记录最终请求路径;Node、Java和浏览器扩展也各有代理优先级。验证时固定一个URL、一个进程启动方式和一组脱敏日志,分别测试环境变量、代码配置和系统代理,避免把多个变量混在一起。 ## 修正后的验收清单 1. 记录生效进程的代理变量和NO\_PROXY规则,确认没有重复大小写或旧配置。 2. 在自有回显接口上做代理、清空例外、恢复例外三组对照。 3. 分别验证域名、IPv4、IPv6和端口,确认解析结果与规则一致。 4. 重启实际服务后再次检查进程环境和应用日志。 5. 把例外规则、变更时间和回滚值纳入配置管理。 代理IP是否生效,最终要以请求链路和自有系统日志为准。NO\_PROXY不是“代理坏了”的同义词,而是一条会改变路由选择的配置规则;先确认命中关系,再决定修改范围,通常比盲目换IP更快也更安全。 **Tags:** HTTP代理, SOCKS5代理, 代理IP, 代理协议, 代理认证 **Categories:** 行业洞察 ---