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

How does Android know that it has to direct allowed vpn application to tun0

这是一个内部 Android 问题。

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

这类似于您 select 应用通过 openvpn 处理的方式。

它是怎么告诉 tun0 这些应该通过你的?它改变了什么样的规则或者它在这个过程中调用了什么样的函数或api调用。

请在这里帮助我。

谢谢

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

规则可以匹配与网络数据包(或它们的组合)关联的不同属性,例如IP 地址、in-/outbound 接口、Netfilter 标记或进程的 UID。后者特别用于 exclude/include 特定应用程序。每个应用程序都是 运行 由具有自己的 UID 的唯一用户创建的。这允许控制特定应用程序是否使用路由 table 将流量定向到 TUN 设备。

例如,为三个应用专门使用 VPN 会添加具有这些选择器的规则:

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

路由 table 1049(这会随着每个新的 VPN 实例而变化)包含将流量定向到 TUN 设备的路由。

另一方面,如果相同的三个应用程序被排除在 VPN 之外,则选择器是:

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

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