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

标签 android vpn openvpn android-vpn-service

这是一个内部 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/

相关文章:

java - 将搜索功能附加到按钮(Android)

ubuntu - 仅限特定网站上的 VPN

android - 如何使用 ProGuard 将所有方法保留在一个类中

java - Android 无法访问更改系统设置权限

java - 通过括号转换为字符串会导致 Android 崩溃

macos - Zerotier - MacOS 上的 PORT_ERROR

iphone - 有没有办法在 iOS 中以编程方式打开和关闭 VPN

android - 在 Android 上获取 VPN 连接状态

docker - 如何使 openvpn 与 docker 一起工作

docker - 带有 OpenVPN/privateinternetaccess.com 端口转发的 Docker 容器内的传输守护进程