适用于 v2rayN 已设置系统代理,但浏览器打不开目标站点、终端仍然直连的情况。先用显式代理请求确认本地入口与节点可用,再分别检查浏览器设置、终端环境变量和路由日志。文中以 127.0.0.1:10808 作为本地 HTTP 或混合入口示例;执行前必须换成客户端实际监听的地址与端口。
一、区分系统代理、应用代理与路由
v2rayN 的「自动配置系统代理」主要修改操作系统提供给应用读取的代理设置,并不等于接管设备的所有网络连接。浏览器通常会读取这组设置;命令行工具、后台服务和某些带独立网络模块的程序可能完全忽略它。因此,“浏览器正常、终端失败”首先是应用入口差异,不应直接归因于节点失效。
这条链路中,系统代理只影响第一环;Xray 或 V2Ray 内核收到请求以后,才根据路由规则选择直连、代理或拦截。即使浏览器已经连接本地端口,命中直连规则的站点仍会使用本地网络出口。“出口地址没变”不能单独证明系统代理失效。
| 设置位置 | 影响范围 | 优先检查 |
|---|---|---|
| 操作系统代理 | 愿意读取系统设置的应用 | 地址、端口、绕过列表、PAC |
| 浏览器独立代理 | 该浏览器或当前配置文件 | 扩展、手动代理、企业策略 |
| 终端环境变量 | 支持这些变量的当前进程及子进程 | 变量名称、协议、进程继承 |
| 内核路由 | 已经进入内核的请求 | 匹配规则及最终出站 |
TUN 是另一条接管路径,不是系统代理的同义词。为了减少变量,本文按未启用 TUN 的场景排查;若现有网络依赖 TUN,应先记录原设置,再在允许中断连接的条件下做隔离测试。不要同时改 TUN、DNS 和路由,否则很难判断是哪一项起作用。
二、先确认本地端口与显式代理请求
打开 v2rayN 的「设置」→「参数设置」,核对本地监听相关设置,并查看内核启动日志中的监听信息。不同版本的分组选项名称可能不同,以实际界面和日志为准。下列数字是排查示例,不是所有版本通用的默认值;若端口仅提供 SOCKS 服务,不能把它当成 HTTP 代理使用。
Windows PowerShell 中先查看监听,再运行显式指定代理的请求。使用 curl.exe,避免部分 PowerShell 环境中的 curl 别名把命令交给其他工具。macOS、Linux 可将下面第二条命令的 curl.exe 改为 curl。
Get-NetTCPConnection -State Listen -LocalPort 10808
curl.exe --noproxy "" --proxy http://127.0.0.1:10808 --connect-timeout 5 --max-time 15 -v https://example.com/ -o NUL
--noproxy "" 在本次测试中清空绕过列表,防止已有的 NO_PROXY 干扰。macOS、Linux 的输出丢弃路径应改为 /dev/null。示例域名用于验证连通性,也应换成实际失败的目标站点复测,因为某个站点成功不代表所有路由与目的端口都正常。
- 连接
127.0.0.1:10808就被拒绝:先处理内核未启动、端口填错或监听地址不符。 - 出现
200 Connection established:HTTP CONNECT 隧道已经建立,但还要继续看 TLS 握手及最终响应。 - 目标站返回 HTTP 200、301 或 403:已经获得应用层响应;403 是目标拒绝访问,不等于本地代理没有工作。
- 本地入口可连、后续超时:结合内核日志检查出站、DNS 与目标连接,不要继续反复切换浏览器代理。
判断:显式代理成功后再查应用
同一目标的显式代理请求成功,而浏览器或终端默认请求失败时,优先修正该应用的入口配置;暂时保留已经验证可用的节点和端口。
三、浏览器不走代理的检查顺序
先保持 v2rayN 运行并选中可用节点,从托盘菜单「系统代理」→「自动配置系统代理」写入设置。随后检查操作系统实际保存的值,而不是只看托盘状态。其他代理程序、浏览器扩展或组织策略可能在写入后再次覆盖配置。
-
核对系统设置
Windows 11 打开「设置」→「网络和 Internet」→「代理」,查看「使用代理服务器」对应的地址与端口;macOS 打开「系统设置」→「网络」→当前连接→「详细信息」→「代理」。Linux 桌面环境入口不统一,使用 GNOME 时可检查「设置」→「网络」→「网络代理」。
-
检查浏览器入口
Chrome 打开「设置」→「系统」→「打开您计算机的代理设置」。Firefox 打开「设置」→「常规」→「网络设置」→「设置」,核对是否选择「使用系统代理设置」;若选择「不使用代理」或手动配置,就不会按预期跟随系统。
-
暂停代理扩展
Chrome 打开「扩展程序」→「管理扩展程序」,暂时关闭会控制代理的扩展,再用新建的干净浏览器配置测试。无痕窗口仍可能继承策略或获准运行的扩展,不能把它视为完整隔离环境。
-
核对绕过规则
查看系统代理例外、浏览器手动代理的“不使用代理”列表,以及是否启用了自动配置脚本。PAC 可以按目标返回直连;不要在没有确认规则内容时,把 PAC 模式等同于所有站点都走代理。
-
重启后复测
关闭浏览器全部窗口并退出后台进程,再重新启动。请求与命令行测试相同的完整网址,同时观察 v2rayN 日志。Chrome 可在地址栏打开
chrome://policy,检查是否存在组织下发的代理策略;受管理设备应联系管理员处理。
如果浏览器请求完全没有进入内核日志,应先查浏览器入口;但只有在访问日志已开启、日志级别合适时,“没有记录”才有参考价值。若日志明确显示目标走直连,问题就在路由选择,而不是系统代理开关。若请求进入代理出站后失败,再检查节点连接和目标站状态。
四、终端用环境变量与单次参数分别验证
终端工具没有统一的“跟随系统代理”约定。对支持代理环境变量的工具,可以在当前终端会话设置变量;对支持命令行代理参数的工具,单次显式参数更便于定位。变量只会传给之后启动的子进程,已经运行的编辑器终端、后台任务不会自动更新。
Windows PowerShell:先设置当前会话
$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 --connect-timeout 5 --max-time 15 -v https://example.com/ -o NUL
Get-ChildItem Env: | Where-Object Name -Match 'proxy'
HTTPS_PROXY 中的 http:// 描述的是“终端到本地代理”的协议,不是目标网址的协议。访问 HTTPS 网站时,HTTP 代理通常通过 CONNECT 建立隧道,因此不应仅因目标是 HTTPS 就把变量值改成 https://127.0.0.1:10808。只有本地入口确实提供 TLS 代理服务时,后者才可能适用。
macOS、Linux:注意变量大小写
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 --connect-timeout 5 --max-time 15 -v https://example.com/ -o /dev/null
env | grep -i proxy
在大小写敏感的环境中,curl 对 HTTP 代理特意只读取小写 http_proxy,而 HTTPS 代理变量支持相应大小写形式。其他工具的约定可能不同,应按工具文档配置。若同名变量的大小写形式同时存在而值不一致,先清理冲突,不要继续叠加更多变量。
NO_PROXY或no_proxy中的目标域名会绕过代理;某些工具将*解释为全部绕过。ALL_PROXY可作为部分工具的后备代理,但工具支持范围不同,也可能被专用变量或命令行参数覆盖。- 若使用经过确认的 SOCKS 入口,可单次测试
curl --proxy socks5h://127.0.0.1:10808 https://example.com/;socks5h让代理端处理目标域名解析。 - WSL、容器、远程终端中的
127.0.0.1指向各自环境,不一定是运行 v2rayN 的宿主机。不要为方便连接直接将本地代理暴露到整个局域网。
若显式 --proxy 成功,设置变量后却失败,检查该工具是否支持变量、是否有工具自己的代理配置,以及请求是否命中绕过列表。Windows 的 WinHTTP 设置与桌面系统代理也不是同一套入口,不要为了修复单个终端工具就盲目修改全局 WinHTTP 配置。
五、按真实报错定位故障层
错误文本比“网页打不开”更有定位价值。下面是常见输出片段,实际措辞会随 curl 版本、操作系统和浏览器语言变化。记录出错发生在本地连接、CONNECT、TLS 还是目标响应阶段,再决定修改哪一项。
curl: (7) Failed to connect to 127.0.0.1 port 10808
原因与解法:本地代理入口没有接受连接。确认 v2rayN 内核正在运行,检查实际监听端口和进程;如果端口被其他程序占用,先处理冲突,再同步修改应用入口。
ERR_PROXY_CONNECTION_FAILED
原因与解法:浏览器无法连接所配置的代理。核对系统与扩展中保存的地址,排除旧端口、错误代理主机和内核退出;先用相同入口执行显式 curl 测试。
curl: (5) Could not resolve proxy
原因与解法:代理地址中的主机名无法解析,或代理 URL 写错。检查环境变量值是否混入多余字符,先用已确认可用的 http://127.0.0.1:10808 排除代理主机名解析问题。
curl: (60) SSL certificate problem: unable to get local issuer certificate
原因与解法:当前 curl 使用的信任库无法构建证书链,也可能涉及组织网络的 TLS 检查。核对系统时间、证书来源和 curl 的证书库配置;不要用长期关闭证书验证代替修复。
curl: (28) Connection timed out
原因与解法:指定时间内没有完成连接或响应,单凭这一条无法判断故障位置。通过 -v 查看最后成功的阶段,再结合内核日志区分本地入口、节点出站与目标站超时。
当浏览器正常、终端只有证书错误时,不要直接替换节点。浏览器和命令行程序可能使用不同的证书信任库。同样,终端成功而浏览器报代理连接失败,也应先比较两者使用的本地端口,而不是判断某个协议整体不可用。
六、恢复设置并保留最小排查记录
定位后只保留必要配置。若工作流确实需要代理环境变量,再写入对应 shell 的启动文件,并检查是否影响本地开发服务。临时测试结束后,可用以下命令撤销本文设置的变量;如果测试前已经有值,应恢复原值,而不是直接删除。
清理当前会话变量
# Windows PowerShell
Remove-Item Env:HTTP_PROXY, Env:HTTPS_PROXY, Env:NO_PROXY -ErrorAction SilentlyContinue
# macOS、Linux shell
unset http_proxy https_proxy no_proxy
这不会清除其他位置保存的配置,例如工具专用配置、其他大小写形式的变量、shell 启动文件或已经启动的子进程。浏览器测试时临时停用的扩展,应逐个恢复并复测;一旦恢复某项后故障重现,就能得到具体的覆盖来源。
- 记录环境:操作系统、v2rayN 版本、内核类型、是否启用 TUN,以及本地入口协议与端口。
- 固定请求:使用同一个目标网址,分别记录显式代理、环境变量和浏览器访问结果。
- 定位出站:保留对应时间的路由匹配与错误日志,确认实际走直连还是代理。
- 保护信息:分享日志前移除订阅地址、令牌、节点凭据及不必要的内部域名。
判断:以同一请求的差异确定修改范围
显式代理成功就查应用入口;请求进入内核但走错出站就查路由;代理出站已选中但连接失败再查节点与网络。每次只改一层,并用同一网址复测。