Android如何知道它必须将允许的VPN应用程序定向到tun0

时间:2019-03-02 02:51:29

标签: android vpn openvpn android-vpn-service

这是Android内部的问题。

我想清楚地了解使用“ builder.addallowedapplication()”方法仅通过允许特定应用程序通过其建立vpn隧道时的情况。

这类似于您选择要通过openvpn处理的应用程序的方式。

它对tun0说这些应该经过您如何?它会更改哪种规则,或者在过程中进行哪种函数调用或api调用。

请在这里帮助我。

谢谢

1 个答案:

答案 0 :(得分:2)

这基于策略路由。 Linux内核可以使用多个路由表和规则,这些规则和规则定义特定路由表用于哪些流量。如果您的系统上有ip rule,则可以使用iproute2查看这些规则。可以使用ip route list table <nr/name>列出特定表中的路由(使用all作为名称来查看所有表中的路由)。

规则可以匹配与网络数据包相关联的不同属性(或它们的组合),例如IP地址,入/出接口,Netfilter标记或进程的UID。后者尤其用于排除/包括特定的应用。每个应用程序均由具有自己UID的唯一用户运行。这样可以控制特定的应用程序是否使用将流量引导到TUN设备的路由表。

例如,仅将VPN用于三个应用程序会使用以下选择器添加规则:

... uidrange 10010-10010 lookup 1049 
... uidrange 10062-10062 lookup 1049 
... uidrange 10094-10094 lookup 1049 

路由表1049(此变化针对每个新的VPN实例)包含将流量定向到TUN设备的路由。

另一方面,如果从VPN中排除了相同的三个应用,则选择器为:

... uidrange 0-10009 ...
... uidrange 10011-10061 ...
... uidrange 10063-10093 ...
... uidrange 10095-99999 ...

如您所见,除先前看到的三个UID外,所有UID(在0-99999范围内)的流量都被定向到TUN设备的路由表。