0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文手把手教你Android中的 eBPF 流量监控

如意 来源:CSDN 作者:Peter盼 2020-06-20 10:34 次阅读

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 所示。

一文手把手教你Android中的 eBPF 流量监控

图 1.旧版流量监控(左)和 eBPF 流量监控(右)的设计差异

新的 trafficController 设计基于 cgroup 级的 eBPF 过滤器以及内核中的 xt_bpf netfilter 模块。这些 eBPF 过滤器在收发数据包时应用,数据包需要通过这些过滤器。cgroup eBPF 过滤器位于传输层,负责根据套接字 UID 以及用户空间设置对正确的 UID 计算流量。xt_bpf netfilter 挂接在 bw_raw_PREROUTING 和 bw_mangle_POSTROUTING 链上,负责对正确的接口计算流量。

在启动时,用户空间进程 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 级别,NetworkManagement 服务能够知道 eBPF 工具是否处于开启状态,并选择正确的模块来获取每个应用的网络使用情况统计数据。sepolicy 会阻止 SDK 级别为 28 及以上的应用访问 xt_qtaguid proc 文件。

在 Android 9 之后的下一个版本中,我们将完全阻止应用访问这些 xt_qtaguid proc 文件,并开始从新的 Android 通用内核中移除 xt_qtaguid 模块。移除该模块后,我们将更新相应内核版本的 Android 基础配置,以明确关闭 xt_qtaguid 模块。当 Android 版本的最低内核版本要求为 4.9 或更高时,我们将彻底弃用 xt_qtaguid 模块。

在 Android 9 版本中,只有搭载 Android 9 版本的设备才需要具备新的 eBPF 功能。如果设备搭载的内核可以支持 eBPF 工具,我们建议在升级到 Android 9 版本时,将设备更新为采用新的 eBPF 功能。没有强制执行该更新的 CTS 测试。

验证

您应该定期从 Android 通用内核和 Android AOSP 主分支获取补丁程序。请确保您的实现通过适用的 VTS 和 CTS 测试,即 netd_unit_test 和 libbpf_test。

测试

提供了内核 net_tests,用来确保您开启了必需的功能,并向后移植了必需的内核补丁程序。这些测试已集成到 Android 9 版本 VTS 测试中。system/netd/ 中有一些单元测试(netd_unit_test 和 libbpf_test)。netd_integration_test 中有一些验证新工具整体行为的测试。

CTS 和 CTS 验证程序

由于这两个流量监控模块在 Android 9 版本中都得到支持,因此没有强制在所有设备上实现新模块的 CTS 测试。不过,对于内核版本高于 4.9 且最初搭载了 Android 9 版本(即,初始 API 级别大于等于 28)的设备,提供了基于 GSI 的 CTS 测试,用于验证是否正确配置了新模块。旧的 CTS 测试(如TrafficStatsTest、NetworkUsageStatsTest 和 CtsNativeNetTestCases)可用于验证新模块的行为是否与旧的 UID 模块一致。

手动测试

system/netd/中有一些单元测试(netd_unit_test、netd_integration_test 和 libbpf_test)。此外,还提供了 dumpsys 支持,以便手动检查状态。dumpsys netd 命令可显示 trafficController 模块的基本状态以及是否正确开启了 eBPF。如果 eBPF 处于开启状态,dumpsys netd trafficcontroller 命令会显示每个 eBPF 映射的详细内容,包括带标记的套接字信息、每个标记的统计数据、UID 和 iface,以及所有者 UID 匹配项。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3936

    浏览量

    127388
  • 流量监控
    +关注

    关注

    0

    文章

    17

    浏览量

    7370
  • BPF
    BPF
    +关注

    关注

    0

    文章

    25

    浏览量

    4005
收藏 人收藏

    评论

    相关推荐

    源码开放 智能监测电源管理教程宝典!

    源码开放,今天我们学习的是电源管理系统的核心功能模块,手把手教你如何通过不同的技术手段实现有效的电源管理。
    的头像 发表于 12-11 09:26 237次阅读
    源码开放  智能监测电源管理教程宝典!

    Air780E模组LuatOS开发实战 —— 手把手教你搞定数据打包解包

    本文要说的是低功耗4G模组Air780E的LuatOS开发实战,我将手把手教你搞定数据打包解包。
    的头像 发表于 12-03 11:17 168次阅读
    Air780E模组LuatOS开发实战 —— <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>搞定数据打包解包

    手把手教你如何自制目标检测框架

    今天,给大家分享篇来自知乎的篇关于目标检测相关的些内容, 本文基于Pytorch进行编写。
    的头像 发表于 11-14 16:39 208次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何自制目标检测框架

    手把手教你通过宏集物联网工控屏&amp;网关进行协议转换,将底层PLC/传感器的数据转换为TCP协议并传输到用户

    手把手教你通过宏集物联网工控屏&网关进行协议转换,将底层PLC/传感器的数据转换为TCP协议并传输到用户终端
    的头像 发表于 08-15 13:29 517次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>通过宏集物联网工控屏&amp;网关进行协议转换,将底层PLC/传感器的数据转换为TCP协议并传输到用户

    手把手教你在orcad设置CIS元器件数据库,提高工作效率

    元器件数据库,就是实现上述查找元件、放置元件时所需要调用的数据库。本文将手把手教你如何在orcad配置CIS元器件数据库。
    的头像 发表于 06-15 17:27 6202次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>在orcad<b class='flag-5'>中</b>设置CIS元器件数据库,提高工作效率

    手把手教你排序算法怎么写

    今天以直接插入排序算法,给大家分享下排序算法的实现思路,主要包含以下部分内容:插入排序介绍插入排序算法实现手把手教你排序算法怎么写在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将
    的头像 发表于 06-04 08:03 689次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>排序算法怎么写

    手把手带你移植HAL库函数

    开发者更高效地进行嵌入式开发。手把手带你移植HAL库函数HAL库提供了套抽象接口,使开发者无需直接操作底层硬件寄存器,就能实现对硬件的控制。这种抽象使得代码能够更
    的头像 发表于 05-18 08:04 1896次阅读
    <b class='flag-5'>手把手</b>带你移植HAL库函数

    手把手教你PCB上怎么画GND?

    模拟电路的考核核心指标就是信号的精度。失去精度,模拟电路也就失去了原本的功能意义。交流电源的地线CGND由于是正弦波,是周期性的上下波动变化,它的电压也是上下波动,不是像直流地线GND样始终维持在个0V上不变。
    发表于 03-27 10:56 1316次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>PCB上怎么画GND?

    无刷电机无感FOC控制培训系列课程

    | 本工作室推出电机控制无感foc电机控制系列培训课程本课程主要让想进阶的算法工程师,和刚参加工作的工程师或者在校学生能够进步提高自己的技能,1.从企业用人角度手把手教你做电机控制,提高你的个人
    发表于 03-10 13:52

    【先楫HPM5361EVK开发板试用体验】(原创)6.手把手实战红外线传感器源代码

    试用体验】2手把手实战密钥管理器 KEYM 【先楫HPM5361EVK开发板试用体验】3手把手实战安全数据处理器 SDP 【先楫HPM5361EVK开发板试用体验】4手把手实战EXIP在线解密引擎 【先
    发表于 02-09 15:08

    【先楫HPM5361EVK开发板试用体验】(原创)5.手把手实战AI机械臂

    HPMicro 【先楫HPM5361EVK开发板试用体验】2手把手实战密钥管理器 KEYM 【先楫HPM5361EVK开发板试用体验】3手把手实战安全数据处理器 SDP 【先楫HPM5361EVK开发板
    发表于 02-06 10:28

    【飞腾派4G版免费试用】4.手把手玩转QT界面设计

    完成了使用Qt Designer进行界面设计的全部流程!是不是觉得像魔法样神奇呢?赶紧试试吧! 接上三篇: 【飞腾派4G版免费试用】1.实战交叉编译环境搭建和手把手uboot编译 【飞腾派4G版免费
    发表于 01-27 12:49

    工程送样!手把手教你用好广和通RedCap模组FG131&amp;amp;FG132系列

    工程送样!手把手教你用好广和通RedCap模组FG131&FG132系列
    的头像 发表于 01-11 18:22 704次阅读
    工程送样!<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>用好广和通RedCap模组FG131&amp;amp;FG132系列

    【飞腾派4G版免费试用】3.手把手玩转制作rootfs根文件系统

    你们起玩转制作rootfs,也就是根文件系统。但是别紧张,这不是那种会让你头大的编程问题,而是像在家里做蛋糕样的简单有趣! 非常感谢第篇文章【飞腾派4G版免费试用】1.实战交叉编译环境搭建和
    发表于 01-09 10:49

    【米尔-TIAM62开发板-接替335x-试用评测】+(五)手把手玩转U-Boot控制CPU管脚

    接上四篇: 【米尔-TIAM62开发板-接替335x-试用评测】+()手把手配置Yocto 【米尔-TIAM62开发板-接替335x-试用评测】+(二)配置U-Boot步骤实战 【米尔
    发表于 01-08 10:02