VPN 流量国内外分流

连接 VPN 后,所有流量都会经过 VPN 服务器,这就会产生网络延迟,如果服务器在国外,那延迟就更大。我们可以修改路由表,在访问国内网站时使流量不经过国外的 VPN 服务器。

没有 VPN?试试 Cloudflare Warp

 

获取国内 IP 地址段


这里有国内的所有 IP 地址段

 

修改路由表


首先要知道本机的网关,打开命令行窗口执行:

route -4 print

# 得到的结果类似以下:

#IPv4 路由表
#===========================================================================
#活动路由:
#网络目标        网络掩码          网关       接口   跃点数
#          0.0.0.0          0.0.0.0     192.168.43.1    192.168.43.12    311
#          0.0.0.0        128.0.0.0            在链路上        172.16.0.2      5
# ......

在得到的结果里包含有 0.0.0.0 0.0.0.0 的这行,第三个 IP 地址就是本机的网关了,我这里是 192.168.43.1。有了网关之后,现在可以把国内的 IP 段加入到路由表了。IP 段是这种格式:

1.0.1.0/24
1.0.2.0/23
1.0.8.0/21

以管理员身份打开命令行窗口,然后每条 IP 段执行一次以下命令,比如:

route add 1.0.1.0/24 GATEWAY

# GATEWAY:本机网关

 

通过脚本修改路由表


由于 IP 段有几千条,不可能都通过手动来执行。我写了个小脚本,运行这个脚本自动把 IP 段插入路由表。

在上面得到的 IP 地址段是一个 txt 文件,改名为 cnipv4.txt。把以下三个内网 IP 段添加进去。

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

然后新建一个 cnroute.bat 文件,复制粘贴以下内容:

@echo off
rem set gateway: %gateway%
for /f "tokens=6 delims= " %%i  in ('netsh interface ipv4 show route ^|findstr "0.0.0.0/0"') do set gateway=%%i

rem add china ip route
for /f "tokens=*" %%r in (cnipv4.txt) do (
  echo add route: %%r
  route add %%r %gateway%
)

把这两个文件放在同一个文件夹,比如 D:\cnroute,以管理员身份打开命令行窗口,然后执行:

cd D:\cnroute
.\cnroute.bat

这条命令大概需要两三分钟时间才能完成,快慢取决于系统性能。完成之后国内的流量就不会经过 VPN 服务器中转了。

 

使用对 CDN 友好的 DNS


另外由于国内有些大网站使用了 CDN,通过国外 DNS 解析得到的将是国外的 IP,因此流量还是会经过 VPN 服务器。要解决这个问题需要使用支持 EDNS Client Subnet 的 DNS,请参考使用 DNS over HTTPS 防止 DNS 劫持