0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

一文手把手教你Android中的 eBPF 流量監(jiān)控

如意 ? 來源:CSDN ? 作者:Peter盼 ? 2020-06-20 10:34 ? 次閱讀

eBPF 網(wǎng)絡流量工具結(jié)合使用內(nèi)核與用戶空間實現(xiàn)來監(jiān)控設備自上次啟動以來的網(wǎng)絡使用情況。它提供了額外的功能(如套接字標記、分離前臺/后臺流量,以及按 UID 劃分的防火墻),以根據(jù)手機狀態(tài)阻止應用訪問網(wǎng)絡。從該工具收集的統(tǒng)計數(shù)據(jù)存儲在稱為 eBPF maps 的內(nèi)核數(shù)據(jù)結(jié)構(gòu)中,并且相應結(jié)果由 NetworkStatsService 等服務用來提供自設備上次啟動以來的持久流量統(tǒng)計數(shù)據(jù)。

示例和來源

用戶空間更改主要在 system/netd 和 framework/base 項目中。開發(fā)工作在 AOSP 中完成,因此 AOSP 代碼將始終保持最新狀態(tài)。源代碼主要位于 system/netd/server/TrafficController*、system/netd/bpfloader 和 system/netd/libbpf/ 中。此外,一些必要的框架變更也在 framework/base/ 和 system/core 中。

實現(xiàn)

Android 9 開始,內(nèi)核版本為 4.9 或更高且最初搭載了 Android P 版本的 Android 設備必須使用基于 eBPF 的網(wǎng)絡流量監(jiān)控記帳模塊,而不是 xt_qtaguid。新的基礎架構(gòu)更靈活且更易于維護,并且不需要任何外部內(nèi)核代碼。

舊版流量監(jiān)控和 eBPF 流量監(jiān)控之間的主要設計差異如圖 1 所示。

一文手把手教你Android中的 eBPF 流量監(jiān)控

圖 1.舊版流量監(jiān)控(左)和 eBPF 流量監(jiān)控(右)的設計差異

新的 trafficController 設計基于 cgroup 級的 eBPF 過濾器以及內(nèi)核中的 xt_bpf netfilter 模塊。這些 eBPF 過濾器在收發(fā)數(shù)據(jù)包時應用,數(shù)據(jù)包需要通過這些過濾器。cgroup eBPF 過濾器位于傳輸層,負責根據(jù)套接字 UID 以及用戶空間設置對正確的 UID 計算流量。xt_bpf netfilter 掛接在 bw_raw_PREROUTING 和 bw_mangle_POSTROUTING 鏈上,負責對正確的接口計算流量。

在啟動時,用戶空間進程 trafficController 會創(chuàng)建用于收集數(shù)據(jù)的 eBPF 映射,并將所有映射作為虛擬文件固定在 sys/fs/bpf。然后,特權進程 bpfloader 將預編譯的 eBPF 程序加載到內(nèi)核中,并將其附加到正確的 cgroup。所有流量都對應于同一個根 cgroup,因此默認情況下,所有進程都應包含在該 cgroup 中。

在運行時,trafficController 可以通過將數(shù)據(jù)寫入 traffic_cookie_tag_map 和 traffic_uid_counterSet_map 來標記/取消標記套接字。NetworkStatsService 可以從 traffic_tag_stats_map、traffic_uid_stats_map 和 traffic_iface_stats_map 中讀取流量統(tǒng)計數(shù)據(jù)。除了流量統(tǒng)計數(shù)據(jù)收集功能之外,trafficController 和 cgroup eBPF 過濾器還負責根據(jù)手機設置屏蔽來自某些 UID 的流量?;?UID 的網(wǎng)絡流量屏蔽功能取代了內(nèi)核中的 xt_owner 模塊,并且可以通過將數(shù)據(jù)寫入 traffic_powersave_uid_map、traffic_standby_uid_map 和 traffic_dozable_uid_map 來配置詳細模式。

新實現(xiàn)遵循舊版 xt_qtaguid 模塊實現(xiàn),因此 TrafficController 和 NetworkStatsService 將使用舊版實現(xiàn)或新實現(xiàn)運行。如果應用使用公共 API,那么無論在后臺使用 xt_qtaguid 還是 eBPF 工具,應該沒有任何區(qū)別。

如果設備內(nèi)核基于 Android 通用內(nèi)核 4.9(SHA39c856663dcc81739e52b02b77d6af259eb838f6 或更高版本),則無需修改 HAL、驅(qū)動程序或內(nèi)核代碼,即可實現(xiàn)新的 eBPF 工具。

要求

內(nèi)核配置必須開啟以下配置:

驗證是否已開啟正確配置時,VTS 內(nèi)核配置測試非常有用。

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 內(nèi)核中移除 xt_qtaguid 模塊,并停用不必要的配置。

在 Android 9 版本中,xt_qtaguid 模塊在所有設備上都處于開啟狀態(tài),但直接讀取 xt_qtaguid 模塊 proc 文件的所有公共 API 都移到了 NetworkManagement 服務中。根據(jù)設備內(nèi)核版本和初始 API 級別,NetworkManagement 服務能夠知道 eBPF 工具是否處于開啟狀態(tài),并選擇正確的模塊來獲取每個應用的網(wǎng)絡使用情況統(tǒng)計數(shù)據(jù)。sepolicy 會阻止 SDK 級別為 28 及以上的應用訪問 xt_qtaguid proc 文件。

在 Android 9 之后的下一個版本中,我們將完全阻止應用訪問這些 xt_qtaguid proc 文件,并開始從新的 Android 通用內(nèi)核中移除 xt_qtaguid 模塊。移除該模塊后,我們將更新相應內(nèi)核版本的 Android 基礎配置,以明確關閉 xt_qtaguid 模塊。當 Android 版本的最低內(nèi)核版本要求為 4.9 或更高時,我們將徹底棄用 xt_qtaguid 模塊。

在 Android 9 版本中,只有搭載 Android 9 版本的設備才需要具備新的 eBPF 功能。如果設備搭載的內(nèi)核可以支持 eBPF 工具,我們建議在升級到 Android 9 版本時,將設備更新為采用新的 eBPF 功能。沒有強制執(zhí)行該更新的 CTS 測試。

驗證

您應該定期從 Android 通用內(nèi)核和 Android AOSP 主分支獲取補丁程序。請確保您的實現(xiàn)通過適用的 VTS 和 CTS 測試,即 netd_unit_test 和 libbpf_test。

測試

提供了內(nèi)核 net_tests,用來確保您開啟了必需的功能,并向后移植了必需的內(nèi)核補丁程序。這些測試已集成到 Android 9 版本 VTS 測試中。system/netd/ 中有一些單元測試(netd_unit_test 和 libbpf_test)。netd_integration_test 中有一些驗證新工具整體行為的測試。

CTS 和 CTS 驗證程序

由于這兩個流量監(jiān)控模塊在 Android 9 版本中都得到支持,因此沒有強制在所有設備上實現(xiàn)新模塊的 CTS 測試。不過,對于內(nèi)核版本高于 4.9 且最初搭載了 Android 9 版本(即,初始 API 級別大于等于 28)的設備,提供了基于 GSI 的 CTS 測試,用于驗證是否正確配置了新模塊。舊的 CTS 測試(如TrafficStatsTest、NetworkUsageStatsTest 和 CtsNativeNetTestCases)可用于驗證新模塊的行為是否與舊的 UID 模塊一致。

手動測試

system/netd/中有一些單元測試(netd_unit_test、netd_integration_test 和 libbpf_test)。此外,還提供了 dumpsys 支持,以便手動檢查狀態(tài)。dumpsys netd 命令可顯示 trafficController 模塊的基本狀態(tài)以及是否正確開啟了 eBPF。如果 eBPF 處于開啟狀態(tài),dumpsys netd trafficcontroller 命令會顯示每個 eBPF 映射的詳細內(nèi)容,包括帶標記的套接字信息、每個標記的統(tǒng)計數(shù)據(jù)、UID 和 iface,以及所有者 UID 匹配項。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3937

    瀏覽量

    127454
  • 流量監(jiān)控

    關注

    0

    文章

    17

    瀏覽量

    7373
  • BPF
    BPF
    +關注

    關注

    0

    文章

    25

    瀏覽量

    4007
收藏 人收藏

    評論

    相關推薦

    源碼開放 智能監(jiān)測電源管理教程寶典!

    源碼開放,今天我們學習的是電源管理系統(tǒng)的核心功能模塊,手把手教你如何通過不同的技術手段實現(xiàn)有效的電源管理。
    的頭像 發(fā)表于 12-11 09:26 ?264次閱讀
    源碼開放  智能監(jiān)測電源管理教程寶典!

    Air780E模組LuatOS開發(fā)實戰(zhàn) —— 手把手教你搞定數(shù)據(jù)打包解包

    本文要說的是低功耗4G模組Air780E的LuatOS開發(fā)實戰(zhàn),我將手把手教你搞定數(shù)據(jù)打包解包。
    的頭像 發(fā)表于 12-03 11:17 ?177次閱讀
    Air780E模組LuatOS開發(fā)實戰(zhàn) —— <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>搞定數(shù)據(jù)打包解包

    手把手教你如何自制目標檢測框架

    今天,給大家分享篇來自知乎的篇關于目標檢測相關的些內(nèi)容, 本文基于Pytorch進行編寫。
    的頭像 發(fā)表于 11-14 16:39 ?214次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何自制目標檢測框架

    手把手教你通過宏集物聯(lián)網(wǎng)工控屏&amp;網(wǎng)關進行協(xié)議轉(zhuǎn)換,將底層PLC/傳感器的數(shù)據(jù)轉(zhuǎn)換為TCP協(xié)議并傳輸?shù)接脩?/a>

    手把手教你通過宏集物聯(lián)網(wǎng)工控屏&網(wǎng)關進行協(xié)議轉(zhuǎn)換,將底層PLC/傳感器的數(shù)據(jù)轉(zhuǎn)換為TCP協(xié)議并傳輸?shù)接脩艚K端
    的頭像 發(fā)表于 08-15 13:29 ?527次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>通過宏集物聯(lián)網(wǎng)工控屏&amp;網(wǎng)關進行協(xié)議轉(zhuǎn)換,將底層PLC/傳感器的數(shù)據(jù)轉(zhuǎn)換為TCP協(xié)議并傳輸?shù)接脩? />    </a>
</div>                            <div   id=

    手把手教你在orcad設置CIS元器件數(shù)據(jù)庫,提高工作效率

    元器件數(shù)據(jù)庫,就是實現(xiàn)上述查找元件、放置元件時所需要調(diào)用的數(shù)據(jù)庫。本文將手把手教你如何在orcad配置CIS元器件數(shù)據(jù)庫。
    的頭像 發(fā)表于 06-15 17:27 ?6277次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>在orcad<b class='flag-5'>中</b>設置CIS元器件數(shù)據(jù)庫,提高工作效率

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

    今天以直接插入排序算法,給大家分享下排序算法的實現(xiàn)思路,主要包含以下部分內(nèi)容:插入排序介紹插入排序算法實現(xiàn)手把手教你排序算法怎么寫在添加新的記錄時,使用順序查找的方式找到其要插入的位置,然后將
    的頭像 發(fā)表于 06-04 08:03 ?702次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>排序算法怎么寫

    手把手帶你移植HAL庫函數(shù)

    開發(fā)者更高效地進行嵌入式開發(fā)。手把手帶你移植HAL庫函數(shù)HAL庫提供了套抽象接口,使開發(fā)者無需直接操作底層硬件寄存器,就能實現(xiàn)對硬件的控制。這種抽象使得代碼能夠更
    的頭像 發(fā)表于 05-18 08:04 ?1934次閱讀
    <b class='flag-5'>手把手</b>帶你移植HAL庫函數(shù)

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

    模擬電路的考核核心指標就是信號的精度。失去精度,模擬電路也就失去了原本的功能意義。交流電源的地線CGND由于是正弦波,是周期性的上下波動變化,它的電壓也是上下波動,不是像直流地線GND樣始終維持在個0V上不變。
    發(fā)表于 03-27 10:56 ?1340次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>PCB上怎么畫GND?

    無刷電機無感FOC控制培訓系列課程

    | 本工作室推出電機控制無感foc電機控制系列培訓課程本課程主要讓想進階的算法工程師,和剛參加工作的工程師或者在校學生能夠進步提高自己的技能,1.從企業(yè)用人角度手把手教你做電機控制,提高你的個人
    發(fā)表于 03-10 13:52

    【先楫HPM5361EVK開發(fā)板試用體驗】(原創(chuàng))6.手把手實戰(zhàn)紅外線傳感器源代碼

    試用體驗】2手把手實戰(zhàn)密鑰管理器 KEYM 【先楫HPM5361EVK開發(fā)板試用體驗】3手把手實戰(zhàn)安全數(shù)據(jù)處理器 SDP 【先楫HPM5361EVK開發(fā)板試用體驗】4手把手實戰(zhàn)EXIP在線解密引擎 【先
    發(fā)表于 02-09 15:08

    【先楫HPM5361EVK開發(fā)板試用體驗】(原創(chuàng))5.手把手實戰(zhàn)AI機械臂

    HPMicro 【先楫HPM5361EVK開發(fā)板試用體驗】2手把手實戰(zhàn)密鑰管理器 KEYM 【先楫HPM5361EVK開發(fā)板試用體驗】3手把手實戰(zhàn)安全數(shù)據(jù)處理器 SDP 【先楫HPM5361EVK開發(fā)板
    發(fā)表于 02-06 10:28

    【飛騰派4G版免費試用】4.手把手玩轉(zhuǎn)QT界面設計

    完成了使用Qt Designer進行界面設計的全部流程!是不是覺得像魔法樣神奇呢?趕緊試試吧! 接上三篇: 【飛騰派4G版免費試用】1.實戰(zhàn)交叉編譯環(huán)境搭建和手把手uboot編譯 【飛騰派4G版免費
    發(fā)表于 01-27 12:49

    工程送樣!手把手教你用好廣和通RedCap模組FG131&amp;amp;FG132系列

    工程送樣!手把手教你用好廣和通RedCap模組FG131&FG132系列
    的頭像 發(fā)表于 01-11 18:22 ?707次閱讀
    工程送樣!<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>用好廣和通RedCap模組FG131&amp;amp;FG132系列

    【飛騰派4G版免費試用】3.手把手玩轉(zhuǎn)制作rootfs根文件系統(tǒng)

    你們起玩轉(zhuǎn)制作rootfs,也就是根文件系統(tǒng)。但是別緊張,這不是那種會讓你頭大的編程問題,而是像在家里做蛋糕樣的簡單有趣! 非常感謝第篇文章【飛騰派4G版免費試用】1.實戰(zhàn)交叉編譯環(huán)境搭建和
    發(fā)表于 01-09 10:49

    【米爾-TIAM62開發(fā)板-接替335x-試用評測】+(五)手把手玩轉(zhuǎn)U-Boot控制CPU管腳

    接上四篇: 【米爾-TIAM62開發(fā)板-接替335x-試用評測】+()手把手配置Yocto 【米爾-TIAM62開發(fā)板-接替335x-試用評測】+(二)配置U-Boot步驟實戰(zhàn) 【米爾
    發(fā)表于 01-08 10:02