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以刪除轉發規則,否則將無法連接
黑名單規則不刪除也沒關係
以上所有規則重啟後自動丟失