0%

Windows 下 PPTP VPN 与代理路由冲突排查记录

Windows 下 PPTP VPN 与代理路由冲突排查记录

记录时间:2026-06-14

说明:本文中的 VPN 名称、域名、服务器 IP、局域网 IP 均为脱敏后的示例占位,不对应真实环境。

1. 问题现象

本机同时存在代理/TUN、局域网、ZeroTier、PPTP VPN 等多种网络路径。

遇到的问题包括:

  • 开着 v2ray/singbox 代理后,示例PPTP VPN 连接失败。
  • 连接 VPN 后,本机访问部分局域网服务器失败。
  • 希望只有指定 IP 192.168.99.55示例PPTP VPN。
  • 希望局域网服务器和反向代理链路仍然走本地以太网。

2. 本机关键网络信息

示例PPTP VPN 信息:

1
2
3
4
5
6
名称: 示例PPTP
服务器: vpn.example.invalid
服务器 IP: 203.0.113.20
类型: PPTP
认证方式: MS-CHAP v2
SplitTunneling: True

本地以太网:

1
2
3
4
接口: 以太网
InterfaceIndex: 10
本机地址: 10.0.31.37
本地网关: 10.0.255.254

singbox TUN:

1
2
3
接口: singbox_tun
地址: 172.18.0.1
默认路由: 0.0.0.0/0 -> 172.18.0.2

3. 根因分析

3.1 为什么开代理后 PPTP 连接失败

PPTP 不只是普通 TCP 连接,它通常需要:

1
2
TCP 1723
GRE 协议 47

代理/TUN 很容易接管默认路由,但 GRE 这类流量通常不能像普通 HTTP/SOCKS 流量一样被代理。

排查时发现:

1
2
vpn.example.invalid -> 203.0.113.20
到 203.0.113.20 的路由原本走 singbox_tun

这会导致 PPTP 初始连接可能碰到服务器,但后续认证/PPP/GRE 阶段失败。日志中曾出现:

1
2
RasClient error 619
RasClient error 628

后来给 VPN 服务器 IP 添加本地直连路由后,PPTP 不再被 singbox_tun 接管。

3.2 为什么连接 VPN 后局域网服务器访问失败

原始 VPN 配置中:

1
SplitTunneling: False

这表示 VPN 会抢默认路由,让很多本来应该走本地网卡的流量进入 VPN。

因此连接 VPN 后,访问局域网服务器可能失败。

解决方式是开启分流:

1
Set-VpnConnection -Name "示例PPTP" -SplitTunneling $True

开启后,只有明确添加到 VPN 的路由才走 VPN,其他流量继续按本地路由表走。

4. 最终路由方案

4.1 VPN 服务器本身必须走本地以太网

目的:保证 PPTP 连接过程不被 singbox_tun 或其他代理接管。

1
203.0.113.20/32 -> 10.0.255.254 -> 以太网

持久路由命令:

1
route -p add 203.0.113.20 mask 255.255.255.255 10.0.255.254 metric 1 if 10

4.2 局域网服务器固定走本地以太网

目的:保证本机与局域网服务器、反向代理链路不被 VPN 或 TUN 带偏。

1
2
10.10.250.12/32  -> 10.0.255.254 -> 以太网
10.10.242.101/32 -> 10.0.255.254 -> 以太网

持久路由命令:

1
2
route -p add 10.10.250.12 mask 255.255.255.255 10.0.255.254 metric 1 if 10
route -p add 10.10.242.101 mask 255.255.255.255 10.0.255.254 metric 1 if 10

4.3 只有指定目标走示例PPTP

目标:

1
192.168.99.55/32 -> 示例PPTP

命令:

1
2
Set-VpnConnection -Name "示例PPTP" -SplitTunneling $True -Force
Add-VpnConnectionRoute -ConnectionName "示例PPTP" -DestinationPrefix "192.168.99.55/32" -RouteMetric 1

说明:

  • 这条路由属于 VPN 配置。
  • 它只在 示例PPTP 连接后生效。
  • 它不会让全部流量走 VPN,只让 192.168.99.55 这个 IP 走 VPN。

5. 常用排查命令

5.1 查看 VPN 配置

1
2
3
Get-VpnConnection -Name "示例PPTP" |
Select-Object Name,ServerAddress,TunnelType,AuthenticationMethod,EncryptionLevel,SplitTunneling,RememberCredential,ConnectionStatus,Guid |
Format-List

5.2 查看当前 IPv4 路由表

1
2
3
4
Get-NetRoute -AddressFamily IPv4 |
Sort-Object -Property RouteMetric,InterfaceMetric,DestinationPrefix |
Select-Object DestinationPrefix,NextHop,RouteMetric,InterfaceMetric,ifIndex,InterfaceAlias,PolicyStore |
Format-Table -AutoSize

5.3 查看某个目标 IP 实际会走哪条路由

1
2
3
4
Find-NetRoute -RemoteIPAddress 203.0.113.20
Find-NetRoute -RemoteIPAddress 10.10.250.12
Find-NetRoute -RemoteIPAddress 10.10.242.101
Find-NetRoute -RemoteIPAddress 192.168.99.55

重点看:

1
2
3
4
InterfaceAlias
InterfaceIndex
NextHop
DestinationPrefix

5.4 查看持久路由

1
route print -4

也可以只看相关目标:

1
2
route print -4 203.0.113.20
route print -4 10.101.*

5.5 查看 VPN 连接错误日志

1
2
3
4
5
6
7
Get-WinEvent -LogName Application -MaxEvents 80 |
Where-Object {
$_.ProviderName -match "RasClient|RasMan|RemoteAccess" -or
$_.Message -match "示例PPTP|PPTP|vpn.example.invalid|RAS"
} |
Select-Object TimeCreated,ProviderName,Id,LevelDisplayName,Message -First 12 |
Format-List

常见错误码:

1
2
3
619: PPTP 链路/PPP/GRE 阶段失败,常见于代理/TUN/防火墙/服务端断开
628: 远程计算机在连接完成前终止连接
691: 用户名、密码错误,或服务端不允许当前认证协议

5.6 手动拨号测试

1
rasdial "示例PPTP"

如果已经连接,可查看:

1
rasdial

6. 本次验证过的结论

最终确认的稳定状态:

1
2
3
4
5
6
7
8
9
10
11
12
示例PPTP:
SplitTunneling = True

VPN 服务器:
203.0.113.20/32 走本地以太网

本地局域网服务器:
10.10.250.12/32 走本地以太网
10.10.242.101/32 走本地以太网

VPN 内部目标:
192.168.99.55/32 走示例PPTP

这种方案的效果:

  • singbox_tun 可以继续存在。
  • PPTP 连接服务器本身不再走 singbox_tun。
  • 连接 PPTP 后不会抢走全部默认路由。
  • 局域网服务器和反向代理链路继续走本地网络。
  • 只有指定的 192.168.99.55 进入 示例PPTP

7. 下次快速处理流程

如果以后又遇到类似问题,按下面顺序查:

  1. 先看 VPN 服务器 IP 是否被代理/TUN 接管。
1
2
Resolve-DnsName vpn.example.invalid -Type A
Find-NetRoute -RemoteIPAddress 203.0.113.20

如果走 singbox_tun,加或修复本地直连路由:

1
route -p add 203.0.113.20 mask 255.255.255.255 10.0.255.254 metric 1 if 10
  1. 再看 VPN 是否开启分流。
1
Get-VpnConnection -Name "示例PPTP" | Select-Object Name,SplitTunneling,ConnectionStatus

如果是 False

1
Set-VpnConnection -Name "示例PPTP" -SplitTunneling $True -Force
  1. 确认局域网服务器走本地以太网。
1
2
Find-NetRoute -RemoteIPAddress 10.10.250.12
Find-NetRoute -RemoteIPAddress 10.10.242.101

需要时重新添加:

1
2
route -p add 10.10.250.12 mask 255.255.255.255 10.0.255.254 metric 1 if 10
route -p add 10.10.242.101 mask 255.255.255.255 10.0.255.254 metric 1 if 10
  1. 确认 VPN 内部目标走 VPN。
1
Add-VpnConnectionRoute -ConnectionName "示例PPTP" -DestinationPrefix "192.168.99.55/32" -RouteMetric 1
  1. 如果连接失败,查 RasClient 错误码。
1
2
3
4
Get-WinEvent -LogName Application -MaxEvents 80 |
Where-Object { $_.ProviderName -match "RasClient|RasMan|RemoteAccess" } |
Select-Object TimeCreated,ProviderName,Id,LevelDisplayName,Message -First 12 |
Format-List

8. 注意事项

  • route -p add 写持久路由通常需要管理员权限。
  • 如果命令行提示 The requested operation requires elevation,需要用管理员 PowerShell 执行。
  • 不要把所有 192.168.0.0/16 都直接加到 VPN,除非确定不会和本地网络冲突。
  • PPTP 比较老,对代理/TUN/防火墙/NAT 更敏感。如果服务端支持,后续可考虑换成 IKEv2、WireGuard、OpenVPN 等更稳的方案。