先用显式指定代理的请求验证本地端口和节点,再分别检查浏览器的代理来源、终端的环境变量,最后决定是否需要 TUN。本文以 Windows 上的 v2rayN 为操作主线,适合“浏览器能用但终端不能用”或“开启系统代理后仍然直连”的情况;所有示例端口都需要与本机配置核对。
先分清系统代理、本地端口与路由分流
v2rayN 的“自动配置系统代理”主要负责把代理地址写入操作系统设置,不等于截获所有程序的流量。应用需要主动读取这套设置,才会连接本地代理。浏览器通常会读取,命令行工具则各有约定,因此同一台电脑上出现两种结果并不矛盾。
请求进入本地代理后,内核还会根据路由规则选择直连、代理或阻断。开启系统代理只说明应用有机会进入内核,不保证所有目标都从远端节点出站。订阅更新成功、节点延迟有结果,也不能代替对实际网页请求的验证。
| 检查层 | 负责什么 | 主要证据 |
|---|---|---|
| 应用代理设置 | 决定是否把请求交给本地代理 | 浏览器设置、启动参数、终端参数 |
| 本地入站端口 | 接收 HTTP 或 SOCKS 请求 | 监听地址、监听端口、内核启动日志 |
| 路由与 DNS | 决定域名如何解析、连接从哪里出站 | 访问日志中的目标与出站标签 |
| 远端节点 | 完成代理连接与转发 | 实际请求结果、握手错误、超时记录 |
排查时先关闭 TUN,保留一个代理客户端运行。这样不会让 TUN 替错误的系统代理设置“兜底”,也能减少两个接管入口同时存在时的干扰。如果设备由单位统一管理,不要绕过组织下发的网络策略。
第一步:确认端口,再做显式代理测试
先打开 v2rayN 的「设置」→「参数设置」,查找本地监听端口及入站协议,并核对内核启动日志。不同版本可能采用独立 HTTP、SOCKS 端口,也可能使用混合端口;不要根据旧教程把端口号当作固定默认值。以下使用一组独立端口演示,并非对当前版本默认配置的声明。
-
记录端口
记录本地 HTTP 或混合端口,以及 SOCKS 端口。只有一个混合端口时,两个测试使用同一端口;不要填写节点订阅里的远端服务器端口。
-
启动内核
在主界面选定要测试的服务器并设为活动服务器,确认日志没有启动失败。测试期间只保留一个节点与同一套规则。
-
检查监听
在 PowerShell 运行下方监听查询。若没有结果,先查内核启动;若端口属于其他进程,先处理占用,不要继续改浏览器。
-
指定代理
使用
curl.exe显式指定代理,观察 HTTP 响应和错误。Windows PowerShell 中直接输入curl可能调用别名,因此这里使用完整程序名。
# 将端口替换为本机实际监听值
Get-NetTCPConnection -State Listen -LocalPort 10809 |
Select-Object LocalAddress, LocalPort, OwningProcess
# HTTP 代理:HTTPS 请求通过 CONNECT 隧道传输
curl.exe --proxy http://127.0.0.1:10809 --noproxy "" --connect-timeout 10 --max-time 20 -I https://example.com/
# SOCKS5:由代理端处理目标域名解析
curl.exe --proxy socks5h://127.0.0.1:10808 --noproxy "" --connect-timeout 10 --max-time 20 -I https://example.com/
--noproxy "" 用于在这次显式测试中清空绕过列表。示例网址只用于检查链路,不代表任何特定地区的可访问性;进一步诊断时应换成实际失败的目标。收到目标站的 HTTP 状态码,说明请求已取得 HTTP 响应;即使是 403 或 405,也与“连不上本地代理”不同,但仍需结合日志判断出站是否经过远端节点。
浏览器不走代理:检查系统设置与扩展覆盖
若显式代理测试成功,而浏览器仍不符合预期,先让浏览器使用系统代理,再处理自己的代理扩展。Edge 和 Chrome 通常采用 Windows 的代理设置,但扩展、启动参数和组织策略可能改变行为。无痕窗口也不一定能排除扩展,因为部分扩展允许在无痕模式运行。
-
写入系统代理
右键 v2rayN 托盘图标,进入「系统代理」→「自动配置系统代理」。不要选择「清除系统代理」,也不要把“不改变系统代理”理解为自动启用。
-
核对系统地址
Windows 11 打开「设置」→「网络和 Internet」→「代理」,检查「使用代理服务器」里的地址与端口,确保对应 v2rayN 的 HTTP 或混合入站。记录原有自动配置脚本,避免两套配置干扰判断。
-
暂停代理扩展
在浏览器的扩展管理页暂时关闭代理切换扩展。检查启动快捷方式是否附带代理参数,退出全部浏览器窗口后重新打开,再访问同一个测试地址。
-
检查独立设置
Firefox 进入「设置」→「常规」→「网络设置」→「设置」,选择「使用系统代理设置」。若选择手动配置,则必须单独核对 HTTP、SOCKS 及不使用代理的地址列表。
如果只有某个网站直连,检查代理例外和 v2rayN 路由。比如浏览器把局域网地址排除在代理之外,或规则把某个域名送往直连出站,都不属于系统代理开关失灵。可短暂切换到全部代理的路由模式做对照,测试后恢复原规则;不要直接删除整套路由。
- 所有浏览器都失败:优先核对系统代理端口、自动配置脚本以及是否被其他软件反复改写。
- 只有一个浏览器失败:优先检查该浏览器的扩展、独立设置、启动参数和管理策略。
- 网页打开但出口判断不同:对照目标域名的出站日志;出口查询网站只反映访问它自己的那条请求。
终端不走代理:显式参数优先,环境变量其次
命令行工具不一定读取 Windows 系统代理。终端窗口本身也不是统一的网络客户端:同一个 PowerShell 里,curl.exe、脚本运行时和包管理工具可以采用不同的代理来源。先验证具体程序,再决定是否设置环境变量,不要把浏览器可用当作终端已经接管。
对 curl 来说,https_proxy 表示“访问 HTTPS 目标时使用哪个代理”,其值仍可为 http://127.0.0.1:10809。这里的 http:// 描述本地代理协议,不意味着目标网页改用明文传输。误写成 https://127.0.0.1:10809,可能让程序向普通 HTTP 代理端口发起 TLS 握手并失败。
# 先记录旧值;以下设置只影响当前 PowerShell 及其新启动的子进程
$oldHttpsProxy = $env:https_proxy
$oldNoProxy = $env:no_proxy
$env:https_proxy = "http://127.0.0.1:10809"
$env:no_proxy = "localhost,127.0.0.1"
# 不带 --proxy,验证该程序是否读取环境变量
curl.exe --connect-timeout 10 --max-time 20 -I https://example.com/
# 测试完成后恢复原值
if ($null -eq $oldHttpsProxy) {
Remove-Item Env:https_proxy -ErrorAction SilentlyContinue
} else {
$env:https_proxy = $oldHttpsProxy
}
if ($null -eq $oldNoProxy) {
Remove-Item Env:no_proxy -ErrorAction SilentlyContinue
} else {
$env:no_proxy = $oldNoProxy
}
先逐段执行设置、测试、恢复,不要把整个代码块一次运行后再检查变量。若还需代理 HTTP 目标,应按该工具文档检查 http_proxy;curl 对这一变量的大小写有专门规则,跨平台脚本宜使用小写。ALL_PROXY 可作为 curl 的通用后备代理,但不是所有程序都支持,也不是所有工具都能接受 SOCKS 地址。
| 配置方式 | 生效范围 | 排查注意点 |
|---|---|---|
--proxy | 当前一次 curl 请求 | 适合建立可重复的诊断基线 |
$env:https_proxy | 当前 PowerShell 和随后启动的子进程 | 已经运行的其他终端不会同步获得新值 |
NO_PROXY | 支持该变量的工具 | 目标域名或通配规则可能导致绕过代理 |
| 工具自身配置 | 对应程序或项目 | 可能覆盖环境变量,需要逐个检查 |
若环境变量无效,回到程序自己的代理选项。PowerShell 的 Invoke-WebRequest 可以用 -Proxy http://127.0.0.1:10809 显式测试,不能仅凭 curl 成功就认定它也会读取同一变量。WSL 和容器也有独立网络环境,其中的 127.0.0.1 不一定指向 Windows 主机,需要根据网络模式确认主机地址和监听范围。
用真实报错区分端口、TLS 与远端超时
保留失败请求的完整错误和发生时间,再对照 v2rayN 日志。下面的端口是本文示例值,实际报错会显示你的端口和等待时长。不要只截取“连接失败”四个字,也不要将含订阅链接、认证信息的完整日志公开发送。
curl: (7) Failed to connect to 127.0.0.1 port 10809
原因:本机到代理监听端口的连接没有建立,常见于内核未运行或端口填错。解法:先查监听记录和所属进程,再核对 HTTP 或混合入站;此时更换远端节点通常解决不了本地连接失败。
curl: (35) schannel: failed to receive handshake, SSL/TLS connection failed
原因:TLS 握手失败,可能涉及代理协议写错、目标服务或本地安全软件,不能仅凭该信息认定节点失效。解法:先检查代理 URL 是否误写为 HTTPS,再核对系统时间并用另一目标对照,不要用关闭证书验证来掩盖问题。
curl: (28) Operation timed out after 20000 milliseconds with 0 bytes received
原因:请求在设定时限内没有收到数据,可能卡在远端连接、DNS 或目标响应阶段。解法:加上 -v 重试,区分是否已完成代理连接及 CONNECT,再结合内核日志检查目标域名与出站。
使用 socks5h:// 测试成功,而使用需要本地解析的方式失败,说明解析路径值得优先检查,并不自动证明某一公共 DNS 必然有问题。还要检查路由规则是否依赖域名解析,以及 DNS 请求本身是否被送到了预期的出站。
什么时候改用 TUN,什么时候继续修系统代理
当多个应用没有代理设置、各自环境变量难以管理,或确实需要接管更多 IP 流量时,可以考虑 TUN。它通过虚拟网络接口与路由接管流量,覆盖范围通常大于系统代理;但能否正确接管仍取决于内核、权限、路由、DNS 和应用行为,并非所有网络问题的统一修复开关。
- 先修系统代理:浏览器端口填错、扩展强制直连、curl 参数写错。这些问题已有明确原因,不需要换接管方式。
- 考虑 TUN:多个应用不读取系统代理,并且逐个设置代理的成本较高。先确认普通代理链路已经可用。
- 暂缓开启:显式代理请求仍失败、远端节点握手错误、单位网络存在强制策略。TUN 不会自动修复节点或认证配置。
启用前记录当前系统代理和路由状态,按 v2rayN 提示授予所需权限,再打开界面的 TUN 开关。测试期间先清除系统代理并恢复终端临时变量,避免应用同时经过显式代理和 TUN,导致证据难以解释。观察虚拟接口、默认路由和 DNS 是否建立,再检查局域网服务是否仍可访问。
常见问题与最终复核
浏览器能打开网页,为什么终端仍然超时?
先运行本文的 curl.exe --proxy 测试。显式参数成功、普通命令失败,优先检查该工具是否读取环境变量,以及 NO_PROXY 是否包含目标。不要先重装客户端。
退出 v2rayN 后网页也打不开了,怎么恢复?
打开 Windows「设置」→「网络和 Internet」→「代理」,检查是否仍指向已停止的本地端口。个人设备可关闭这项手动代理;若原先使用单位代理或自动配置脚本,应恢复原设置。
HTTP 和 SOCKS 到底应该填哪个端口?
按本地入站协议填写,不按名称猜测。浏览器的 HTTP 代理栏填写 HTTP 或兼容的混合端口;SOCKS 配置填写 SOCKS 或兼容的混合端口。远端节点的 443 不是本机代理端口。
系统代理开着,出口地址没变,是没有生效吗?
不一定。先看出口查询域名是否匹配直连规则,再对照内核访问日志;若尚未启用访问日志,按当前内核支持的设置临时开启,完成诊断后恢复。只看一个查询站的结果不能推断全部应用的路径。
最终只需保留一条清晰证据链:本地端口确实监听,显式代理请求可得到响应,浏览器采用正确的代理来源,终端程序读取自己的代理参数,路由日志显示预期出站。按这个顺序逐层复核,比反复开关系统代理或连续更换节点更容易定位原因。需要重新整理订阅、节点和启动顺序时,可从站内快速上手教程重新建立基线。