如何避免 VPN 连接后会降低本地网络访问速度的问题

来源:http://www.cnblogs.com/dancefire/archive/2011/03/28/how-to-setup-vpn-cn-route.html

前言

上回说到了通过 VPN 进行加速, 有不少朋友已经体会到了 VPN 的好处,许多网站从缓慢到无法访问,变得可以流畅的访问了。但是,我们经常面临一个问题,VPN 拨通后,所有流量都会流经 VPN,导致本地的网络访问可能会很不顺畅,有的速度非常缓慢,有的甚至不能访问。特别是对于那些在使用 VPN 同时还在进行本地下载的用户,这个问题更加明显。对于那些收费的 VPN 而言,因为它们速度较快,所以感觉问题不大。但是,对于那些免费的、速度比较缓慢、甚至限制流量的 VPN 来说,这就是一个比较严重的问题了。很多人不得不同时只干一件事情,要使用 VPN 就停止本地网络的访问,要访问本地网络就需要断开 VPN。那么,可不可以只有访问镇外的流量走 VPN,而本地网络依旧使用本地连接呢?答案自然是可以的。

解决方案

其实这个问题在使用 VPN 之前就存在过。使用过教育网的朋友肯定有经验,国内流量是免费的,而国外流量是收费的。一般来说大家都会访问国内网络,但是毕竟偶尔也需要访问国外网络。 有的学校做的比较一刀切,干脆禁止国外流量,而有的学校则收取国外流量高昂的费用。所以,在教育网生活的时间,大家都到处寻找国内代理服务器,一时间代理 服务器搜索软件、代理服务器列表比比皆是。当时我们学校面临这个问题的时候,我们采用了另外一种办法,除了教育网光纤接入外,我们还申请了电信的包月 ADSL 作为第二链路。当时对于非服务器的网段使用的是 NAT,分别在教育网和ADSL接入上做NAT。然后,修改路由设置,凡是国内流量,都路由到教育网光纤接口;凡是国外流量,都路由到电信的 ADSL 接口。虽然,国外流量的带宽不大,但是对于当时的学生对国外网站的需求不高的情况下,这个问题还是得到了很好的解决。

再回过来看我们 VPN 的问题,会发现其实是一个问题。我们可以添加路由,将所有本地的网络(如上例的所有国内网络范围),路由到我们使用 VPN 前的默认网关。而剩余的,也就是国外的网络范围,自动流经 VPN。这就很好的解决了 VPN 降低本地网络访问速度的问题。

然后,我们需要寻找到本地的 IP 地址范围,在本例中,我使用的是国内的地址范围。因为这个数据库属于公开数据,我们可以从 CNNIC 或者 APNIC 获得相关数据。剩下的就是对地址库进行分析,然后生成路由添加和删除的脚本就可以了。

由于我的机器分别有 Ubuntu 和 Windows 7,因此,我将针对这两个系统写脚本。脚本语言不同,但是参数是一样的。

  • on    表明开启国内路由走默认网关的配置。也就是说添加国内网络的路由指向原默认网关。
  • off    表明关闭这个功能。也就是说删除之前操作所添加的路由。
  • update    是指下载更新 IP 地址库。

代码编写以及使用

Linux

对于 Linux 最通用的莫过于 Shell 了,因此,我使用 Bash 完成了这个脚本。虽然我是在 Ubuntu 系统上测试的,但是它应该支持大部分 Linux 系统。

下载脚本到本地

wget http://files.cnblogs.com/dancefire/vpnroute.zip
unzip vpnroute.zip
sudo bash vpnroute.sh on

需要删除添加的路由,可以执行:

sudo bash vpnroute.sh off 

需要更新网络路由数据,可以执行:

bash vpnroute.sh update 

Windows

Windows 的批处理文件虽然也能写一些东西,但是总觉得它的功能太受限了。因此,这次我使用 PowerShell 来写这个脚本。PowerShell 是微软 2006 年推出的抗衡 *nix 中的 shell 的产品,通过紧密结合 .Net Framework 大幅提高命令行及脚本的能力。熟悉 linux shell 脚本的朋友会在使用中会发现有很多语法似曾相识。虽然有各种不适应,但是不得不说 PowerShell 还是很强大的。

下载脚本 http://files.cnblogs.com/dancefire/vpnroute.zip 到某个目录,比如 d:\tmp

修改 PowerShell 执行权限,默认只能执行签名脚本。:

开始->附件->Windows PowerShell->右键点击 Windows PowerShell->以管理员身份执行

在命令行里执行:

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

可能会提示如下信息:

执行策略更改
执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临
about_Execution_Policies
帮助主题中所述的安全风险。是否要更改执行策略?
[Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”):

选择 Y,或者回车即可。

然后,进入下载文件所在目录,执行脚本

 
cd d:\tmp
.\vpnroute.ps1

如果脚本可以执行,它会返回如下帮助信息:

PS d:\tmp> .\vpnroute.ps1
Route networks of CN to the default gateway instead of VPN tunnel

usage: vpnroute.ps1 {on|off|update}

on Add routes of CN to default gateway
off Remove routes of CN
update Force download/update CN network data

如要添加路由,希望所有中国范围的IP使用默认的网关访问,就运行:

.\vpnroute.ps1 on

如果想要去掉添加的路由,就运行

.\vpnroute.ps1 off

想更新中国IP路由数据,就运行

.\vpnroute.ps1 update

我注意到 Windows 的 PowerShell 脚本执行速度不是很高,在 Linux 上使用 Bash 添加路由大约只需要10-20秒,在 Windows 上使用 PowerShell 需要 70-80 秒。大家如果看到有段时间没响应,不要着急,给他一些时间就会好的。

连接后,分别访问 http://www.ip.cnhttp://whatismyipaddress.com 以测试路由设置是否正常。

如果路由添加正确,访问国内网站 http://www.ip.cn 应该看到的是你国内的 ip。而访问国外网站 http://whatismyipaddress.com ,应该看到的是你 vpn 的 ip。


—————————————————————————————————————————

需要翻墙利器赛风? 请阅读和关注中国数字时代

推特用户请点击这里免翻墙上推特

请点击这里下载翻墙软件

更多翻墙方法请发电邮(最好用Gmail)到:fanqiang70ma@gmail.com

请阅读和关注中国数字时代、翻墙技术博客GFW BLOG(免翻墙)

请使用Google Reader订阅中国数字时代中文版http://chinadigitaltimes.net/chinese/feed),阅读最有价值的中文信息;以及GFW BLOG(功夫网与翻墙)http://feeds2.feedburner.com/chinagfwblog,获取最新翻墙工具和翻墙技巧信息。


没有评论: