我正在使用openvpn和ics(android 4.x)附带的新vpnservice api。
是否有方法定义从VPN隧道中排除IP地址?(这样,目的地为该ip的通信将直接路由到网络,而不通过vpn隧道)。
我们正在努力降低vpn的网络负载和成本,允许像youtube这样的带宽密集型服务不加密地通过,同时仍然保护其余的流量。
据我所知,在android打开tun设备之前,它可以接收一个路由列表,该列表指定哪些流量应该通过vpn,而不是排除哪些流量:
VPNSerivice.Builder API documentation
最佳答案
我需要从VPN中排除本地WiFi子网。我使用的方法是添加多个路由,而不是0.0.0.0/0。例如,如果需要排除子网192.168.240.90/21(二进制表示法为11000000.10101000.11110000.01011010),则应向vpnservice添加以下21条路由(二进制表示法):
00000000.00000000.00000000.00000000 / 1
10000000.00000000.00000000.00000000 / 2
11100000.00000000.00000000.00000000 / 3
11010000.00000000.00000000.00000000 / 4
11001000.00000000.00000000.00000000 / 5
11000100.00000000.00000000.00000000 / 6
11000010.00000000.00000000.00000000 / 7
11000001.00000000.00000000.00000000 / 8
11000000.00000000.00000000.00000000 / 9
11000000.11000000.00000000.00000000 / 10
11000000.10000000.00000000.00000000 / 11
11000000.10110000.00000000.00000000 / 12
11000000.10100000.00000000.00000000 / 13
11000000.10101100.00000000.00000000 / 14
11000000.10101010.00000000.00000000 / 15
11000000.10101001.00000000.00000000 / 16
11000000.10101000.00000000.00000000 / 17
11000000.10101000.10000000.00000000 / 18
11000000.10101000.11000000.00000000 / 19
11000000.10101000.11100000.00000000 / 20
11000000.10101000.11111000.00000000 / 21
其思想是在前缀位置(从右边)反转位,并使前缀位置后的所有位为零。因此,除了那些到本地子网的包之外,所有包都将匹配一个或另一个路由