先拆开“开了代理”这句话

“系统代理已经打开”只描述了操作系统里的一组代理地址。它不等于代理内核正在运行,也不保证每个应用都会读取这组设置。排查前先把一条访问链路拆成四段:应用发起请求、应用决定是否读取系统代理、本地代理端口接收连接、V2Ray 或 Xray 内核按路由规则处理流量。

其中任意一段断开,表面现象都可能是“网页打不开”或“终端还是直连”。例如,v2rayN 已经设置系统代理,但内核没有启动,浏览器会把请求交给一个无人监听的本地端口;又例如,浏览器访问正常,但命令行程序根本不读取系统代理,因此终端仍然直接连接目标站点。

浏览器链路

浏览器通常读取系统代理,也可能使用自己的代理选项、扩展设置和安全 DNS 配置。先检查浏览器实际采用了哪一层设置。

终端链路

curl、包管理器和开发工具常读取环境变量或各自的配置文件。系统代理开关通常不会自动覆盖这些程序。

确认 v2rayN 与本地监听端口正常

开始调整浏览器或终端之前,先证明本地代理本身可以接收请求。以桌面端 v2rayN 为例,需要同时满足三个条件:已经选择可用服务器、内核处于运行状态、本地 HTTP 或 SOCKS 端口正在监听。仅导入订阅并不会自动完成这三步。

检查服务器与内核状态

  1. 更新订阅后,在服务器列表中选择一个配置,确认它被设为当前活动服务器。
  2. 启动内核,观察主窗口状态栏和日志区域。若启动后立即退出,应先处理端口占用、配置字段或协议参数错误。
  3. 打开本地代理设置,记录 HTTP、SOCKS 或混合监听端口。不同版本、不同配置迁移结果可能不一样,不要只凭旧教程猜端口。
  4. 确认监听地址是本机回环地址。只在当前电脑使用时,常见地址为 127.0.0.1

下面的命令假设 v2rayN 本地 HTTP 代理端口是 10809。如果界面显示其他端口,应把命令中的数字改成实际值。这个测试绕过浏览器设置,直接让 curl 把 HTTPS 请求交给本地 HTTP 代理:

curl -I --proxy http://127.0.0.1:10809 https://example.com

如果返回 HTTP 响应头,说明 curl 能连接本地端口,代理链路至少完成了一次请求。如果提示连接 127.0.0.1 失败,重点检查内核是否运行、端口是否写错、端口是否被其他进程占用。如果连接本地端口成功,但随后出现握手、超时或服务器拒绝,则继续查看 v2rayN 日志与服务器配置,而不是反复切换浏览器开关。

区分 HTTP 端口与 SOCKS 端口

HTTP 代理和 SOCKS 代理不是同一种入口。把 SOCKS 端口填进系统的 HTTP 代理栏,应用可能建立 TCP 连接,却无法完成正确的代理协商。v2rayN 界面若分别显示两个端口,应严格按类型使用。测试 SOCKS 代理时,可以让 curl 使用 socks5h

curl -I --proxy socks5h://127.0.0.1:10808 https://example.com

socks5h 中的字母 h 表示由代理端解析目标域名。它有助于减少本地 DNS 与代理出口解析结果不一致造成的干扰。这里的 10808 同样只是示例,实际值以客户端当前配置为准。

浏览器不生效:沿设置来源逐层检查

多数桌面浏览器默认跟随操作系统代理,但“默认”会被浏览器自己的配置、扩展规则、企业策略或仍未退出的旧进程改变。排查时不要一上来清除全部设置。先确认浏览器到底从哪里取得代理信息。

第一步:核对系统代理地址

打开操作系统的代理设置,核对地址与端口是否和 v2rayN 当前显示一致。地址通常应指向本机,而不是订阅服务器地址。系统代理填写的是本地入口,远端服务器信息由客户端配置和内核负责处理。

v2rayN 的系统代理操作通常包含设置、清除或保持不变等状态。选择“保持不变”只是不修改操作系统现有值,并不代表当前系统值一定正确。曾经调整过端口、切换过配置目录或同时运行过其他代理工具时,系统里可能还保留旧端口。

第二步:彻底重启浏览器进程

关闭可见窗口后,浏览器后台进程可能仍然存在。代理设置变化后,先从任务管理区域退出浏览器,再重新打开。若浏览器提供“使用系统代理设置”选项,确认它没有切换到手动代理或直连模式。

隐私窗口适合排除缓存和部分扩展影响,但不能替代进程重启。浏览器的代理扩展也可能把特定域名设为直连,或者使用另一组端口。测试时可暂时停用负责改写代理规则的扩展,保留一条清晰的系统代理链路。

第三步:分别测试 HTTP 与 HTTPS

有些系统设置允许分别填写 HTTP 和 HTTPS 代理。如果只填写其中一项,访问另一类地址时可能仍然直连或直接失败。现代网页通常会跳转到 HTTPS,因此“首页能打开,登录页打不开”也可能来自两个协议栏位不一致。

对于本地 HTTP 代理,HTTPS 网站通常通过 HTTP CONNECT 隧道转发。这里不需要把本地代理地址写成远端网站的 HTTPS 地址。关键是浏览器采用正确的代理类型,并连接到正在监听的端口。

第四步:检查绕过列表

系统代理通常允许配置“不使用代理的地址”。本机地址、局域网域名和公司内部域名经常出现在绕过列表中。如果目标域名被手动加入,或被宽泛的通配规则覆盖,浏览器会直接连接。测试时查看完整列表,不要只看列表第一行。

本地站点使用 localhost127.0.0.1 直连通常是合理行为。若正在调试本地开发服务,不应把“本地地址没有经过代理”当成故障。真正需要确认的是外部目标是否被意外加入绕过规则。

终端不生效:显式设置代理环境变量

终端只是命令解释环境,真正决定是否使用代理的是具体程序。curl、语言包管理器、构建工具和下载器可能读取不同变量,也可能拥有独立配置。最常见的通用入口是 HTTP_PROXYHTTPS_PROXYALL_PROXY

PowerShell 当前会话

以下设置只影响当前 PowerShell 会话及其启动的子进程。关闭窗口后通常失效,适合排查和临时下载:

$env:HTTP_PROXY = "http://127.0.0.1:10809"
$env:HTTPS_PROXY = "http://127.0.0.1:10809"
curl.exe -I https://example.com

即使目标地址是 HTTPS,HTTPS_PROXY 的值也可以是 http://127.0.0.1:10809。这里描述的是应用连接本地代理所用的协议,不是目标网页的协议。若要移除当前会话变量,可执行:

Remove-Item Env:HTTP_PROXY
Remove-Item Env:HTTPS_PROXY
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue

Windows 命令提示符当前会话

set HTTP_PROXY=http://127.0.0.1:10809
set HTTPS_PROXY=http://127.0.0.1:10809
curl -I https://example.com

清除变量时,将等号后留空:

set HTTP_PROXY=
set HTTPS_PROXY=
set ALL_PROXY=

macOS 与 Linux 当前 Shell

export HTTP_PROXY="http://127.0.0.1:10809"
export HTTPS_PROXY="http://127.0.0.1:10809"
curl -I https://example.com

许多命令行工具使用小写变量名。为了兼容不同程序,可以在当前会话同时设置小写形式:

export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"

测试结束后清除变量:

unset HTTP_PROXY HTTPS_PROXY ALL_PROXY
unset http_proxy https_proxy all_proxy

使用 SOCKS 入口

如果工具支持 SOCKS,可以通过 ALL_PROXY 指定入口。示例仍假设 SOCKS 端口为 10808

export ALL_PROXY="socks5h://127.0.0.1:10808"
curl -I https://example.com

不是每个程序都支持 socks5h,也不是每个程序都会读取 ALL_PROXY。某个工具无视环境变量时,应查看它自己的代理配置项。不要因为 curl 成功就推断所有包管理器都会自动采用同一设置。

设置 NO_PROXY 绕过本地地址

开发环境常需要让本机服务、容器入口和局域网接口保持直连。可以通过 NO_PROXY 声明绕过范围:

export NO_PROXY="localhost,127.0.0.1,::1"
export no_proxy="$NO_PROXY"

不同工具对域名后缀、通配符和网段写法的支持并不完全一致。先从明确的主机名和回环地址开始,不要直接写过于宽泛的后缀。若一个外部域名始终直连,也要检查它是否被误放进 NO_PROXY

代理已经接到请求,还要检查路由与 DNS

当浏览器或 curl 已经连接本地端口,问题就从“应用是否使用代理”转到“内核如何处理请求”。V2Ray 与 Xray 都可以依据域名、IP、端口、协议等条件执行路由分流。请求进入内核后,仍可能被规则送往直连出口、代理出口或阻断出口。

观察日志中的入站与出站

打开 v2rayN 日志,再发起一次目标明确的请求。若日志完全没有新增连接,应用大概率没有把流量交给本地代理,返回浏览器设置或环境变量继续检查。若日志出现目标域名和连接记录,说明入站正常,应继续看匹配的出站与错误信息。

订阅提供的是服务器配置集合,客户端路由规则则决定哪些请求使用当前服务器。两者不是同一层。切换服务器只能改变代理出口,无法修复一条把目标域名明确设为直连的本地规则。

临时简化路由规则

自定义规则较多时,先保存现有配置,再使用容易理解的测试规则验证。不要同时修改节点、DNS、系统代理和路由四个部分,否则成功后也难以判断是哪一步起效。确认基础代理链路后,再逐条恢复域名分组、IP 规则和应用分流。

VMess 与 VLESS 是客户端到服务器使用的协议配置;系统代理和环境变量只是应用连接本地入站的方式。浏览器不需要理解 VMess 或 VLESS,它只需要把 HTTP 或 SOCKS 请求交给本地监听端口。把这两层分开,能避免在协议字段里寻找浏览器代理开关的问题。

识别 DNS 路径差异

浏览器可能启用自己的安全 DNS,操作系统也有本地解析缓存;使用 SOCKS 时,域名还可能由本地或代理端解析。这些路径不一致,会造成同一域名在浏览器与终端中得到不同结果。

如果直接访问 IP 有响应,而使用域名失败,重点检查 DNS。使用 curl 测试 SOCKS 时可选择 socks5h,让代理端处理域名解析。浏览器侧则应检查其 DNS 设置是否覆盖系统行为。修改后重新启动浏览器,并用新的请求观察日志,不要只刷新已经缓存的页面。

按固定顺序收敛问题

代理故障最怕同时改很多选项。下面这套顺序从本地端口开始,每一步只证明一个事实。走到哪一步失败,就留在那一层处理。

  1. 确认内核运行。选择服务器并启动 v2rayN,确认进程没有立即退出。
  2. 记录真实端口。从客户端界面读取 HTTP 与 SOCKS 监听端口,不沿用旧截图中的数字。
  3. 显式测试本地代理。用 curl 的 --proxy 参数连接本地端口,排除系统代理和环境变量影响。
  4. 检查浏览器来源。确认浏览器跟随系统设置,停用会改写代理的扩展,并彻底重启进程。
  5. 检查终端变量。读取并设置 HTTP_PROXYHTTPS_PROXYALL_PROXY,同时查看 NO_PROXY
  6. 观察内核日志。确认请求是否进入本地入站,以及最终匹配了哪个路由出口。
  7. 最后处理 DNS。只有在域名解析表现异常时,再对比本地解析与代理端解析。

三个常见现象的直接判断

浏览器成功,curl 失败
浏览器大概率读取了系统代理,而 curl 没有读取或没有配置环境变量。先用 --proxy 做显式测试。
curl 显式代理成功,浏览器失败
本地端口与内核基本正常。重点检查系统代理端口、浏览器独立设置、扩展规则和后台进程。
本地端口可连接,请求仍超时
应用已经找到代理入口。继续检查服务器配置、路由分流、DNS 与日志中的远端连接错误。

完成排查后,记得清理临时环境变量,或者为日常开发保留一份明确的启用与停用命令。代理端口可能随配置调整而变化,永久写入旧端口会把下一次故障藏进 Shell 启动文件。把端口、代理类型和修改位置记在同一处,比记住某个固定数字更可靠。