这是一个内部 Android 问题。
我想清楚地了解当使用“builder.addallowedapplication()
”方法建立仅允许特定应用程序通过的 vpn 隧道时会发生什么。
这类似于您通过 openvpn
选择要处理的应用程序的方式。
它如何对 tun0
说这些应该通过你?它改变了什么样的规则或者它在这个过程中进行了什么样的函数调用或api调用。
请在这里帮助我。
谢谢
最佳答案
这是基于策略路由。 Linux 内核可以使用多个路由表和规则,这些规则定义特定路由表用于哪些流量。您可以使用 ip rule
查看这些规则如果iproute2
在您的系统上可用。特定表中的路由可以用ip route list table <nr/name>
列出(使用 all
作为名称以查看所有表中的路由)。
规则可以匹配与网络数据包相关的不同属性(或它们的组合),例如IP 地址、入/出接口(interface)、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(在 0-99999 范围内)的流量(之前看到的三个除外)都被定向到 TUN 设备的路由表。
关于android - Android 如何知道它必须将允许的 vpn 应用程序定向到 tun0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54954779/