chnroutes——VPN 路由助手,自动区分国内国外线路,实现VPN智能翻墙

2010年9月10日 | 分类: 代理工具 | 标签: , , ,

因为一些众所周知的原因, 来自中国大陆的网民想要访问非本国资源时总会那么的不方便, 这促使了海外vpn供应商在中国的繁荣. 使用海外vpn访问已经成为一些需要经常访问海外资源的中国网民的必要装备. 但通常这些vpn都是有流量限制的, 除此之外一些中国内部的资源也限制海外的ip访问. 本项目的就是提供一些启动脚本给vpn用户, 在vpn拨号之后修过路由表,让他们在使用vpn访问国外资源的同时, 能用非vpn线路高速访问本国资源.

使用方法

介绍
这几个脚本主要利用来自 http://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst 的数据生成路由命令脚本, 让vpn客户端在进行连接的时候自动执行. 通过这些路由脚本, 可以让用户在使用vpn作为默认网络网关的时候, 不使用vpn进行对中国国内ip的访问, 从而减轻vpn的负担, 和增加访问国内网站的速度.
基本约定

在使用这些脚本之前, 请确保你在自己的电脑上已经成功配置好一个vpn连接(pptp 或者 openvpn), 并且让之以默认网络网关的方式运行, 这通常也是默认配置, 即vpn接入之后所有网络流量都通过vpn进行.

Openvpn

使用此法之前, 请确认openvpn版本是否为 v2.1 或者以上, 如果不是请参看下方不同系统关于openvpn部分的描述

客户端设置

本 方法适用于使用openvpn v2.1或更高版本的用户. 因为openvpn v2.1比之前版本增加了一个名为max-routes的新参数, 通过设置该参数, 我们可以在配置文件里(服务端, 客户端)直接添加超过100条以上的路由信息. 具体设置步骤如下:

1. 下载 chnroutes_openvpn_v2.1 文件
2. 在命令行里执行 python chnroutes_openvpn_v2.1, 这将生成一个名为 routes.txt 的文本文件. 对于不想安装python的用户, 可以直接从项目下来列表里下载该文件. 它将会每月更新一次.
3. 使用你喜欢的文本编辑器打开上述文件, 并把内容复制粘贴到openvpn配置文件的末尾
4. 同 时在openvpn配置文件的头部添加一句 max-routes num, 其中num是一个不小于文件routes.txt的行数的数字, 实际上因为还有一些服务器端push过来的路由信息, 所以保险起见可以用 routes.txt的行数加上50, 比如目前得到的routes.txt的行数是940, 你可以把数字设置为1000: max-routes 1000
5. 修改完之后, 重新进行openvpn连接, 你可以用之前描述过的方法进行测试是否成功

以 上方法在Mac OSX, Linux 和 Windows上测试通过. 但需要注意的是, 这里用到一个net_gateway的变量表示未连接openvpn前的网关地址, 但openvpn的文档里有说明这个不是所有系统都支持的, 如果发生这个情况, 可以修改一下生成脚本, 把net_gateway修改为你的局域网的网关地址. 对于windows 7 和 vista, OpenVPN的windows客户端可能需要设置Windows XP兼容模式才能使用, 安装文件要在属性选择中的兼容性选择Windows XP和以管理员的身份运行,安装好的运行文件也同样选择这两个选项。如果还是不能连接到VPN的网络,可以尝试在配置文件中加入:

route-method exe
route-delay 2

注意事项

* 因为这些ip数据不是固定不变的, 尽管变化不大, 但还是建议每隔两三个月更新一次
* 使 用此法之后, 可能会导致google music无法访问, 这个其实是因为连上vpn之后, 使用的dns也是国外的, 国外dns对google.cn 解析出来的是国外的ip, 所以一个简单的解决方法是修改本机的hosts文件, 把国内dns解析出来的google.cn的地址写上去: 203.208.39.99 www.google.cn google.cn

Mac OSX

openvpn(假定为Tunnelblick)

如果你使用的是最新版本的Tunnelblick, 请跳过此部分内容, 直接看上方关于Openvpn v2.1的描述

1. 下载 chnroutes_ovpn_mac
2. 从终端进入下载目录, 执行python chnroutes_ovpn_mac, 执行完毕之后同一目录下将生成两个新文件’vpnup’和’vpndown’
3. 在终端里运行命令 chmod a+x vpnup vpndown 把这两个文件设置为可执行
4. 把这两个文件copy到openvpn的配置目录并修过openvpn配置文件, 在末尾加上两句:

up vpnup
down vpndown

5. 设置完毕, 重连openvpn. 你可以通过netstat -nr命令的输出来确认vpnup/vpndown 是否正确执行. 在连接之后, 使用上述命令, 如果能看到大量的输出则表明路由表已经被成功设置, 断开连接之后, 再执该命令则可以看到断开前的那些输出已经消失.

进一步的测试, 你可以使用 route 命令进行, 如执行 route get 8.8.8.8, 这里8.8.8.8是google dns的ip, 位置在国外. 你可以看到在输出结果的gateway字段与vpn的网关一致; 再尝试route get 202.96.134.133 这里202.96.134.133是一个国内的ip, 这时候输出结果的gateway将变成与没连接vpn之前的网关.

需 要注意的是, 默认情况下, 在Tunnelblick上不能选取Set nameserver选项, 否则这两个脚本将不能被调用. 但对于需要使用该功能的用户, 你可以使用在本项目下载页面提供的补丁文件, 让tunnelblick可以同时支持定制启动脚本. 使用方法, 在Terminal里 进入tunnelblick的Resources目录. 如我这里 Tunnelblick是在 /Applications里, 使用如下命令:

cd /Applications/Tunnelblick.app/Contents/Resources
patch -p1 < path_to_the_patch_file

打过补丁之后, Tunnelblick的set nameserver 功能就可以与up/down script一起使用了. 另外打补丁之前要注意Tunnelblick的版本号必须是 v3.0b24(最新)

pptp

1. 下载 chnroutes_pptp_mac
2. 从终端进入下载目录, 执行python chnroutes_pptp_mac, 执行完毕之后同一目录下将生成两个新文件’ip-up’和’ip-down’
3. 把这两个文件copy到 /etc/ppp 目录, 并使用 sudo chmod a+x ip-up ip-down命令把它们设置为可执行
4. 设置完毕, 重新连接vpn. 测试步骤同上.

Linux

openvpn

如果你使用的openvpn版本为v2.1或以上, 请跳过此部分内容, 直接看上方关于Openvpn v2.1的描述

1. 下载 chnroutes_ovpn_linux
2. 从终端进入下载目录, 执行python chnroutes_ovpn_linux, 执行完毕之后同一目录下将生成两个新文件’vpnup’和’vpndown’
3. 在终端里运行命令 chmod a+x vpnup vpndown 把这两个文件设置为可执行
4. 把这两个文件copy到openvpn的配置目录并修过openvpn配置文件, 在末尾加上两句:

script-security 2
up vpnup
down vpndown

5. 设置完毕, 重连openvpn. 测试方法同mac osx, 但需要使用 ip route get 代替mac上的 route get 命令

pptp

使用跟openvpn_linux相同的生成脚本, 区别是把生成的vpnup文件改名为 ip-pre-up, 并把ip-pre-up 拷贝到 /etc/ppp目录, vpndown 拷贝到 /etc/ppp/ip-down.d 目录. 测试步骤同上.

Windows

openvpn

如果你使用的openvpn版本为v2.1或以上, 请跳过此部分内容, 直接看上方关于Openvpn v2.1的描述

1. 下载 chnroutes_ovpn_win 文件
2. 对于已经安装有python的用户, 在命令行方式进入到下载到的文件所在目录, 执行python chnroutes_ovpn_win, 执行完毕之后同一目录下将生成’vpnup.bat’, ‘vpnup.vbs’, ‘vpndown.bat’和’vpndown.vbs’共四个文件. (如果你没有python, 可以直接下载项目下载页面上的pre_created_for_win.zip文件, 解开之后你将能得到预生成的上述4个文件)
3. 把上述的四个新生成的文件copy到openvpn配置文件所在的目录
4. 编辑openvpn配置文件, 在末尾加上以下三句:

script-security 2
up vpnup.vbs
down vpndown.vbs

这里的第一句的目的是保证有足够的安全级别可以让openvpn调用自定义脚本, 第二句up是连接openvpn之后自动调用路由添加脚本, 第三句是用来在openvpn断开之后自动清理之前添加上的路由信息.

5. 设置完毕, 重连openvpn. 你可以分别进入 http://www.cz88.net/ 和 http://whatismyipaddress.com/ 这两个网站, 如果配置正确, 在cz88网站上你将看到你的ip显示为连接vpn之前的公网ip, 而另外一个网站则显示为你的vpn服务器的公网ip. (需要注意的是vpnup.vbs其实是调用了vpnup.bat文件, 这个bat文件大概需要1分钟的时间才能完全添加所有路由信息. 也就是说在openvpn-gui显示连接已经完成的时候, 该bat文件还在执行中)

对于使用项目下载页面里的预生成的bat文件的用户, 这些预生成的文件将会不定期进行更新, 因为ipv4的范围的变化不会十分大, 所以路由信息文件应该不需要频繁更新. 另外, 有windows用户反映vbs文件并不能在openvpn里被正确调用, 这个大概是因为一些系统并没有建立到vbs文件的关联, 解决方法有2, 把.vbs文件的默认运行方式指定为C:\WINDOWS\system32\wscript.exe (这里用wscript,不用cscript是防止出现那个黑色的console界面) 又或者干脆在openvpn的配置里设置:

script-security 2
up ‘”C:/WINDOWS/system32/wscript.exe” “C:/Program Files/OpenVPN/config/vpnup.vbs”‘
down ‘”C:/WINDOWS/system32/wscript.exe” “C:/Program Files/OpenVPN/config/vpndown.vbs”‘

pptp

文件生成/获取方式同上, 但由于windows上的pptp不支持拨号脚本, 所以也只能在进行拨号之前手动执行vpnup.bat文件以设置路由表. 而在断开vpn之后, 如果你觉得有必要, 可以运行vpndown.bat把这些路由信息给清理掉.

不过, 也还是有一个方法可以实现在拨号同时进行路由表设置的, 只需要在vpnup.vbs文件末尾加上对rasphone.exe的呼叫, 进行拨号, 这样不再需要手动进行pptp拨号动作, 而只运行这个vbs就可以了. 有兴趣的同学, 可以研究一下.

Android

openvpn

1. 下载 chnroutes_ovpn_android 文件到任意安装有python环境的机器上
2. 在命令行里进入下载目录, 执行python chnroutes_ovpn_android, 这将生成’vpnup.sh’和’vpndown.sh’两个文件.
3. 把步骤2生成的两个文件拷贝到 android 的 /sdcard/openvpn/目录下, 然后修改openvpn配置文件, 在文件中加上以上三句:

script-security 2
up “/system/bin/sh /sdcard/openvpn/vpnup.sh”
down “/system/bin/sh /sdcard/openvpn/vpndown.sh”

注意自行修改其中的路径以符合你的android rom的实际路径

另外, 这里假定了你的android已经安装过busybox, 否则请先安装busybox再进行以上操作, 还需要知道的是, 这个脚本在手机上执行会花费比较长的时间, 如非必要, 就不要用了. 也许采用非redirect-gateway方式, 然后在ovpn配置文件里添加几条需要路由的ip段是比较快捷方便的做法.
基于Linux的第三方系统的路由器

一 些基于Linux系统的第三方路由器系统如: OpenWRT, DD-WRT, Tomato 都带有VPN(PPTP/Openvpn)客户端的, 也就是说, 我们只需要在路由器进行VPN拨号, 并利用本项目提供的路由表脚本就可以把VPN针对性翻墙扩展到整个局域网. 当然, 使用这个方式也是会带来副作用, 即局域网的任何机器都不适合使用Emule或者BT等P2P下载软件. 但对于那些不使用P2P, 希望在路由器上设置针对性翻墙的用户, 这方法十分有用, 因为只需要一个VPN帐号, 局域网内的所有机器, 包括使用wifi的手机都能自动翻墙. 相信配置方式请参考: Autoddvpn 项目.
信息反馈

本 项目的脚本都是在使用路由器进行拨号的情况下测试通过的, 如果在其它拨号方式下, 脚本不能运作, 请在本页添加comment说明. 或者添加一个新的issue. 另外, 在配合openvpn使用的时候, 可能会出现一种情况是因为网络质量不好, openvpn非主动断开, 这时候vpndown脚本也会被自动调用, 但重新连上之后, 可能会找不到默认的路由而添加失败, 这时候你可以通过停止openvpn重连, 并手动设置好原来的默认路由再重新进行openvpn拨号.

项目地址:http://code.google.com/p/chnroutes/

下载地址:http://code.google.com/p/chnroutes/downloads/list

我openvpn使用chnroutes时发现一个问题,如果本地DNS设置的是国内DNS服务器使用chnroutes开启openvpn后仍然不能访问被GFW污染DNS的网站,本机设置使用国外DNS服务器不会出现此问题;它是自动区分国内国外线路而不是被墙与未被墙的网站,也就是说只要是国外IP无论有没有被墙都会经过VPN这一点不如SSH+FireFox+AutoProxy方案智能;chnroutes修改路由表使用需谨慎如果操作失误可能造成不能上网的情况!

  1. 2011年9月26日20:53

    谢谢啦,博主真是大好人,如果不介意的话加我QQ,让我们成为朋友吧 ……(QQ号码在邮箱里 :)

    • iGFW
      2011年9月26日21:37

      QQ我不常用,你可以加我推特有问题,可以上面说

  2. 2011年9月25日22:34

    博主就好人做到底,帮我把pptp l2tp滴弄好传给我吧 :)谢谢先 ^_^

  3. 2011年9月25日20:33

    谢谢啦,博主总还有那么些好东西还藏着掖着 ^_^
    那请问该如何导入路由表呀?是直接改成bat文件运行吗?

    • iGFW
      2011年9月25日21:19

      不是的,openvpn按照说明把这个加到配置文件里即可,pptp l2tp的我没弄呀。

  4. 2011年9月25日18:27

    问题是我连这个都不会啊
    ——可怜的菜鸟

  5. 2011年9月25日15:16

    博主,这个chroutes作者已经好长时间没有更新了,你有最新路由版本滴下载吗?

    • iGFW
      2011年9月25日16:17

      他上面不是有获取最新路由表的方法嘛,你按照其方法即可获得最新版。

  6. 匿名
    2011年5月13日21:20

    支持啊,真不错

  7. 留名
    2010年9月10日22:05

    好长,需要耐心啊

  8. 匿名
    2010年9月10日11:39

    VPN不适合经常翻墙的人作为常用翻墙方法使用。

    • 匿名
      2011年2月16日15:35

      VPN恰恰适合经常翻墙的人作为常用翻墙方法使用。