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 劫持。