这是一个应该说还算常见的应用场景,家里的宽带是网通,学校里为了方便教师们在家访问学校资源方便,给开通了 VPN ,可是,一旦我连上了 VPN ,访问学校是快了,可是访问公网又慢了,一直傻傻以为 VPN 开启后会替换掉原来网络数据通道,所以怎么着也不能两全,其实根本不是那么回事,VPN 只不过建立了一条新通道,然后把默认路由给替换到了这条通道而已,原来的通道并没有被删掉,仍然可以使用,只不过不再是默认通道。

  解决办法很简单,就是自己设置一下路由表而已,我是网通,使用的无线路由。

  首先在 VPN 未连接状态下在命令行窗口打入 route print 指令,查看当前的默认路由,及默认网关 Default GateWay ,记下来,比如我的是 192.168.1.1
  然后连接 VPN ,再使用 route print 指令将 VPN 的默认路由记下来,比如 10.6.0.13
  接下来,使用 route add 指令设置默认路由为原来的 192.168.1.1

1
    route add 0.0.0.0 mask 0.0.0.0 192.168.1.1

  然后确定一下学校里网站的大体 IP 范围,将其路由指向 VPN 的 10.6.0.13 即可,比如我的

1
2
3
    route add 202.113.0.0 mask 255.255.0.0 10.6.0.13
    route add 219.243.0.0 mask 255.255.0.0 10.6.0.13
    route add 10.0.0.0 mask 255.255.255.0 10.6.0.13

  这样的话,访问学校内部的 202.113.* 219.243.* 10.* 等都会走 VPN ,而访问公网等都会走网通,实现了两种区域的快速访问。

  上述指令可以做成一个批处理文件,在连接 VPN  之后点击一下即可,注意不要把批处理名字也写成 route ,那样就死循环了。

  10月10日补:

  经过几次试验之后发现每次登陆学校的 VPN 获取的缺省网关是变化的,这就导致批处理的效率大打折扣,不过 bat 指令可不是想象的那么简单,强大的很,下面的批处理从 route print 的输出里获取 Default Gateway 并传递给下面的 route add 指令。

1
2
3
4
5
6
7
8
echo off
for /f "delims=: tokens=2" %%i in ('route print^|findstr /i /c:Default') do set gw=%%i
echo "VPN Gateway Found:" %gw%
route add 0.0.0.0 mask 0.0.0.0 192.168.1.1
route add 202.113.0.0 mask 255.255.0.0 %gw%
route add 219.243.0.0 mask 255.255.0.0 %gw%
route add 10.0.0.0 mask 255.255.255.0 %gw%
echo "Done"