主页 > 路由器 > openwrt配置chnroutes路由对国内外流量分流

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

  1. 黑软 回复
    2021年1月21日 于 下午12:50

    我的openwrt没有ip-down.d和ip-up.d这两个目录,我直接创建应该可以使用吧

  2. xlousp 回复
    2022年1月29日 于 下午10:59

    我可以转载你的文章吗?

发表评论

新用户的评论需审核后才会显示;

电子邮件地址不会被公开;
必填项已用*标注