目标:
- 路由器对应局域网中所有设备可以翻墙
- 对国内网站使用直连,对被屏蔽的部分国外网站使用VPN连接
小米论坛中有一篇VPN科学上网的文章,亲测,对最新版本(0.7.63)的小米路由器mini无效,经过一番摸索,弄清楚了路由器中路由表的基本原理后,重写了脚本,共享之。
一、路由器开启SSH功能, https://d.miwifi.com/rom/ssh
二、登录路由器,在连接VPN之前,我们看看路由表的基本设置。执行命名ip rule list
,可以看到,路由器含有3个路由表:
root@XiaoQiang:~# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
其中,local配置了一些本地路由,default是空的,我们平常执行route add
或者route del
,默认都是对main路由表进行操作。
ip route list
ip route list table main
两句命名是一样的效果,可以查看main路由表中的内容:
root@XiaoQiang:~# ip route list
121.35.148.1 dev pppoe-wan proto kernel scope link src 121.35.148.36
192.168.31.0/24 dev br-lan proto kernel scope link src 192.168.31.1
default via 121.35.148.1 dev pppoe-wan proto static
default via 121.35.148.1 dev pppoe-wan metric 50
可以看到,默认路由是把所有流量都经过设备pppoe-wan出去的,通过拨号上网的一般都是使用pppoe协议。
三、连接VPN,看看路由设置有什么变化。执行命名ip rule list
,可以看到路由规则多了好多条:
root@XiaoQiang:/etc/ppp# ip rule list
0: from all lookup local
32759: from all to 202.96.128.86 lookup vpn
32760: from all to 202.96.134.33 lookup vpn
32761: from all to 8.8.4.4 lookup vpn
32762: from all to 8.8.8.8 lookup vpn
32763: from all to 8.8.4.4 lookup vpn
32764: from all to 8.8.8.8 lookup vpn
32765: from 192.168.31.0/24 lookup vpn
32766: from all lookup main
32767: from all lookup default
其中,优先级为32765的规则,意思是,来自局域网中的所有流量,都查找vpn路由表,这条规则的优先级高于查找main的规则。
再看看这个vpn路由表中是啥东西,执行ip route list table vpn
:
root@XiaoQiang:/etc/ppp# ip route list table vpn
192.168.31.0/24 dev br-lan scope link
default dev pptp-vpn scope link
可以看到,vpn路由表中有一条默认路由,会把所有流量都通过VPN发送。
四、智能翻墙。要实现智能翻墙,首先需要去除默认的路由,所有的流量都不走VPN,然后再根据需要,让部分目的地ip的流量走VPN。执行如下命名删除所有 lookup vpn 的规则
vpn_rule_ids=`ip rule list | grep 'lookup vpn' | sed 's/://g' | awk '{print $1}'`
for rule_id in $vpn_rule_ids
do
ip ru del prio $rule_id
done
根据自己的需要,手动添加需要走VPN的ip段:
# Google DNS and OpenDNS
route add -host 8.8.8.8 dev pptp-vpn
route add -host 8.8.4.4 dev pptp-vpn
route add -host 208.67.222.222 dev pptp-vpn
route add -host 208.67.220.220 dev pptp-vpn
# www.dropbox.com
route add -net 199.47.217.0/24 dev pptp-vpn
# www.facebook.com
route add -net 69.171.228.0/24 dev pptp-vpn
route add -net 173.252.0.0/16 dev pptp-vpn
route add -net 184.51.198.0/24 dev pptp-vpn
route add -net 31.13.0.0/16 dev pptp-vpn
route add -net 72.246.189.0/24 dev pptp-vpn
route add -net 69.192.4.0/24 dev pptp-vpn
# for Google
route add -net 74.125.0.0/16 dev pptp-vpn
route add -net 173.194.0.0/16 dev pptp-vpn
route add -net 59.24.3.0/24 dev pptp-vpn
route add -net 198.144.96.0/24 dev pptp-vpn
route add -net 216.58.192.0/24 dev pptp-vpn
至此,路由器就实现了智能翻墙的了。
五、重启自动设置设置科学上网。建立文件/etc/ppp/vpn-init.sh
,写入如下内容:
sleep 15
vpn_rule_ids=`ip rule list | grep 'lookup vpn' | sed 's/://g' | awk '{print $1}'`
for rule_id in $vpn_rule_ids
do
ip ru del prio $rule_id
done
# Google DNS and OpenDNS
route add -host 8.8.8.8 dev pptp-vpn
route add -host 8.8.4.4 dev pptp-vpn
route add -host 208.67.222.222 dev pptp-vpn
route add -host 208.67.220.220 dev pptp-vpn
# www.dropbox.com
route add -net 199.47.217.0/24 dev pptp-vpn
# www.facebook.com
route add -net 69.171.228.0/24 dev pptp-vpn
route add -net 173.252.0.0/16 dev pptp-vpn
route add -net 184.51.198.0/24 dev pptp-vpn
route add -net 31.13.0.0/16 dev pptp-vpn
route add -net 72.246.189.0/24 dev pptp-vpn
route add -net 69.192.4.0/24 dev pptp-vpn
# for Google
route add -net 74.125.0.0/16 dev pptp-vpn
route add -net 173.194.0.0/16 dev pptp-vpn
route add -net 59.24.3.0/24 dev pptp-vpn
route add -net 198.144.96.0/24 dev pptp-vpn
route add -net 64.233.189.0/24 dev pptp-vpn
route add -net 216.58.128.0/17 dev pptp-vpn
建立/etc/ppp/vpnup.sh
写入如下内容:
/etc/ppp/vpn-init.sh &
连接VPN后会自动执行/etc/ppp/vpnup.sh
这个脚本 。
六、DNS解释防止污染。修改/etc/hosts
,写入一些容易被解释污染域名,例如:
216.58.196.35 www.google.com
216.58.196.35 www.google.com.hk
#更多请自行添加
添加后重启 DNS 服务:
/etc/init.d/dnsmasq restart
来自http://segmentfault.com/a/1190000002494059