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

浏览器和终端读取代理设置的方式不同。按插件冲突、PAC 模式、环境变量、本地端口四个方向逐项排查。

本文速览

本文以 Windows 上的 v2rayN 为例,适合“已设置系统代理,但浏览器或终端仍无法访问”的情况。先用显式代理请求验证本地入口,再检查浏览器扩展、自动配置脚本和终端环境变量。读完可以把故障定位到应用取用代理、本地端口监听、内核出站或路由规则,而不是反复更换节点。

一、先区分系统代理、路由与 TUN

v2rayN 的“系统代理”用于向操作系统写入代理设置,并不等于接管所有网络连接。应用必须主动读取这些设置,才会把请求交给本地代理端口。浏览器通常支持系统代理;命令行工具是否读取系统代理、环境变量或自己的配置文件,则取决于工具本身。

排查时先关闭 TUN 模式,避免虚拟网卡接管流量后掩盖系统代理问题。已有其他隧道或企业网络软件时,先记录状态,不要直接删除其配置。本文所有端口都只是测试示例,应替换为当前 v2rayN 实际显示的监听端口。

设置层实际作用不能据此证明
系统代理告诉遵循系统设置的应用使用哪个代理入口所有终端和后台程序都已使用代理
本地入站在回环地址与指定端口接收 HTTP 或 SOCKS 请求远端服务器已连接成功
内核路由对收到的请求选择直连、代理或阻断出站每条收到的请求都走远端代理
TUN 模式通过虚拟网卡接管匹配的网络流量应用已经正确读取系统代理

二、核对本地端口,再测试显式代理

先在 v2rayN 的「设置」→「参数设置」中核对本地监听设置,并查看主界面底部的端口信息。不同版本可能提供独立 HTTP、SOCKS 端口或混合端口,名称与布局也会变化。混合端口可以同时接收相应协议;仅支持 SOCKS 的端口不能直接当 HTTP 代理使用。

10808
下文假设的混合监听端口
10809
部分配置的独立 HTTP 端口示例

这两个数字不是所有版本的固定默认值,也不要求同时监听。以下在 PowerShell 中执行,假设已经确认 127.0.0.1:10808 支持 HTTP 与 SOCKS。使用 curl.exe 而不是 curl,可以避开部分 Windows PowerShell 环境中同名别名带来的参数差异。

# 检查 TCP 端口是否接受连接
Test-NetConnection 127.0.0.1 -Port 10808

# 查看监听进程,核对是否属于当前内核
Get-NetTCPConnection -State Listen -LocalPort 10808 |
  Select-Object LocalAddress, LocalPort, OwningProcess

# 显式指定 HTTP 代理;排除列表只包含本机地址
curl.exe --proxy http://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" --connect-timeout 10 --max-time 20 -I https://example.com

# 显式指定 SOCKS,并把目标域名交给代理端解析
curl.exe --proxy socks5h://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" --connect-timeout 10 --max-time 20 -I https://example.com

TcpTestSucceeded : True 只说明 TCP 端口能连接。HTTP 代理测试出现 200 Connection established,也只说明 CONNECT 隧道已获准建立;还要继续看后面的 TLS 过程与目标站响应。即使目标返回 403 或 405,也应先辨认它是目标站、代理服务还是中间网络设备返回的,不能只凭状态码判断系统代理失败。

结论:显式请求成功后,再查应用设置

若显式 HTTP 代理请求能够取得目标响应,而普通浏览器访问失败,优先排查浏览器是否使用了另一个入口。此时不要先改订阅、传输协议或远端端口。

三、浏览器不生效:查扩展和独立代理设置

浏览器扩展可以覆盖系统代理。一个窗口能访问、另一个窗口不能访问时,应先比较浏览器配置文件和扩展状态,而不是把差异直接归因于节点。隐私窗口也不是可靠的“无扩展测试环境”:被允许在隐私窗口运行的扩展仍然可能生效。

  1. 启用系统代理

    在 Windows 版 v2rayN 主界面底部「系统代理」菜单选择「自动配置系统代理」。这里的名称是客户端写入系统代理的操作,不应直接理解成 PAC 脚本模式。

  2. 核对系统入口

    打开 Windows「设置」→「网络和 Internet」→「代理」,检查手动代理的地址与端口。回环地址应指向本机,端口应与上一步验证成功的 HTTP 或混合入口一致。

  3. 停用代理扩展

    在 Chrome「扩展程序」→「管理扩展程序」中暂时停用控制代理的扩展。Edge 可在「扩展」→「管理扩展」操作。随后关闭相关浏览器进程并重新打开,再访问同一个测试地址。

  4. 检查独立设置

    Firefox 可在「设置」→「常规」→「网络设置」→「设置」中选择「使用系统代理设置」。若选择了手动代理,先核对其中的端口,不要假定它会跟随 Windows 自动更新。

如果系统代理地址刚被写入就发生变化,可能有另一个程序或组织策略在管理它。关闭重复运行的代理程序后再观察;受管理的设备应联系管理员确认策略。为了让本机浏览器连接代理,无需把监听地址改成 0.0.0.0,也不应以关闭整套防火墙作为首选排查步骤。

四、PAC 模式:检查脚本地址与返回结果

PAC 是自动代理配置脚本。浏览器调用脚本中的 FindProxyForURL(url, host),根据返回值决定使用代理还是直连。它与 v2rayN 内核中的 routing.rules 是不同层的规则:PAC 可以让请求根本不进入内核;内核路由只能处理已经到达本地入站的请求。

五、终端不生效:检查环境变量与工具配置

浏览器可用而终端不可用,是常见的设置来源差异。许多命令行工具不会自动读取 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,::1"

# 不指定 --proxy,验证 curl.exe 是否读取当前环境变量
curl.exe --connect-timeout 10 --max-time 20 -I https://example.com

https_proxy 的名称表示“用于 HTTPS 目标的代理”,其值仍可使用 http://,由 HTTP CONNECT 建立隧道;不应仅因目标是 HTTPS 就把本地入口改成 https://。是否支持环境变量、支持哪些名称,应以具体工具文档为准。curl 对 HTTP 代理变量的大小写有特殊规则,跨平台脚本优先使用小写 http_proxy。

检查项常见问题处理方式
NO_PROXY包含目标域名或 *,导致绕过代理测试会话只保留必要的本机地址,再重试
ALL_PROXY仍指向旧 SOCKS 端口检查协议与端口;不要让多个变量指向互相矛盾的入口
终端进程修改系统变量前已经启动重新启动终端及其宿主程序,或在当前会话直接赋值
工具配置文件工具自己的代理选项覆盖了预期设置查看工具有效配置,使用其显式参数进行对照测试

WSL、容器和远程终端具有各自的网络环境。其中的 127.0.0.1 不一定指向 Windows 上的监听入口,不能把这些环境的失败直接当作 Windows 系统代理失败。先在 Windows 本机完成基线测试,再单独核对虚拟网络与宿主地址。不要为此直接开放面向所有网卡的代理端口。

上述赋值只影响当前 PowerShell 会话和之后由它启动的子进程。关闭该会话即可结束这次临时设置;如果原会话已有工作用代理变量,应先记录原值,并在测试结束后恢复。

六、根据报错和日志定位剩余问题

显式代理也失败时,按“本地监听→协议匹配→远端连接→目标响应”顺序检查。以下是可能看到的 curl 报错片段,具体措辞会随版本和系统变化。错误码能够缩小范围,但单条报错通常不足以确定唯一原因。

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

原因:本地 TCP 连接未建立,常见于内核未启动、端口填写错误或本机连接被拦截。

解法:回到端口监听检查,核对监听进程,再查看 v2rayN 的内核启动日志;不要先修改远端协议。

curl: (5) Could not resolve proxy

原因:代理地址中的主机名无法解析,也可能是代理变量值格式有误。

解法:本机测试先明确使用 http://127.0.0.1:10808,检查变量中是否混入引号、空格或无效主机名。

curl: (28) Connection timed out

原因:连接或传输超过限制时间;可能卡在代理入口、远端服务器或目标站响应阶段。

解法:加 -v 查看最后完成的阶段,再对照同一时刻内核日志,区分入口不可达和远端超时。

curl: (60) SSL certificate problem

原因:证书验证没有通过,可能涉及系统时间、证书信任链或网络中的 TLS 检查。

解法:核对系统时间与证书来源;不要使用跳过证书验证作为长期解决办法,也不要把该报错直接归类为系统代理未生效。

日志没有新记录不一定代表请求未进入内核:当前日志级别可能不记录每次访问。可在 v2rayN「设置」→「参数设置」中检查日志相关选项,短时启用更详细的日志后重启内核,再发起一次带时间记录的测试。完成后恢复原级别,分享日志前移除订阅地址、身份凭据和其他敏感信息。

结论:一次只改变一个设置

保留同一个测试目标,依次记录显式代理、浏览器系统代理和终端环境变量三组结果。只有显式代理也失败时,才继续沿内核与远端连接排查;否则优先修复应用读取代理的路径。

v2rayN / v2rayNG 下载