根据 IP 地址进行 VPN 分流(详细,亲测,通用)
背景
不在学校的时候需要使用实验室的服务器,但是实验室的服务器只能在校园网内访问,因此在校外就需要使用学校的 VPN,但是打开 VPN 以后会默认将所有流量都走 VPN,如果学校的网络较慢或者访问不了某些网站,就很不方便了。
那么,有没有办法通过自定义规则,只在访问实验室服务器 IP 的时候通过 VPN,访问 Google 等别的网站还是用本机原有的网络呢?因此我的目标是根据 IP 地址进行 VPN 分流:实验室的服务器 IP 使用学校 VPN,其他 IP 地址不使用学校 VPN。
经过一翻摸索,只需要将 VPN 的默认网关关闭,让访问外部网站的流量不再走 VPN,然后在路由表中为实验室的服务器 IP 添加一条路由到 VPN 的特殊规则即可。
下面详细介绍操作步骤,只需要 3 步即可。
步骤
添加 VPN
第一步当然添加学校的 VPN,如果已经添加过可以直接跳过看第 2 步。
使用 windows 内置的 VPN 客户端:设置-网络和 Internet-VPN-添加 VPN。
填写 VPN 服务器地址、用户名和密码等,在 连接名称
里面给这个 VPN 起个名字,**但最好起个英文名称!**用中文名可能会有意想不到的问题,比如与系统代理共存:中文 VPN 名称/校网客户端 + 代理 = Boom?锟斤拷!
保存以后打开 VPN,此时应该可以访问学校内网的服务器了。
(这一部分可以跳过)
如果想要了解一点原理,Windows 系统在 CMD 或者 powershell 当中使用 ipconfig /all
可以查看一下本机中的所有网络接口。可以发现里面有一个 VPN 对应的适配器,其中 IPv4 地址一项是这个 VPN 适配器对应的接口地址(Interface)。
对比一下开启 VPN 前后的路由表,Windows 系统在 CMD 或者 powershell 当中查看路由表的命令是 route print
>>> route print # 开启 VPN 前
...
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.31.1 192.168.31.54 8615
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331
...
===========================================================================
...
>>> route print # 开启 VPN 后
...
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.31.1 192.168.31.54 12840
0.0.0.0 0.0.0.0 在链路上 111.186.xx.xxx 46
111.186.xx.0 255.255.255.255 192.168.31.1 192.168.31.54 4281
111.186.xx.xxx 255.255.255.255 在链路上 111.186.xx.xxx 301
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 4556
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 4556
...
===========================================================================
...
对比一下可以发现,开启 VPN 以后,多了目标 IP 为 0.0.0.0 的规则,默认将所有流量都路由到 VPN 适配器对应的接口。为什么不是根据原来的那条 0.0.0.0 的规则发往 192.168.31.54?因为跃点数(Metric)代表了路由的优先级,越小的优先级越高。新加的这条规则跃点数很低,优先级高,原来的规则就失效了。
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 在链路上 111.186.xx.xxx 46
关闭 VPN 的默认网关
添加好 VPN 以后,我们需要关闭 VPN 的默认网关设置,就是让访问外部网站的流量不再走 VPN,换句话说,就是删除 IPv4 路由表当中的这一条:
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 在链路上 111.186.xx.xx 46
理论上用 route delete
命令可以直接删除路由表中的表项,但是方便起见我们可以直接在控制面板里面关闭。
打开控制面板:控制面板\网络和 Internet\网络连接
选择 VPN 对应的网络连接,名称是第 1 步当中起的 VPN 名称,右键选择属性:
在属性面板选择”高级“标签页,然后选择 IPv4(Internet 协议版本 4),选择”属性“:
再选择”高级“:
看到里面有一个”在远程网络上使用默认网关“,默认应该是勾选上的,我们取消这个勾选,然后”确定“:
关闭以后重新打开 VPN,这时候所有的流量都默认不走 VPN 了,试一下学校内部的网站或者是服务器应该是无法访问的状态,其它网站应该是使用本机原本的网络能够正常访问的。
如果这个时候看一下路由表,会发现目标地址 0.0.0.0 的规则只剩下原本的那条了:
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.31.1 192.168.31.54 8615
111.0.0.0 255.0.0.0 在链路上 111.186.xx.xxx 46
111.186.xx.0 255.255.255.255 192.168.31.1 192.168.31.54 56
111.186.xx.xxx 255.255.255.255 在链路上 111.186.xx.xxx 301
111.255.255.255 255.255.255.255 在链路上 111.186.xx.xxx 301
...
===========================================================================
永久路由:
无
===========================================================================
配置路由表
第三步就是向路由表中添加自定义的规则,将学校内网想要访问的 IP 地址路由给 VPN 适配器。
Windows 系统用管理员模式启动在 CMD 或者 powershell:
首先查看 VPN 适配器的网络接口号,用 route print
命令,在开头的接口列表当中,可以找到 VPN 名称对应的接口号(需要在 VPN 打开的才能找到),这里假设是 42
:
接着用 route
命令添加自定义规则,例如添加想要访问的 IP 地址是 123.123.123.123
,IF 后面跟的是上面找到的 VPN 适配器的网络接口号是:
route add -p 123.123.123.123 MASK 255.255.255.255 0.0.0.0 IF 42
-p
参数代表永久添加,系统重启以后仍然保留,MASK 255.255.255.255
代表完全匹配这个 IP 地址,这条命令会将目标地址是 123.123.123.123
的流量发送到指定的网络接口 42
,走 VPN。
如果有”操作完成!“的提示则代表添加成功。添加完成后,就可以直接访问学校内网指定的服务器了。这时候访问其他网站还是走原来的网络,没有经过 VPN。
(这一部分可以跳过)
检查路由表可以发现这时候多了一条永久路由,由于跃点数(METRIC)设置成了 1,因此这条规则的优先级是最高的:
>>> route print
...
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.31.1 192.168.31.54 8615
111.0.0.0 255.0.0.0 在链路上 111.186.xx.xxx 46
111.186.xx.0 255.255.255.255 192.168.31.1 192.168.31.54 56
...
===========================================================================
永久路由:
网络地址 网络掩码 网关地址 跃点数
123.123.123.123 255.255.255.255 在链路上 1
===========================================================================
...
我们还可以用 tracert 工具查看某个 IP 或者网址的路由路线来确定是否走了 VPN:
tracert 123.123.123.123
比如下面这个路由路线,第一跳发往的是与上面 VPN 相关的地址 111.186.xx.xxx,说明访问这个 IP 走的是 VPN。
参考
Windows 路由表根据 IP 段进行 VPN 分流
Windows 路由表详解 - 博客园
How to Add a Static TCP/IP Route to the Windows Routing Table
How to use Tracert/Traceroute
中文 VPN 名称/校网客户端 + 代理 = Boom?锟斤拷!