小米路由器配置VPN实现科学上网

目标:

  • 路由器对应局域网中所有设备可以翻墙
  • 对国内网站使用直连,对被屏蔽的部分国外网站使用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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *