系统代理开了却不生效:浏览器扩展冲突与终端环境变量分开排查

浏览器端检查代理扩展和系统代理设置,终端端检查 http_proxy、https_proxy 环境变量,说明命令行程序为什么默认不走系统代理。

本文速览

适合已经在 v2rayN 开启系统代理,但浏览器或命令行仍无法连接的桌面端用户。先验证本地代理入口,再分别检查浏览器扩展、系统代理来源、终端环境变量与绕过规则。通过显式代理和直连对照,可以判断问题位于应用设置、本地监听,还是远端连接,避免反复换节点却没有改变请求路径。

系统代理不等于所有应用接管

v2rayN 的“系统代理”主要是把本地代理地址写入操作系统的代理配置。应用是否读取这份配置,由应用本身决定。浏览器通常能够读取系统代理,但扩展、启动参数或企业策略也可能覆盖它;curl 等命令行工具通常使用自己的参数和环境变量,不能仅凭托盘菜单已勾选,就认定终端请求已经进入客户端。

应用代理选择 本地代理入口 内核路由匹配 目标连接

还要区分“请求进入客户端”和“请求走远端代理”。请求即使到达本地入口,仍可能被路由规则判为直连。系统代理负责入口选择,路由分流负责后续出站,两者不是同一层设置。VMess、VLESS 等节点协议也不是浏览器应该填写的代理类型;浏览器连接的是客户端提供的 HTTP 或 SOCKS 本地入口。

先验证 v2rayN 本地监听端口

以下示例使用 127.0.0.1:10808 作为已启用 HTTP 代理能力的本地入口。它是排查用的示例地址,不是所有版本、所有配置的固定值。先在 v2rayN 的「设置」→「参数设置」中查找本地监听端口与入口类型;不同版本可能显示“本地混合监听端口”等名称,以当前界面为准。若 HTTP 和 SOCKS 分开监听,必须选 HTTP 对应的端口。

10808
本文 HTTP 入口示例端口
10 秒
连接阶段超时上限
20 秒
单次请求总时限

在 Windows PowerShell 中,先确认端口有监听,再执行显式代理请求。这里使用 curl.exe,避免部分 Windows PowerShell 环境把 curl 解释成其他命令。测试前保持 v2rayN 运行,并确认当前节点与内核已经启动。

Get-NetTCPConnection -State Listen -LocalPort 10808

curl.exe -I --connect-timeout 10 --max-time 20 --proxy http://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" https://example.com/

这条命令把绕过列表限定为本机地址,因此访问示例域名时仍会使用指定代理。收到目标站点的 HTTP 响应,说明本次请求至少完成了代理通道与目标连接;若日志还显示命中了直连规则,则不能据此断言走了远端节点。单独出现 200 Connection established 只说明 HTTP CONNECT 隧道已被接受,还要继续观察目标站点的响应。

浏览器扩展冲突按三步隔离

显式代理测试成功后,浏览器仍失败,优先检查“谁在控制浏览器代理”。同一个浏览器里保留多个代理扩展,容易出现一个启用固定代理、另一个启用自动配置脚本的情况。扩展图标显示的模式也不一定等于操作系统里保存的代理模式。

  1. 停用代理扩展

    Chrome 打开「菜单」→「扩展程序」→「管理扩展程序」;Edge 打开「菜单」→「扩展」→「管理扩展」。暂时停用所有会修改代理的扩展,记录原状态,再完全退出并重启浏览器。不要只关闭当前标签页。

  2. 核对系统入口

    Windows 11 打开「设置」→「网络和 Internet」→「代理」,检查“使用代理服务器”中的地址与端口是否对应 v2rayN 当前监听入口。若启用了“使用设置脚本”,先记录脚本地址,再确认它是否属于当前需要的配置。

  3. 单独恢复测试

    重新访问同一测试地址。若停用扩展后恢复正常,只恢复一个代理扩展,并明确选择“使用系统代理”或正确的固定代理配置。每次只改一项,再用同一网址验证,避免把缓存、节点和规则一起改动。

Firefox 还需要检查「设置」→「常规」→「网络设置」→「设置」,确认选中的是“使用系统代理设置”,而不是旧的手动代理或自动代理配置地址。若浏览器提示代理设置由组织管理,应先联系设备管理员;重装 v2rayN 通常不能解除浏览器策略。

终端用环境变量单独配置

终端只是运行程序的环境,不负责替每个程序接入系统代理。curl 通常读取代理环境变量,其他命令可能使用自己的配置文件或命令行选项。先用上一节的显式 --proxy 参数验证通路,再设置变量,可以把“代理服务不可用”和“程序没有读取配置”分开。

Windows PowerShell:只修改当前会话

Get-ChildItem Env: | Where-Object Name -Match '^(http_proxy|https_proxy|all_proxy|no_proxy)$'

$env:http_proxy = "http://127.0.0.1:10808"
$env:https_proxy = "http://127.0.0.1:10808"
$env:no_proxy = "localhost,127.0.0.1"

curl.exe -I --connect-timeout 10 --max-time 20 https://example.com/

https_proxy 对应 HTTPS 目标请求,但变量值仍可以是 http://127.0.0.1:10808:这里描述的是本地代理服务的协议,curl 会通过 HTTP CONNECT 建立隧道,并不是把目标 HTTPS 网站改成明文访问。不要看到变量名包含 HTTPS 就机械地把入口改成 https://。

macOS 与 Linux:注意变量大小写

env | grep -iE '^(http_proxy|https_proxy|all_proxy|no_proxy)='

export http_proxy="http://127.0.0.1:10808"
export https_proxy="http://127.0.0.1:10808"
export no_proxy="localhost,127.0.0.1"

curl -I --connect-timeout 10 --max-time 20 https://example.com/

在区分大小写的环境里,curl 的 HTTP 代理变量应使用小写 http_proxy;只设置大写 HTTP_PROXY 可能不会生效。其他工具的支持方式并不完全相同,应查看对应工具文档。本文先使用会话级设置,验证有效后再考虑写入 shell 启动文件,避免每次打开终端都自动带入错误端口。

绕过列表与直连对照一起检查

no_proxy 或 NO_PROXY 指定哪些目标不经过代理。若其中包含测试域名,或者写成 *,即使代理变量正确,程序仍可能直连。另一个常见情况是旧的 all_proxy 指向已经关闭的 SOCKS 端口;不同程序的优先级可能不同,因此必须把相关变量一起检查,而不是只看一个 https_proxy。

对照结果优先检查下一步操作
显式代理成功,默认请求失败应用代理来源查环境变量、独立配置与绕过列表
显式代理失败,直连成功本地入口或代理出站查监听端口、入口协议和内核日志
终端成功,浏览器失败浏览器覆盖设置停用代理扩展,核对系统代理与浏览器策略
两种请求都失败网络或目标连接先核对基础联网,再查解析、握手和目标站点

在 Windows 中,可使用下面两条命令访问同一个目标。第一条明确使用本地代理,第二条通过 --noproxy "*" 明确直连。macOS 和 Linux 将命令名改为 curl 即可。示例域名只用于连通性对照,直连与代理都成功并不异常,也不能据此判断出口地区。

curl.exe -I --connect-timeout 10 --max-time 20 --proxy http://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" https://example.com/

curl.exe -I --connect-timeout 10 --max-time 20 --noproxy "*" https://example.com/

结论:先固定请求路径

显式代理成功、默认请求失败时,先修复应用读取代理的方式,不要先换节点。只有明确进入同一个本地入口后仍失败,才继续追查路由与远端连接。

根据 curl 报错定位失败阶段

浏览器的“无法访问”信息往往过于概括。curl 的错误编号更适合区分入口连接、代理协议和 TLS 阶段。下列文字是常见错误片段,完整输出中的耗时、地址和后续说明会随系统与 curl 版本变化。

报错:curl: (7) Failed to connect

原因与解法:连接指定地址失败;如果输出指向 127.0.0.1,先确认 v2rayN 内核运行、端口正确且存在监听,不要先排查远端 TLS。

报错:curl: (5) Could not resolve proxy

原因与解法:代理主机名无法解析;检查代理变量里的地址拼写、协议前缀和引号,使用本机入口时应填写实际的回环地址与端口。

报错:curl: (6) Could not resolve host

原因与解法:目标主机名未能解析;先确认请求是否意外直连、是否使用本地解析的 SOCKS 模式,再依据日志检查解析路径,不要把它等同于节点超时。

报错:curl: (28) Connection timed out

原因与解法:连接在规定时间内没有完成;结合错误中显示的地址和内核日志,区分本地入口连接与后续远端连接,再核对节点地址、端口和网络可达性。

报错:curl: (60) SSL certificate problem

原因与解法:证书验证失败;检查系统时间、证书信任链及是否存在网络拦截,不要通过关闭证书验证把问题当作已经解决。

需要更多细节时,为原命令追加 -v,查看实际连接地址、代理变量提示和握手阶段。对外分享日志前,应删除订阅地址、认证信息、代理凭据和敏感请求头;不必公开完整配置,也不要把完整终端环境变量列表直接发到公共讨论区。

恢复设置并确认排查结果

完成测试后,只保留一种明确的代理控制方式。日常浏览器若交给系统代理,就让扩展跟随系统设置;终端需要代理时,在对应会话中配置变量。不要把系统代理、扩展固定代理、自动配置脚本和多个旧环境变量同时保留为“备用”,否则下一次故障很难还原请求路径。

# PowerShell:仅删除本次新增、原本不存在的变量
Remove-Item Env:http_proxy, Env:https_proxy, Env:no_proxy -ErrorAction SilentlyContinue

# Bash / Zsh:仅删除本次新增、原本不存在的变量
unset http_proxy https_proxy no_proxy

如果显式代理已成功,但个别域名仍未按预期出站,继续阅读路由分流说明;若本地入口与节点连接都无法建立,可按连接故障排查继续检查。先完成入口与应用设置的分层验证,再调整 DNS、路由或节点参数,才能知道哪项修改真正解决了问题。

v2rayN 下载中心