根据 IP 地址进行 VPN 分流(详细,亲测,通用)
根据 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 8615127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331127.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 128400.0.0.0 0.0.0.0 在链路上 111.186.xx.xxx 46111.186.xx.0 255.255.255.255 192.168.31.1 192.168.31.54 4281111.186.xx.xxx 255.255.255.255 在链路上 111.186.xx.xxx 301127.0.0.0 255.0.0.0 在链路上 127.0.0.1 4556127.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 8615111.0.0.0 255.0.0.0 在链路上 111.186.xx.xxx 46111.186.xx.0 255.255.255.255 192.168.31.1 192.168.31.54 56111.186.xx.xxx 255.255.255.255 在链路上 111.186.xx.xxx 301111.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 8615111.0.0.0 255.0.0.0 在链路上 111.186.xx.xxx 46111.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?锟斤拷!