转:小米路由 vpn加chnroutes 实现

原文地址:http://www.wy182000.com/2014/11/16/%e5%b0%8f%e7%b1%b3%e8%b7%af%e7%94%b1-vpn%e5%8a%a0chnroutes-%e5%ae%9e%e7%8e%b0/

刚刚过去的双11买了一个小米路由,既然是openwrt的内核自然就想实现一些高级功能,先破解ssh,再修改opkg源地址,都很简单,想改的 同学可以上网去找一下,但是实现vpn加chnroutes到是费了一番周折,网上能找到一些文章但是都不能用,没办法只能自己看代码了。

vim /etc/hotplug.d/iface/70-vpn看了下vpn规则
[ “$ACTION” = “ifup” ] && [ “$INTERFACE” = “vpn” ] && {
ip route add to 0/0 dev $DEVICE table vpn
if [ -f /etc/ppp/vpnup.sh ]; then
. /etc/ppp/vpnup.sh
fi
. /lib/functions/network.sh
network_get_subnet subnet lan
ip rule add from $(fix_subnet $subnet) table vpn
….
}
这个是vpn启动时要调用的脚本,括号内容中的第一行就是把vpn的default路由加入路由表vpn中,这就是为什么下载的chnroutes不能用的主要原因。

开启vpn前,可以执行
ip rule list
看一下路由表的list,只有3个
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
分别对应着/etc/iproute2/rt_tables里的
255 local
254 main
253 default
但是小米路由开启vpn后会增加新的路由表
252 vpn
这个优先级要大于上面的3张表,所以chnroutes默认加入defautl的路由自然不能使用了,解决办法很简单,就是把规则加到路由表vpn就可以了。

这需要下面一系列修改
OLDGW=`ip route show | grep ‘^default’ | sed -e ‘s/default via \([^ ]*\).*/\1/’`要换成
OLDGW=‘192.168.1.1’路由的实际网关,因为不知道什么原因小米路由有两个default路径,所以用上面的命令会取出来两个连着的地址,肯定是不能用的。
DEVICE=’eth0.2’实际需要使用的接口名,可以route看一下默认的defaut的Iface接口名
然后把原始的命令
route add -net 1.0.1.0 netmask 255.255.255.0 gw $OLDGW
改为
ip route add to 1.0.1.0/24 via $OLDGW dev $DEVICE table vpn
如果会使用vim的话换一下并不难,后面一个0是/24两个/16三个/8,虽然有4000多行。
ip route list 看一下默认路由表,把本地连接的路由也加进去,我的是
ip route add to 192.168.1.0/24 dev eth0.2 table vpn
ip route add to 192.168.19.0/24 dev br-guest table vpn

命令上面的两个操作$OLDGW的地方都可以删掉了,因为用法和以前不一样了,vpn关闭时/etc/hotplug.d/iface/70-vpn会调用
[ “$ACTION” = “ifdown” ] && [ “$INTERFACE” = “vpn” ] && {
if [ -f /etc/ppp/vpndown.sh ]; then
. /etc/ppp/vpndown.sh
fi
if [ -f /etc/init.d/smartvpn ]; then
/etc/init.d/smartvpn stop
fi
ip rule del table vpn
while [[ $? == 0 ]]; do
ip rule del table vpn
done
}
会把路由表vpn从规则中删除,所以vpndown.sh其实也并不需要调用了。
可以把修改的chnroutes脚本ip-pre-up重命名为/etc/ppp/vpnup.sh,并加上执行权限
chmod a+x /etc/ppp/vpnup.sh
因为最上面的脚本里已经写了,vpn启动时会调用/etc/ppp/vpnup.sh,所以vpn启动时中国的路由就加到vpn路由表里了,
执行
ip route list table vpn
可以看一下规则是不是已经加入路由表vpn里面了。

如果想要删除路由表vpn里的内容的话可以使用命令
ip route del 1.0.1.0/24 via $OLDGW dev $DEVICE table vpn
把删除命令加到/etc/ppp/vpndown.sh中
到此就大功告成了,访问下ip.cn和formyip.com看一下是不是不同的ip,如果是的话就说明已经成功了。
对了,如果开启小米路由上的vpn总是出现{code:0},说明你用的是ie,换成chrome内核浏览器就可以了。
配置都已经好了,但是ping百度的地址的时候ping值在100以上,不用vpn的时候只有10几不知道什么原因。(后来发现是地址不在列表中,这个没有办法解决,如果是常用的地址,只能是自己放到列表中去,没有其他办法)

后面是修改过的vpnup.sh和vpndown.sh脚本

  vpn.zip (34.6 KiB, 430 hits)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注