适合已经在 v2rayN 中选好节点,却遇到浏览器与终端表现不一致的 Windows 用户。先用显式代理命令检查本地入口,再检查浏览器实际读取的设置,最后处理终端环境变量。每轮只改一处,就能分清问题在应用、监听端口还是代理出站,不必反复重装客户端。
系统代理不是所有流量的总开关
v2rayN 的系统代理功能,主要是把本地代理地址写入系统设置。应用是否读取这份设置,取决于应用自身。浏览器可能跟随系统,也可能使用扩展或独立设置;命令行工具则经常读取环境变量或自己的配置文件。因此,“浏览器能用,终端不行”并不矛盾。
还要把两层分流分开看:应用先决定是否把请求交给本地代理,内核收到请求后,再按路由规则选择直连或代理出站。请求进入 v2rayN,不代表一定经过远端节点;系统代理已开启,也不代表每个进程都会把请求送进去。
- 系统代理:向愿意遵循系统设置的应用提供代理入口,不等于接管全部网络连接。
- PAC:由脚本根据目标返回代理地址或
DIRECT。走直连可能是规则结果,而非开关失效。 - 终端代理:常见来源是
http_proxy、https_proxy、ALL_PROXY或工具参数。 - TUN:属于另一条流量接管路径。本文先关闭 TUN 做隔离测试,避免与系统代理混在一起判断。
先确认本地端口,再测试代理出站
以下用 SOCKS 端口 10808 和 HTTP 端口 10809 举例,它们不是所有版本通用的固定值。有的配置只提供一个混合端口,能够同时接收 HTTP 与 SOCKS。请先在 v2rayN「设置」→「参数设置」中查看本地监听相关选项,并结合启动日志确认;界面字段会随版本变化,以实际显示为准。
在 PowerShell 中执行下面的命令。先看端口是否监听,再用 curl.exe 显式指定代理。这里刻意写出程序名,避免某些 PowerShell 环境把 curl 解释为其他命令的别名。目标地址仅用于连通性对照,也可以换成你正在排查的 HTTPS 网站。
# 查看示例端口的监听状态
Get-NetTCPConnection -State Listen -LocalPort 10808,10809 -ErrorAction SilentlyContinue |
Select-Object LocalAddress,LocalPort,OwningProcess
# HTTP 代理:忽略代理绕过列表,最长等待 20 秒
curl.exe --noproxy "" --proxy http://127.0.0.1:10809 --connect-timeout 10 --max-time 20 -I https://example.com/
# SOCKS 代理:让代理侧处理目标域名解析
curl.exe --noproxy "" --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
HTTP 代理访问 HTTPS 目标时,通常先显示 200 Connection established,这只说明 CONNECT 隧道已建立。还要继续看 TLS 是否完成、目标站是否返回响应。若站点不接受 HEAD 请求,可以去掉 -I,改用 -o NUL -D - 查看 GET 响应头。
结论:显式代理成功后,再查应用设置
如果指定 --proxy 能拿到目标站响应,而浏览器仍打不开,优先检查浏览器读取的代理来源。若连本地端口都连接不上,应先恢复内核监听,继续切换浏览器设置没有意义。
浏览器分支:检查系统设置、扩展与 PAC
先用正常浏览器窗口测试,不要直接把隐私窗口当作“禁用所有扩展”的保证:部分扩展可以获准在隐私窗口运行。更稳妥的办法是暂时关闭代理相关扩展,或使用新的浏览器配置文件,并完整退出旧进程后重新打开。
-
设置系统代理
在 v2rayN 托盘菜单中进入「系统代理」→「自动配置系统代理」。确认内核正在运行。此处“自动配置”是客户端写入系统设置的动作,不应直接理解成使用 PAC。
-
核对系统入口
Windows 11 打开「设置」→「网络和 Internet」→「代理」,检查「使用代理服务器」中的地址与端口。若启用了「使用设置脚本」,也要记录脚本地址,确认它是不是当前需要的配置。
-
排除扩展覆盖
Chrome 在地址栏打开
chrome://extensions/,Edge 打开edge://extensions/,暂时关闭代理切换扩展。再到浏览器「设置」→「系统」或「系统和性能」中打开计算机代理设置,核对实际入口。 -
检查独立设置
Firefox 打开「设置」→「常规」→「网络设置」→「设置」,测试时选择「使用系统代理设置」。若选了「手动代理配置」或「自动代理配置 URL」,浏览器就不一定跟随 v2rayN 写入的设置。
-
复测同一地址
暂时停用不再需要的 PAC 脚本,确认手动代理指向实际 HTTP 或混合端口,再访问命令行测试使用的同一目标。测试结束后恢复原有脚本、扩展与绕过规则,不要永久删除不了解用途的配置。
如果只有部分域名不走代理,重点查看 PAC 是否返回 DIRECT、系统代理的例外列表,以及内核路由是否匹配直连。PAC 的选择发生在请求进入内核之前;内核路由则发生在进入之后。查看对应时间的访问日志,能够帮助区分这两个位置。
- 浏览器打不开,显式代理命令成功:先查扩展、独立代理设置和系统策略。
- 浏览器可以打开,但访问日志显示直连:检查内核路由,而不是继续改浏览器端口。
- 停用脚本后恢复正常:检查 PAC 的域名匹配、脚本地址可达性和浏览器缓存。
终端分支:检查环境变量与工具自己的配置
终端窗口本身不决定所有命令如何联网。curl.exe、包管理工具和运行时可能各用一套代理逻辑。首先列出当前 PowerShell 进程中的代理环境变量,特别留意 NO_PROXY:即使代理地址正确,匹配绕过列表的目标仍可能直连。
# 查看当前终端进程中的代理变量
Get-ChildItem Env: |
Where-Object { $_.Name -match '^(HTTP_PROXY|HTTPS_PROXY|ALL_PROXY|NO_PROXY)$' }
# 查看 Windows 的 WinHTTP 代理,作为另一套配置单独记录
netsh winhttp show proxy
netsh winhttp show proxy 显示的不是浏览器系统代理页面的简单副本。WinHTTP 与用户级代理是不同的配置体系,不能因为这里显示“直接访问”就断言 v2rayN 没有写入系统代理,也不建议为了修复一个命令就贸然修改整机配置。
下面的测试只修改当前 PowerShell 会话,并在结束时还原原值。请把端口换成实际 HTTP 或混合端口。HTTPS 目标使用 http://127.0.0.1:10809 作为代理地址是正常的:这里的协议描述客户端如何连接本地代理,不是目标网站的协议。
$names = @('http_proxy', 'https_proxy', 'ALL_PROXY', 'NO_PROXY')
$saved = @{}
foreach ($name in $names) {
$saved[$name] = [Environment]::GetEnvironmentVariable($name, 'Process')
}
try {
$env:http_proxy = 'http://127.0.0.1:10809'
$env:https_proxy = 'http://127.0.0.1:10809'
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:NO_PROXY -ErrorAction SilentlyContinue
curl.exe --connect-timeout 10 --max-time 20 -I https://example.com/
}
finally {
foreach ($name in $names) {
if ($null -eq $saved[$name]) {
Remove-Item "Env:$name" -ErrorAction SilentlyContinue
}
else {
Set-Item "Env:$name" $saved[$name]
}
}
}
这段命令成功,只能证明当前 curl.exe 能读取这些变量。若换成其他工具仍失败,应查那个工具的代理选项、配置文件和运行账户。已经打开的终端通常不会自动继承后来修改的用户环境变量;确认需要持久化之后,再修改用户变量并重新启动终端,不要一开始就用全局设置扩大影响范围。
按报错定位,不把所有失败都归给节点
需要更详细的信息时,在测试命令中加入 -v,观察连接的是本地代理还是目标地址。分享输出前应遮住代理认证信息、订阅地址和其他敏感参数。下面几类是 curl 的常见错误,处理方向不同。
curl: (7) Failed to connect to 127.0.0.1 port 10809
原因与解法:本地端口未监听、地址填错或连接被拦截。先核对实际端口与内核启动日志;如果端口有监听,再用监听进程的 PID 确认它确实属于当前客户端。
curl: (5) Could not resolve proxy
原因与解法:curl 无法解析代理服务器的主机名。检查命令、环境变量或工具配置中的代理地址拼写;本机测试先明确使用 127.0.0.1,不要将目标网址填进代理主机字段。
curl: (28) Connection timed out
原因与解法:连接或传输超过等待时间。用详细输出确认超时发生在连接本地端口、建立隧道还是访问目标阶段,再结合内核日志检查出站;不能仅凭这一行判断节点失效。
curl: (60) SSL peer certificate or SSH remote key was not OK
原因与解法:TLS 证书验证失败。检查系统时间、证书信任链以及网络是否存在 HTTPS 检查;不要把关闭证书验证作为长期修复方案。
如果本地监听正常,HTTP 和 SOCKS 显式测试都在出站阶段失败,再检查所选节点、系统时间和远端配置。使用 VLESS 或 VMess 的节点,还需核对传输方式、TLS 与服务端参数;这些问题不靠切换系统代理开关解决。订阅更新后也要确认当前选中的是仍有效的配置,而不是只看到列表已刷新。
常见追问与恢复检查
浏览器能上网,为什么 PowerShell 还是超时?
先用 curl.exe --proxy 指定实际端口测试。成功后再检查当前会话的环境变量和具体工具配置。浏览器能读取系统代理,并不意味着所有终端程序都会读取。
只开系统代理,为什么部分网站仍显示本地出口?
检查 PAC、代理例外列表和内核路由。对同一域名发起一次请求,同时查看日志中的出站选择;若命中直连规则,应调整对应规则,而不是把 HTTP 端口随意改成 SOCKS 端口。
退出 v2rayN 后浏览器也打不开了,怎么恢复?
先在托盘「系统代理」→「清除系统代理」恢复,再退出客户端。若程序已退出,到 Windows「设置」→「网络和 Internet」→「代理」关闭残留的手动代理;原来由单位配置的脚本和代理不要擅自删除。
换成 socks5h 就能打开,是 DNS 有问题吗?
socks5h 让代理侧处理目标域名解析,而 socks5 通常由本地解析。两者结果不同可以提示解析路径差异,但仍要核对 DNS 返回地址和路由日志,不能只据此认定某个 DNS 服务故障。
最后恢复原先的 TUN、PAC、扩展和环境变量,每恢复一项就复测一次。保留一条可用的显式代理命令作为基准:以后再次遇到问题,先验证本地入口与出站,再查应用是否把流量交了进来。这样能缩小排查范围,也能避免把浏览器设置问题误当成节点问题。