文章

NO_PROXY 不生效?域名后缀、CIDR 与程序差异怎么查

NO_PROXY 不生效,先核对三件事:出问题的程序是否读取它、目标名称是否按该程序的规则命中、请求是否还受到 TUN 或 VPN 路由接管。**NO_PROXY 是应用代理的绕过配置,不是系统级的“强制直连”开关。**同一份列表在 curl 中有效,不能证明另一个程序也采用相同规则。

先确认变量交给了哪个程序

Docker 官方代理说明提醒,代理环境变量的处理方式和格式并没有统一标准。因此,排查对象应具体到程序与版本,而不是笼统地说“电脑已经设置了 NO_PROXY”。

例如,终端里的 curl、IDE 插件、运行中的容器应用和后台服务,可能来自不同的启动环境,也可能使用各自的代理配置。先记录实际失败的命令、目标主机与端口,以及程序从哪里取得代理地址。

在 PowerShell 中修改环境变量,只影响当前会话及继承它的后续子进程。已经运行的另一个程序,不应被假定自动获得修改。Microsoft 环境变量说明

检查时只查看相关变量,不要把包含密码、令牌的全部环境输出贴到公开日志。容器中的应用还应核对容器创建时的有效设置,具体可看容器代理配置排查。

列表写的是主机规则,不是网址路径

以 curl 为例,NO_PROXY 是逗号分隔的主机或域名列表。写入 example.com,不是只绕过某个页面;它也不是为 /api/ 这一条路径设置例外。应把 URL 中的主机部分和路径分开理解。

libcurl 的 NOPROXY 文档说明,域名条目可以匹配该名称及其子域名;只支持单独的 * 作为匹配全部主机的通配符。不要把它当成正则表达式或任意形式的文件名通配规则。

curl 中的条目 应怎样理解
example.com 可覆盖根域及 api.example.com,不应匹配 notexample.com
*.example.com 不要按通用 glob 通配符理解,优先使用文档规定的域名写法
* 绕过所有主机的应用代理,影响范围很大

Go 的 httpproxy 文档还明确区分了前导点:example.com 匹配根域和子域,而 .example.com 只匹配子域,不包含根域。该实现也允许部分条目带字面端口。它说明了为什么不能把某个程序的写法直接复制给所有工具;具体应用是否使用这个实现,仍需核对。

CIDR 不是域名后缀的另一种写法

192.168.0.0/16 描述一个 IP 地址范围;.example.com 描述域名范围,两者解决不同问题。curl 从 7.86.0 起支持用 CIDR 表达绕过的 IP 网络,旧版本不能仅凭配置文字相同就推定支持。curl 代理环境变量文档

尤其不要仅凭“域名解析到了内网 IP”就宣布例外必定命中。需要确认程序比较的是哪个目标字段,以及是否实现了你预期的 IP 匹配方式。目标本来按域名访问时,优先为需要绕过的域名制定并验证规则,不要靠换成 IP URL 来掩盖证书或虚拟主机问题。

用两轮 curl 对照缩小范围

下面的测试用于确认 curl 自己是否选用了显式代理,不修改环境变量或永久配置。先运行 curl.exe --version;示例中的 proxy_used 输出变量需要 curl 8.7.0 或更高版本。

输入真实的本机 HTTP 代理入口和一个允许测试的普通 HTTPS 页面,不要输入订阅链接或带账户密码的代理 URL。第一轮使用空绕过列表,第二轮只加入目标主机名。

$proxyUrl = Read-Host '输入本机 HTTP 代理地址和真实端口,不含账号密码'
$targetUrl = Read-Host '输入要测试的普通 HTTPS 页面 URL'
$targetHost = ([uri]$targetUrl).DnsSafeHost

foreach ($rule in @('', $targetHost)) {
    $curlArgs = @(
        '-q', '--proxy', $proxyUrl, "--noproxy=$rule",
        '--silent', '--show-error', '--connect-timeout', '10',
        '--max-time', '20', '--output', 'NUL',
        '--write-out', "rule=$rule proxy=%{proxy_used} status=%{response_code}`n",
        $targetUrl
    )
    curl.exe @curlArgs
}

这里用 --noproxy=值 把空值明确作为同一个参数传递;空列表用于本轮启用所指定的代理,目标主机列表用于另一轮绕过。命令行选项覆盖本次绕过设置,不应把这个实验误当成已经验证了原环境变量。

根据 curl 手册,proxy_used 报告该传输是否使用代理,response_code 是响应码。两轮各启动一个 curl 进程,没有关闭证书校验,也不跟随跳转;记录实际错误,不给失败请求补上成功结论。

对照观察 能说明什么
第一轮 proxy=1,第二轮 proxy=0 本次 curl 的目标主机绕过对照符合预期
显式对照有效,原命令仍异常 回查原进程环境、配置来源与列表内容
curl 有效,业务程序无效 查业务程序自己的支持范围和匹配规则
出现 status=000 或连接错误 还没有正常 HTTP 响应,继续保留错误排查可达性

如果版本不支持输出变量,应记录工具限制,使用相应版本文档与客户端连接记录核对。不要把“未知变量”报错解释成 NO_PROXY 没有命中。

为什么 proxy=0,出口 IP 还是 VPN?

它只说明 curl 没有使用这里配置的应用代理;请求仍可能进入系统 TUN 或 VPN。应用代理选择和系统路由是两层问题,背景见规则、全局与 TUN 的区别。

同理,加入绕过列表后连接超时,可能是直连路径原本不可用,不能只凭超时认定规则无效。先确认选择了什么路径,再判断这条路径能否访问目标。

让配置保持可维护

先用一个真实目标验证,再逐项扩大范围;不要为了修一个服务就长期保留 *。确认程序和启动环境后,再把有效规则写回它实际使用的配置来源。一般终端接入问题可继续看Git 与 curl 的代理排查。

程序/版本/启动方式 目标主机与端口 绕过条目及来源 显式对照结果 原程序复测结果
待填写 待填写 待填写 待填写 待填写

资料核对日期:2026-11-01。本文核对官方文档,未运行读者设备上的连接测试;curl 与 Go 的示例均不代表所有软件的行为。

评论

搜索文章

正在加载搜索…