如何避免使用国外VPN访问国内地址

来源:http://docs.google.com/View?id=dg6xfw7w_0hbbkmwcg

似乎有个脚本的下载连接死了, 现在把脚本挪到google code里, 地址如下:



以下内容过时, 请参看chnroutes项目的wiki, 增加对pptp vpn的支持.
------------------------------


通 常情况下在openvpn连接之后, 如果openvpn的服务端或者客户端设置了redirect gateay选项, 那么openvpn的网关将取代原有的网关成为默认网关. 也就是说在这以后互联网上所有的信息都是通过vpn的网路获取的. 对于只访问国外网站的朋友来说, 这样的结果是可以接受的. 然而对于像我这样的国内国外网站都经常访问的人来说就显得不那么合适了.
那么有没有什么办法能做到访问国外的网站的时候用vpn, 而国内的网站则是直接用本地网关进行访问呢? 答案是有的. 只要设置一下本机的路由表, 让国外的ip路由到vpn网关, 而国内ip则路由到本地的网关就可以了. 这在配置上有两种方式: 
  1. 在openvpn连接之后, 不更改网关, 但在配置文件中加入route选项指定一些经常访问的国外网站的ip(范围)使用vpn路由 
  2. 在openvpn连接后, 把openvpn设置为默认网关, 然后利用脚本修改国内ip的路由, 把他们route到原来的网关去

对 于方式1, 它的优点是设置简单, 只需要在配置文件上加入 "route ip mask" 这样的语句就可以, 而且它们会在vpn连接断开之后自动清空. 但缺点也很明显, 默认情况下openvpn只能支持20条route项目, 而且一些网站的ip范围变化很大, 需要不断测试才能获取它们完整的范围. 对于方式2, 则没有这个问题. 通过http://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst 我 们可以获取到整个亚洲地区的ip分布表, 也就是说我们能利用这个文件得到完整的中国ip的范围. 而openvpn是支持在连接时和断开后调用脚本的. 这样, 我们只需要在openvpn设置redirect gateway选项, 然后连接的时候调用一个路由脚本指定中国的ip走本地的gateway就可以了. 为了避免一些不可预知的问题, 在vpn断开之后调用一个删除这些路由也时有必要的.

以下我分别写了三个脚本分别针对Linux,Mac OSX, Windows三个系统, 它们就是用于生成上文所说的设置/删除 国内ip路由的脚本.


使用方法(for Linux & Mac): 
  1. 文件下载之后, 修改个易记点的名字, 比如chnroutes 
  2. 然后输入 python chnroutes  这将生成两个文件 vpnup 和 vpndown (windows 上只有一个 vpnup.bat)
  3. 用命令 chmod a+x vpnup 和 chmod a+x vpndown 修改这两个新生成的脚本的可执行属性
  4. 把vpnup, vpndown两个文件copy到openvpn配置文件所在目录, 修改openvpn配置, 在末尾加入两行: up vpnup 和 down vpndown
  5. 然 后重新连接openvpn就可以了, 输入命令 netstat -nr 如果能看到一大堆的输出, 说明route已经设置成功. 不过, 需要注意的是, 如果openvpn服务端没设置redirect gateway, 那么也请在客户端的配置里加入一句: redirect-gateway

对于windows用户, 因为route命令运行比linux这些系统慢很多, 所以如果利用openvpn的up选项去调用vpnup.bat脚本将容易出现执行超时而导致openvpn连接失败, 所以我建议在连接openvpn之前手动执行vpnup.bat, 然后再进行连接. 另外可能大部分的windows用户都不会安装python的运行环境, 为了省却麻烦, 我这里已经生成了一个批处理文件 vpnup.bat, 下载之后改名为vpnup.bat就可以了, 因为ip范围的变化不是很大, 也没必要实时生成.


最后, 这些脚本执行是可能失败的, 因为有些时候机器会因为某些问题而没有了default gateway的信息. 这需要先把问题修正之后再进行vpn连接.

补充: 如果连上vpn之后发现国外被封网站还是没法访问, 请检查一下dns设置. 请务必使用国外的dns服务器. 这个可以手动指定, 更方便的是在openvpn脚本里指定, 但这个方式不一定凑效.

没有评论: