本项目记录了我在自己家里的路由器上设置科学上网的全过程,供有类似需求的朋友参考。与之前用了两年的autoddvpn gracemode + OpenVPN方案相比,速度、稳定性都有所提升,而且避免了gracemode要经常添加维护被墙IP的麻烦(之前也做了个脚本自动检测添加路由和dnsmasq,但还是麻烦啊)。
本项目基于以下配置:
- 路由器:华硕RT-N16,一款性价比较高的路由器,配置不错,特别是拥有32MB Flash,所以也是很多固件开发者的开发用机,可用的ROM非常多
- 固件:Tomato by Shibby,目前使用的版本是K26USB-1.28.RT-N5x-MIPSR2-095-AIO
- VPN:IGVPN的Pro Bundle,45GB/月3台并发,支持几乎现在流行的所有设备的所有接入方式,服务器多、速度快、文档详尽,一年360元算是物有所值了。我是用的是香港的Cisco IPSec服务器。
- 宽带:我家用的是长城宽带……
##参考文档
- [BLT]FQX的Blog,本项目赤裸裸抄袭了这篇文章和其中的代码
- IGVPN的配置文档
- @Paveo的blog,作为一个Falcop用户,虽然买不起VIG,但是向你致敬
- jimmyxu的chnroutes项目
##本项目实现了
- 开机自动连接Cisco IPSec服务器,效率比常见的OpenVPN确实高很多
- 使用@Paveo修改后的vpncwatch,每30秒ping一次twitter.com,3次失败后自动重新连接vpnc
- 抄袭[BLT]FQX的Blog中的双路由表设置,家里的下载专用机(192.168.1.33)不走VPN(避免耗费VPN流量和带来封账号风险)
- 使用jimmyxu的chnroutes项目中的iproute2方案设置所有国内ip不走VPN,几秒搞定几千条
- 为提高性能,缺省使用OpenDNS解析,国内大站使用114.114.114.114解析,apple.com使用中华电信DNS解析
##通过ssh访问路由器 在Terminal中:
ssh-keygen
cat ~/.ssh/id_rsa.public
将id_rsa.public中的内容拷贝到路由器访问管理界面的Authorized Keys中,之后在Terminal中:
就可以登陆路由器了。或者直接通过Telnet访问也可以。
##通过ssh登陆,安装opkg
mkdir /jffs/opt
mount -o bind /jffs/opt /opt
将这上面这一行mount -o bind /jffs/opt /opt
加到路由器JFFS管理界面的Execute When Mounted中,这样路由器每次mount jffs的时候都会自动加载*/opt*
cd /opt
wget http://wl500g-repo.googlecode.com/svn/ipkg/entware_install.sh
chmod +x ./entware_install.sh
./entware_install.sh
##安装并生成chnroutes脚本 如果路由器的Flash空间不够,可以跳过本步,直接下载本项目中的vpn-up.sh,放到 /opt/etc/vpnc/chnroutes/ 目录下。不过如果空间允许,还是建议安装,便于以后升级更新。
opkg install git
opkg install python
mkdir /jffs/vpnc
cd /jffs/vpnc
git clone https://github.com/jimmyxu/chnroutes.git
cd /jffs/vpnc/chnroutes
./update.sh
chnroutes目录中的chnroutes.py来自jimmyxu的chnroutes项目,update.sh的作用是调用chnroutes.py生成vpn-up.sh并将vpn-up.sh中的#!bash
改为#!sh
,这样就可以直接运行了;另外将vpn-up.sh中获取直连网关的代码改为:OLDGW=$(nvram get wan_gateway_get)
,我觉得这样更直接一些。
##安装VPNC 首先安装vpnc。用ipkg安装似乎存在依赖的问题,另外ipkg里面的vpnc版本要比opkg的老一个revision,所以用opkg安装:
opkg install vpnc
但是通过opkg安装vpnc有个问题,就是没有vpnc-script。可以下载本项目中的vpnc-script(从nslu2的ipkg源里面vpnc_0.5.3-1_mipsel.ipk中提取的),将文件中所有的/etc/resolv.conf
全部替换成/tmp/resolv.conf.auto
,之后放到 /opt/etc/vpnc/ 目录下。请注意为vpnc-script加上可执行权限:
chmod a+x vpnc-script
另外,在@Paveo的blog中下载修改过的vpncwatch,放到 /opt/sbin/ 目录下(也需要可执行权限)。由于@Paveo没有给出修改后的源代码,所以项目中就不提供直接下载了。对于有其他考虑的读者,可以使用原始开源版本的vpncwatch。
##配置IPSec VPN账号 修改/opt/etc/vpnc/default.conf,或新建一个.conf,内容如下:
IPSec gateway 服务器地址
IPSec ID 服务商提供的组ID
IPSec secret 服务商提供的组密码
Xauth username 你的用户名
Xauth password 你的密码
##最后的准备 下载本项目中的vpnup.sh和rt_tables,放到 /jffs/vpnc/ 目录下。 在路由器脚本管理界面的WAN Up中加入
/jffs/vpnc/vpnup.sh;
告诉路由器在外网链接建立后运行我们vpn脚本。 虽然并不必要,但是现在重启路由器吧!享受大功告成的感觉!
##附:dnsmasq的设置 设置dnsmasq主要目的是提高访问性能,缺省使用OpenDNS解析(我的VPN下Google DNS ping值过高),对于国内大站通过114DNS解析,apple相关域名通过中华电信DNS解析。另外我发现我家api.twitter.com被污染的机率很大,不知道如何处理,所以在dnsmasq中明确指向OpenDNS解析,不过应该没有什么实际意义……还望有经验的朋友赐教。
具体设置很简单:将本项目中的dnsmasq中的内容粘贴到路由器DHCP/DNS管理界面里面Dnsmasq Custom configuration中,勾选Use internal DNS和Prevent DNS-rebind attacks,保存设置即可。