V2Ray 系统代理不生效:浏览器与命令行终端分开排查

已开启自动配置系统代理却打不开网页?本文分浏览器扩展、系统设置与终端环境变量三条线,逐项检查代理到底断在哪一层。

本文速览

先用显式指定代理的 curl 请求确认本地入口与出站连接,再分别检查浏览器是否读取系统设置、终端是否继承代理变量。本文以 Windows 上的 v2rayN 为主要操作环境,补充 macOS 与 Linux 终端命令;适合“浏览器能用但终端不通”“开启系统代理后仍直连”和“退出客户端后网页打不开”的情况。

一、先区分系统代理、本地监听与代理出站

看到 v2rayN 显示“自动配置系统代理”,只能说明客户端选择了写入系统代理设置的模式,不能证明所有应用都采用了该设置,也不能证明节点已经连通。v2rayN 是管理配置的桌面客户端,实际连接由运行中的 V2Ray 或 Xray 等内核处理。把应用是否进入本地端口与内核是否成功出站分开检查,才能避免反复更新订阅却没有触及故障位置。

应用请求 代理选择 本地监听 路由匹配 目标连接

系统代理不是接管整台电脑流量的开关。浏览器可能读取系统代理,也可能被扩展或自身设置覆盖;命令行程序通常有自己的参数和环境变量。即使请求已经进入内核,路由规则仍可能将它分配到直连出站,因此“本地日志出现连接”和“目标通过代理出站”也是两件事。

二、核对 10808 监听,再做一次显式代理测试

以下把 127.0.0.1:10808 作为本地混合监听入口的示例,不把它当成所有安装环境的固定值。在 v2rayN 的「设置」→「参数设置」中查找「本地混合监听端口」;部分版本将其放在「Core:基础设置」页签。若界面分别列出 HTTP 与 SOCKS 端口,下面的 HTTP 测试必须填写实际 HTTP 端口,不能直接套用混合端口示例。

10808
本文示例混合端口
10 秒
测试连接超时上限
30 秒
单次请求总时限

在 Windows PowerShell 中执行下面两条命令。第一条查看监听进程,第二条绕开系统代理发现过程,直接要求 curl 连接本地 HTTP 代理。这里使用 curl.exe,避免旧版 Windows PowerShell 把 curl 解释为其他命令的别名。-q 放在首个参数位置,用于跳过 curl 默认配置文件。

Get-NetTCPConnection -State Listen -LocalPort 10808 |
  Select-Object LocalAddress, LocalPort, OwningProcess

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

本文的 example.com 用作普通 HTTPS 连通性目标,不代表你的实际业务网站。复测时换成发生问题的完整网址,并始终使用同一个目标。若目标不支持 HEAD 请求,可去掉 --head,在 Windows 加上 --output NUL 丢弃响应正文。不要只根据某个网页是否在当前网络中可直连来推断代理有效。

curl: (7) Failed to connect to 127.0.0.1 port 10808

原因与解法:curl 没有连上指定的本地入口;检查内核是否启动、端口是否一致、监听地址是否包含 IPv4 回环地址,再按实际端口重试。

curl: (28) Operation timed out

原因与解法:请求超过时限,单凭这条提示不能确定卡在本地还是远端;临时加 --verbose 观察连接阶段,并对照内核日志中的超时目标。

curl: (60) SSL peer certificate or SSH remote key was not OK

原因与解法:证书信任验证未通过;检查系统时间、目标证书与网络中的 HTTPS 检查策略,不要用关闭证书验证的方式代替修复。

结论:显式代理成功后再查自动配置

收到目标站点的最终 HTTP 响应,说明这一次请求已走通指定入口;只看到 200 Connection established 还不够,它仅表示 HTTP CONNECT 隧道获准建立。收到 403 或 429 则应继续检查站点访问策略,而不是立即判定端口失效。

三、浏览器不通:依次排除扩展、系统设置与 PAC

显式代理测试正常,而浏览器仍提示 ERR_PROXY_CONNECTION_FAILED 时,先检查浏览器实际采用的入口。不要把无痕窗口当成可靠的“无扩展环境”:部分扩展被允许在无痕模式运行,代理配置也可能来自组织策略。排查时应明确暂停代理扩展,再完全退出并重新打开浏览器。

  1. 暂停代理扩展

    Chrome 打开「扩展程序」→「管理扩展程序」,Edge 打开「扩展」→「管理扩展」,暂停会修改代理配置的扩展。若扩展仍需保留,记录其当前模式与端口,稍后单独恢复测试。

  2. 重写系统入口

    右键 v2rayN 托盘图标,在「系统代理」中先选「清除系统代理」,再选「自动配置系统代理」。保持客户端运行,然后检查系统实际写入值,而不只看托盘菜单的选中状态。

  3. 核对地址端口

    Windows 11 打开「设置」→「网络和 Internet」→「代理」,检查「手动设置代理」中的「使用代理服务器」。自动配置系统代理的常规本地入口应与客户端实际监听地址、端口对应,例如 127.0.0.1 与 10808。

  4. 检查脚本冲突

    同页查看「使用设置脚本」。若存在旧 PAC 地址,先记录来源;在个人设备且不受组织策略管理时,暂时关闭脚本,只保留一种代理选择方式。工作设备应先确认管理要求,避免覆盖组织配置。

  5. 检查独立设置

    Firefox 打开「设置」→「常规」→「网络设置」→「设置」,选择「使用系统代理设置」后复测。若选择手动配置,必须核对 HTTP 代理、端口与 HTTPS 请求的代理选项,不能假设它会随系统设置自动更新。

“自动配置系统代理”与“使用设置脚本”不是同一概念。前者通常由客户端填写本地代理入口,后者让浏览器读取 PAC 脚本,由脚本决定每个目标走代理还是直连。PAC 规则遗漏某个域名时,只有该域名可能失败;此时应检查脚本返回结果与缓存,而不是同时修改订阅地址和本地端口。

四、终端不通:检查环境变量与程序自己的参数

浏览器能打开网页,PowerShell 或其他终端却超时,并不矛盾。终端只是启动程序的外壳,具体程序是否读取系统代理取决于实现。环境变量通常只在进程启动时继承;在一个终端窗口内设置变量,不会自动修改另一个已经打开的窗口,也不会回写系统浏览器代理。

先在 PowerShell 中列出当前代理变量,再为当前会话设置 HTTP 代理。这里的 HTTPS_PROXY 描述的是访问 HTTPS 目标时使用哪个代理,不意味着本地代理地址必须写成 https://。对常见的本地 HTTP CONNECT 入口,应继续使用 http://127.0.0.1:10808。

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,::1"

curl.exe -q --connect-timeout 10 --max-time 30 --head https://example.com/

Windows 环境变量名称不区分大小写;macOS 与 Linux 则需要留意大小写差异。curl 出于安全考虑,不把大写 HTTP_PROXY 当作 HTTP 代理变量使用,因此跨平台示例统一采用小写。其他命令行工具的支持方式可能不同,不能把 curl 的行为直接套到所有程序。

# macOS / Linux:仅影响当前 shell 及其之后启动的子进程
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,::1'

curl -q --connect-timeout 10 --max-time 30 --head https://example.com/
配置来源常见症状检查动作
命令行参数只有某条命令走错端口检查启动脚本中的 --proxy 或工具专属代理参数。
代理环境变量新旧终端行为不同在出问题的窗口中读取变量,确认是否继承了旧值。
绕过列表部分域名始终直连检查 no_proxy;星号 * 在 curl 中表示全部绕过代理。
工具配置文件curl 正常,另一工具失败查该工具自己的配置与优先级,不假设它支持同一组变量。
独立运行环境主机正常,容器或子系统失败确认环境内部的回环地址含义、主机可达地址与防火墙规则。

如果命令运行在容器、虚拟机或 WSL 的不同网络模式中,127.0.0.1 可能指向该环境自身,而不是桌面宿主机。先确定宿主机入口是否可达,再决定是否需要调整监听地址;不要为了省事直接把代理暴露到所有网卡。确需跨环境访问时,应限制来源地址并核对防火墙规则。

五、区分 HTTP、SOCKS 与 DNS 失败

本地混合入口通常可以同时接受 HTTP 与 SOCKS 请求,但旧配置可能使用两个独立端口。向纯 SOCKS 端口发送 HTTP CONNECT,可能得到握手失败或空响应;这类错误与 VMess、VLESS 节点协议不是一个层面的问题。先确认本地入站协议,再检查远端节点配置。

# 在支持 SOCKS 的实际端口上测试,由代理侧解析目标域名
curl -q --proxy socks5h://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" --connect-timeout 10 --max-time 30 --head https://example.com/

Windows 中执行上面的命令时,将 curl 改为 curl.exe。对 curl 而言,socks5:// 通常由本机解析目标域名,socks5h:// 则把目标域名交给 SOCKS 代理处理。两者结果不同,能提示解析位置存在差异,但不能直接证明应当修改哪一个 DNS 服务器。

curl: (5) Could not resolve proxy

原因与解法:代理服务器地址本身未能解析;先检查代理 URL 拼写和变量中的旧主机名。本地测试可使用 127.0.0.1,减少对代理地址解析的依赖。

curl: (6) Could not resolve host

原因与解法:当前请求路径中目标主机名未能解析;核对目标拼写、绕过列表以及是否在本机解析,结合 SOCKS 解析方式对照和内核日志继续定位。

六、恢复设置并保留可复现的排查结果

完成定位后,恢复临时修改,避免把测试配置变成下一次故障来源。如果只是临时为 PowerShell 设置了变量,可在当前窗口移除;如果此前通过系统设置持久写入变量,则还要回到相应入口清理,并重启受影响的应用。下面的命令只清除当前 PowerShell 会话中的四个代理变量,不改用户级或系统级持久配置。

Remove-Item Env:http_proxy, Env:https_proxy, Env:all_proxy, Env:no_proxy -ErrorAction SilentlyContinue

在 macOS 或 Linux 的当前 shell 中,可执行 unset http_proxy https_proxy all_proxy no_proxy;曾设置大写变量的,还需检查并移除对应大写项。若变量来自 shell 启动文件,只在当前窗口执行 unset 不足以阻止下次重新加载。

  1. 退出 v2rayN 前,按需要在「系统代理」中选择「清除系统代理」,再确认浏览器能否恢复预期的直连访问。
  2. 恢复需要使用的扩展或 TUN,一次恢复一项;每恢复一项,都用同一个目标复测。
  3. 记录测试时间、实际监听端口、完整错误码、浏览器结果和显式 curl 结果,不用“完全没网”概括所有现象。
  4. 需要协助排查时,只截取相关日志片段;隐藏订阅地址、节点凭据和包含令牌的请求链接。

结论:用同一目标固定故障边界

显式代理失败就查监听与出站;显式代理成功而浏览器失败就查代理选择;浏览器成功而终端失败就查变量与工具配置。保留这三组对照结果,比反复重装客户端更容易缩小问题范围。

下载v2rayN选择系统与安装包