eBPF 网络流量工具结合使用内核与用户空间实现来监控设备自上次启动以来的网络使用情况 。它提供了额外的功能(如套接字标记、分离前台/后台流量,以及按 UID 划分的防火墙),以根据手机状态阻止应用访问网络 。从该工具收集的统计数据存储在称为 eBPF maps
的内核数据结构中,并且相应结果由NetworkStatsService
等服务用来提供自设备上次启动以来的持久流量统计数据 。
示例和来源用户空间更改主要在 system/netd
和framework/base
项目中 。开发工作在 AOSP 中完成,因此 AOSP 代码将始终保持最新状态 。源代码主要位于
system/netd/server/TrafficController*
、system/netd/bpfloader
和system/netd/libbpf/
中 。此外,一些必要的框架变更也在framework/base/
和system/core
中 。
实现从 Android 9 开始,内核版本为 4.9 或更高且最初搭载了 Android P 版本的 Android 设备必须使用基于 eBPF 的网络流量监控记帐模块,而不是 xt_qtaguid
。新的基础架构更灵活且更易于维护,并且不需要任何外部内核代码 。
旧版流量监控和 eBPF 流量监控之间的主要设计差异如图 1 所示 。
文章插图
图 1.旧版流量监控(左)和 eBPF 流量监控(右)的设计差异
新的
trafficController
设计基于cgroup
级的 eBPF 过滤器以及内核中的xt_bpf
netfilter 模块 。这些 eBPF 过滤器在收发数据包时应用,数据包需要通过这些过滤器 。cgroup
eBPF 过滤器位于传输层,负责根据套接字 UID 以及用户空间设置对正确的 UID 计算流量 。xt_bpf
netfilter 挂接在bw_raw_PREROUTING
和bw_mangle_POSTROUTING
链上,负责对正确的接口计算流量 。【Android中的 eBPF 流量监控】在启动时,用户空间进程
trafficController
会创建用于收集数据的 eBPF 映射,并将所有映射作为虚拟文件固定在sys/fs/bpf
。然后,特权进程bpfloader
将预编译的 eBPF 程序加载到内核中,并将其附加到正确的cgroup
。所有流量都对应于同一个根cgroup
,因此默认情况下,所有进程都应包含在该cgroup
中 。在运行时,
trafficController
可以通过将数据写入traffic_cookie_tag_map
和traffic_uid_counterSet_map
来标记/取消标记套接字 。NetworkStatsService
可以从traffic_tag_stats_map
、traffic_uid_stats_map
和traffic_iface_stats_map
中读取流量统计数据 。除了流量统计数据收集功能之外,trafficController
和cgroup
eBPF 过滤器还负责根据手机设置屏蔽来自某些 UID 的流量 。基于 UID 的网络流量屏蔽功能取代了内核中的xt_owner
模块,并且可以通过将数据写入traffic_powersave_uid_map
、traffic_standby_uid_map
和traffic_dozable_uid_map
来配置详细模式 。新实现遵循旧版
xt_qtaguid
模块实现,因此TrafficController
和NetworkStatsService
将使用旧版实现或新实现运行 。如果应用使用公共 API,那么无论在后台使用xt_qtaguid
还是 eBPF 工具,应该没有任何区别 。如果设备内核基于 Android 通用内核 4.9(
SHA39c856663dcc81739e52b02b77d6af259eb838f6 或更高版本),则无需修改 HAL、驱动程序或内核代码,即可实现新的 eBPF 工具 。
要求
- 内核配置必须开启以下配置:
验证是否已开启正确配置时,VTS 内核配置测试非常有用 。
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NETFILTER_XT_MATCH_BPF=y
CONFIG_INET_UDP_DIAG=y
- 设备
MEM_LOCK
资源限制必须设为 8 MB 或更多 。
旧版 xt_qtaguid 弃用过程新的 eBPF 工具正在逐步取代
xt_qtaguid
模块以及它所基于的xt_owner
模块 。我们将开始从 Android 内核中移除xt_qtaguid
模块,并停用不必要的配置 。在 Android 9 版本中,
xt_qtaguid
模块在所有设备上都处于开启状态,但直接读取xt_qtaguid
模块 proc 文件的所有公共 API 都移到了NetworkManagement
服务中 。根据设备内核版本和初始 API 级别,
推荐阅读
- Linux 中的 TTY 是什么
- Java中的BigDecimal,你真的会用吗?最强指南
- 顶谷大方茶的制作工艺,大方茶中的上品顶谷大方茶
- 茶中的美与禅,以茶会友
- Android Studio编译jar包
- 内网渗透神器Cobalt Strike,英雄联盟中的无尽之刃
- 生意参谋中的访客分布地域数据 生意参谋访客分析
- 茶叶中的化学成分介绍,茶叶贮藏保管的重要性
- 茶产业发展中的问题,助推茶产业转型升级
- 生意参谋主要看哪些数据 生意参谋数据分析中的