Android上的一些VPN(比如DroidVPN)使用tun内核模块实现流量转发进而实现VPN,优点是比系统的VPN省电不少,缺点是必须要以root权限运行。
VPN默认是全局代理,当我们只需要对某几个ip做转发或者对几个ip不做转发时就需要修改内核路由表。
白名单
即只对某些ip做转发
以下是一个示例设置对8.0.0.0~8.255.255.255的ip走vpn通道(开启vpn后运行):
1 2 3 4 5 6 7 8 |
ROUTE='busybox route' #得到tun0网关 gw=`$ROUTE -n|busybox grep -m 1 -E "172\.22\.[^\. ]+" -o` #删除原有规则 $ROUTE del -net 0.0.0.0 netmask 128.0.0.0 gw $gw.1 dev tun0 $ROUTE del -net 128.0.0.0 netmask 128.0.0.0 gw $gw.1 dev tun0 #白名单规则 $ROUTE add -net 8.0.0.0 netmask 255.0.0.0 gw $gw.1 dev tun0 |
关闭VPN后运行:
1 2 3 |
ROUTE='busybox route' gw=`$ROUTE -n|busybox grep -m 1 -E "172\.22\.[^\. ]+" -o` $ROUTE del -net 8.0.0.0 netmask 255.0.0.0 gw $gw.1 dev tun0 |
黑名单
即对这些ip不做转发
黑名单和chnroutes实现思路基本类似,示例添加了一个规则,使1.0.1.0~1.0.1.255的ip不走vpn(随便什么时候运行):
1 2 3 4 5 6 |
ROUTE='busybox route' oldgw=busybox netstat -rn | busybox grep ^0\.0\.0\.0 | busybox awk '{print $2}' #上句也可用 #oldgw=$ROUTE -n | busybox grep ^0\.0\.0\.0 | busybox awk '{print $2}' #黑名单规则 $ROUTE add -net 1.0.1.0 netmask 255.255.255.0 gw $oldgw |
不需要这些规则时,运行(也可不运行,重启消失):
1 2 |
ROUTE='busybox route' $ROUTE add -net 1.0.1.0 netmask 255.255.255.0 |
需要注意的是,白名单规则在关闭vpn后需运行相应的route del以删除转发规则,否则将无法连接
黑名单规则不删除也没关系
以上所有规则重启后自动丢失