打造自动翻墙的路由器

原文:http://xiaolife.com/wordpress/dd-wrt-with-openvpn-and-autoddvpn/

当你有多个设备在家时,要让每个设备都翻墙往往是很麻烦的。电脑上有ssh、vpn等多种方案,而Android上常用goagent,iPhone不越狱的话则只能依赖vpn或APN Proxy。而且这些方案往往在稳定性、流量控制、速度上各有各的问题。于是就有聪明人发明了从路由器级别搞定翻墙的办法。对所有设备透明,稳定,流量耗用小。

当然,我不是那个发明人。只是前些日子家中拉了一条20M的宽带,顿时觉得有必要充分利用,这才亲身实践了一次,历经磨难,查了N多资料才搞定。发觉网上没有一个真正完整的教程指导,于是索性在此写一篇。欢迎有志之士参考实践,或提出修改意见。

基本原理:让路由器刷上开源固件dd-wrt,再配置路由器自动连接openvpn,最后利用autoddvpn,自动让被墙ip段的请求添通过vpn发送。

路由器的选择

首先,dd-wrt有这么一个页面[http://www.dd-wrt.com/wiki/index.php/Supported_Devices]列出了所有支持的路由器。也就是说,路由器必须被列在这个页面中才可以刷dd-wrt。

其次,能刷dd-wrt并不意味着就能拨openvpn。openvpn支持需要路由器最好拥有8MB Flash或更多,RAM最好32MB以上。按照这个标准,你又可以过滤掉一大片选择。最后,如果你不想太折腾的话,注意表格最后一列Notes,最好上面不要有奇怪的说明。

我推荐Buffalo家的路由器。便宜(相对Linksys来说),稳定,外观带感,配置不坑爹,最关键的是,Buffalo官方就有dd-wrt的固件支持——每个路由器都会提供两种固件,其中一种就是dd-wrt。当然,刷dd-wrt网站的固件自然也没问题。

注意,不要买Buffalo的WHR系列,没有OpenVPN支持。

我目前用的是Buffalo WZR-HP-G300NH2,如果你有米,也可以考虑Linksys E4200之类。

dd-wrt的版本选择

像Buffalo这样的厂商虽然会发布直接用于对应路由器的固件,但功能也未必和dd-wrt官方相同。所以推荐用dd-wrt官方固件。

最靠谱的查找对应路由器的dd-wrt固件的办法就是,去这个ftp[ftp://ftp.dd-wrt.com/others/eko/BrainSlayer-V24-preSP2/2012/],进入最新的build文件夹,按照找你的路由器名字的文件夹,里面就是固件了。

但在刷dd-wrt之前,请前往此处[http://www.dd-wrt.com/wiki/index.php/Installation#Hardware-specific]查看关于你的路由器品牌或型号的说明。

只要按照说明操作,基本上你不会需要去了解一些终极治疗术。(当你的路由器完全死翘翘的时候你会需要,诶嘿

因为后续要支持autoddvpn,所以你需要一个支持jffs的版本,也就是说至少是V24preSP2级别的版本。V24SP1和V24都因为组件兼容性问题移除了jffs。上面我给的ftp地址就是V24preSP2的所以不用担心。(有资料提到很老的版本也有jffs但那真的太老了。。

你可能还看到有资料中提到什么mega版本啊vpn版本啊mini版本啊,不过因为刷这些版本都需要用到tftp这样的麻烦工具,所以最好不要去尝试,乖乖用std就好了。

OpenVPN的配置方式

刷好dd-wrt后,先让他能正常访问网络/然后我们就要开始在这上面配置OpenVPN了。

选择有两个:

  1. 通过dd-wrt的web界面中的“服务”->“OpenVPN”页面来直接配置。
  2. 通过telnet进路由器后,在命令行下手动上传配置文件+脚本的方式来配置。

第一中方案看似简单,但其实配置选项很多很专业,而我们往往从VPN商家拿到的都是直接的配置文件,要亲自读懂配置文件再去修改web页面的每一项,其实非常难。而且,这种方案下,要加上autoddvpn的支持还稍嫌麻烦。最坑爹的是这种方案调试极其无力。

所以我选择的是第二种方案。第二种方案下,配置OpenVPN可以直接参照autoddvpn的这份文档[http://code.google.com/p/autoddvpn/wiki/OpenVPNManualStartUP],并且请密切注意文档下放的“注意”部分,并记住我们是要用graceMode,以及配置文件结尾一定要加上 script-security 3 system。文档结尾的设置openvpncl_enable=0的部分一定不要忘记。并且一定要测试连接是否成功。

但是:在你上传前,需要先打开dd-wrt的jffs支持。参考这份文档[http://code.google.com/p/autoddvpn/wiki/jffs]中的《如何打�jffs支持》这一小段。注意,只需要参考这一小段即可,下面的部分都不需要看,也不需要操作。后续自然会讲到。

另外如果你的OpenVPN连接遇到问题,可以加上reneg-sec 0这一句试试。以及配置文件中不要加auth-nocache,否则很可能会每小时openvpn客户端就错误退出。

 autoddvpn

这个项目的地址在此:http://code.google.com/p/autoddvpn/ ,不过他的文档写的真的很乱。你可以完全不管不看。

刚才如果你按照上一步中的autoddvpn的文档已经写好了OpenVPN配置文件,那里面就包含了在VPN连接和断开后对autoddvpn脚本的调用命令。所以我们只需要做一步,把autoddvpn的文件搞到对应位置即可。具体操作按照这份文档[http://code.google.com/p/autoddvpn/wiki/graceMode],直接看《�置方式(以OpenVPN�例)》部分,包括设置DNSMasq和SSH进入路由器后执行的几行命令。当然,不用ssh,用telnet也可以。

如果你会使用到基于bonjour的服务,比如iPhone的Wi-Fi同步,那么在“服务”->“服务”的DNSMasq中建议不要启用 本地DNS。

在这份文档中还讲到了通过创建vpnup_custom文件来增加一些没有被包含在自动翻墙列表中的ip段。可以参考使用。

调试

确保你的文件都乖乖放在/jffs/openvpn/下了,并且没有吃饱了去修改名字。确保你的路由器的DNS设置是按照上文说的那样做。然后就是那么几条命令方便你自己调试:

在当前终端连接openvpn并显示连接日志:openvpn --config /jffs/openvpn/openvpn.conf

连接openvpn并且放在后台:openvpn --config /jffs/openvpn/openvpn.conf --daemon

结束所有openvpn进程:killall openvpn

显示当前运行的所有进程:ps

查看当前autoddvpn的log:tail -f /tmp/autoddvpn.log

守护脚本

OpenVPN再稳定都有意外挂掉的情况。这种时候我们就需要通过系统的cron来设置每隔2分钟,就运行一个脚本检查一次OpenVPN进程当前是否在运行,不在的话就再运行一个OpenVPN。

脚本文件内容如下:

#!/bin/sh ISRUN=`ps|grep "openvpn"|wc -l` if [[ $ISRUN -lt 4 ]] then echo "Not running, start!" openvpn --config /jffs/openvpn/openvpn.conf --daemon else echo "Openvpn is already running." exit fi

假定保存到/jffs/openvpn/openvpnDaemon.sh位置,那么我们就在dd-wrt的web界面的“管理”->“管理”下启用Cron,并且在附加任务中输入:

*/2 * * * * /jffs/openvpn/openvpnDaemon.sh

于是就大功告成。

注意,如果你不是保存在/jffs/openvpn/openvpnDaemon.sh位置,那么相应的,要在上面的脚本文件内容中,把 -lt 后面的数字进行修改,这取决于你最后保存的位置的字符串中有几个“openvpn”。如果有n个,那么那个数字就改称n+2。

好了。写完了。有什么问题尽管提。

 

© Sid 晓 for Life Journal, 2012. | 文章原始地址

发表评论