openwrt配置chnroutes路由对国内外流量分流
Openwrt配置PPTP连接VPN server,一般以VPN server作为网关,所有流量经过VPN,会增加服务器负担,另外绕一圈回来访问国内网站速度也会变慢,因此需要对国内和国外流量进行分流,国内流量走本地的PPPOE拨号网关,国外流量走VPN 网关。
chnroutes 路由表可以实现此需求:
项目地址:https://github.com/fivesheep/chnroutes
原理:
此网址http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest包含了所有分配到各个国家的 IP 段,每天自动更新,chnroutes 路由表根据此数据进行分析,将国内网段提取出来,可使得在访问国内地址时不经过 VPN。
CN表示国内网段,如下图1.0.1.0、1.0.2.0等都属于中国网段,256/512表示掩码位数:
根据此表,可以将CN网段的走本地的PPPOE拨号网关,其他网段缺省走VPN 网关。
chnroutes的应用:
- 下载 chnroutes.py
- 从终端进入下载目录, 执行python chnroutes.py -p linux, 执行完毕之后同一目录下将生成两个新文件'ip-pre-up'和'ip-down'.
- 把ip-pre-up拷贝到/etc/ppp/ip-up.d目录,ip-down拷贝到/etc/ppp/ip-down.d目录.
由于原版的chnroutes 要用python生产,我用了一个简单现成的:
12
下载如下文件进行操作:
12
解压后主要修改routes-up.sh文件,原始文件很简单,先取网关地址,然后将国内网段指向网关:
#!/bin/sh
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
gateway=$(ip route show 0/0 | grep via | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
ip -batch - <<EOF
route add 1.0.1.0/24 via $gateway
route add 1.0.2.0/23 via $gateway
...
这个脚本用在Openvpn没有问题,但是用在PPTP就问题来了:
一般此脚本放在/etc/ppp/ip-up时进行调用,当PPPOE拨号完成时增加国内路由,其他缺省路由指向VPN(如Openvpn)网关,这样如果用Openvpn两者没有冲突,但是如果是PPTP就有问题,因为PPTP也需要调用PPP模块,当PPPTP拨号成功后也会调用/etc/ppp/ip-up,这样有可能会将国内路由指向VPN网关,造成混乱。另外还发现,当PPPOE断线重连时,缺省网关有时会变成PPPOE网关而不是VPN网关,造成无法访问国外网站。
根据上面的问题,对routes-up.sh进行了修改,首先检查网关是否正确,如果存在VPN网关,则强制使用VPN网关作为缺省网关;其次只对PPPOE接口上的网关增加国内路由,并且增加重复检查,避免重复添加路由:
#!/bin/sh
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
#调试信息,时间记录
CURTIME=`date '+%Y-%m-%d %H:%M:%S'`
#当前缺省网关
gateway=`ip route show | grep '^default' | sed -e 's/default via \([^ ]*\).*/\1/'`
echo ${CURTIME}_GW_$gateway >> /tmp/myvpn_oldgw
#172.16.36.1为VPN网关,如当前网关不是VPN网关,则检查PPTP拨号是否成功,如果成功则修改为缺省网关
if [ "$gateway" != "172.16.36.1" ]; then
pptpip=`ifconfig pptp-vpn |grep 'inet add'|awk -F ":" '{print $2}'|awk '{print $1}'`
echo ${CURTIME}_pptpip_$pptpip>> /tmp/myvpn_oldgw
mycount=`echo $pptpip|grep '172.'|wc -l`
if [ $mycount -gt 0 ];then
route delete default
route add default gw 172.16.36.1
echo ${CURTIME}_ChangGW_$mycount>> /tmp/myvpn_oldgw
fi
fi
#检查PPPOE拨号是否成功
pppoeip=`ifconfig pppoe-wan |grep 'inet add'|awk -F ":" '{print $2}'|awk '{print $1}'`
echo ${CURTIME}_pppoeip_$pppoeip >> /tmp/myvpn_oldgw
if [ -z "$pppoeip" ]; then
exit 0
fi
#路由重复性检查
routeflag=`route -n | head -n 10|grep '1.0.1.0'|wc -l`
if [ $routeflag -gt 0 ];then
exit 0
fi
#添加国内网段到PPPOE网关
echo ${CURTIME}_ADDROUT_$pppoeip >> /tmp/myvpn_oldgw
ip -batch - <<EOF
route add 1.0.1.0/24 via $pppoeip
route add 1.0.2.0/23 via $pppoeip
...
修改完成后将文件放在/etc/ppp/ip-up.d目录,修改文件为可执行即可。
提醒:openwrt需要安装ip模块(支持ip命令)
评论:2