首先,我喜欢自己来搭建环境,还是那句话,路由器自己来配置才安心。

原版的Padvan内置VPN客户端连接后是全局流量走VPN,这样不符合我们国情。
此教程为了让国内流量继续走国内的网络,只有访问国外流量时才走VPN

实现的原理是用路由chnroutes,默认所有流量都走VPN,然后分流出国内流量走宽带的网关。

实现的最终结果是:
访问外网,第一跳到路由器网关192.168.2.1,第二跳到VPN的网关172.16.20.1,然后走VPN出去。
访问国内,第一跳到路由器网关192.168.2.1,第二跳到宽带的网关221.221.208.1,然后走正常程序。

如果有DNS污染,请参考斐讯K2,原版Padvan使用dnsmasq避免DNS污染,加速内外网访问

注意,如果有人开启了路由器本身的VPN Server,比如想免流,需要给VPN Server里面选择到Allow VPN Clients Access to: Internet或者是Lan & Internet

所需软件
» 装了Padavan的路由器一个 ( 路由器 )
» chnroutes ( 分流用路由数据库 )

总体大致分为5个步骤
» 配置VPN
» 生成chnroutes
» 配置chnroutes
» 保存
» 测试

» 配置VPN
这个不用多说吧,我用的PPTP连的我的国外VPN,这个看大家的情况,注意最后红圈的几项。

» 生成chnroutes
chnroutes的源码在链接
有兴趣的可以自己下载然后生成ip-pre-upip-down两个文件。这两个文件是根据http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest数据库的信息生成的。命令是python chnroutes.py -p linux,需要安装python。
附件里有我生成好的文件,使用数据库是2016年9月19日的。

chnroutes

» 配置chnroutes
步骤 1 » 查找VPN网关
首先,用路由器连上VPN,然后电脑连接路由器,确保可以访问google。
然后,用tracert(win10)或者traceroute(linux)命令看看VPN网关地址。
如图,第二跳即VPN网关地址,我的是172.16.20.1。
在CMD下运行tracert www.google.com

步骤 2 » 配置ip-pre-up文件
这个是为了防止重复运行,将图中的172.16.20.1替换成刚得到的VPN网关。(如果是 $OLDGW == ‘ ‘ ,直接在单引号里添加VPN网关即可。)
if [ $OLDGW == ‘172.16.20.1’ ]; then
exit 0

步骤 3 » 用WinSCP将ip-pre-up和ip-down上传到路由器
上传路径随意,我上传到了/etc/storage
然后给这两个文件赋权,要有运行的权利,我懒省事,直接写了777的权限,即rwxrwxrwx,如图。

步骤 4 » 测试chnroutes
连接SSH,先输入命令,得到下图的结果,此时路由表只有必要的路由信息。
route -n | head -n 10

然后,测试添加路由,输入命令,等大概半分钟运行完,再执行上一个命令,此时路由表已经加入了分流信息。
sh /etc/storage/ip-pre-up
route -n | head -n 10

最后,测试删除路由,输入命令,等大概半分钟运行完,再执行上一个命令,此时路由表已经恢复为初始状态。
sh /etc/storage/ip-down
route -n | head -n 10

步骤 5 » 配置chnroutes到路由器
如图,在func_ipup和func_ipdown里分别添加两个命令。
sh /etc/storage/ip-pre-up
sh /etc/storage/ip-down

» 保存
SSH下
mtd_storage.sh save
nvram commit

» 测试
两种方法,
第一种,SSH下,在打开VPN之前,打开VPN之后和关闭VPN以后,分别用下面的命令看看路由表是不是变了。
route -n | head -n 10

第二种,打开VPN,用tracert或者traceroute命令看看baidu.com和google.com的第二跳是不是分别对应着宽带网关和VPN网关。
如果都走的VPN网关,先清除一下ARP缓存,arp -d