अंतिम डिवाइस बूट के बाद से डिवाइस पर नेटवर्क उपयोग की निगरानी के लिए eBPF नेटवर्क ट्रैफ़िक टूल कर्नेल और उपयोगकर्ता स्थान कार्यान्वयन के संयोजन का उपयोग करता है। यह अतिरिक्त कार्यक्षमता प्रदान करता है जैसे सॉकेट टैगिंग, अग्रभूमि/पृष्ठभूमि ट्रैफ़िक को अलग करना और फ़ोन की स्थिति के आधार पर ऐप्स को नेटवर्क एक्सेस से ब्लॉक करने के लिए प्रति-यूआईडी फ़ायरवॉल। टूल से एकत्र किए गए आंकड़े कर्नेल डेटा संरचना में संग्रहीत किए जाते हैं जिन्हें 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 या इसके बाद के संस्करण पर चलने वाले और मूल रूप से P रिलीज़ के साथ भेजे गए Android उपकरणों को xt_qtaguid के बजाय xt_qtaguid
आधारित नेटवर्क ट्रैफ़िक मॉनिटरिंग अकाउंटिंग का उपयोग करना चाहिए। नया बुनियादी ढांचा अधिक लचीला और अधिक रखरखाव योग्य है और इसके लिए किसी आउट-ऑफ-ट्री कर्नेल कोड की आवश्यकता नहीं है।
लीगेसी और eBPF ट्रैफ़िक मॉनिटरिंग के बीच प्रमुख डिज़ाइन अंतर चित्र 1 में दिखाए गए हैं।
चित्र 1. विरासत (बाएं) और eBPF (दाएं) यातायात निगरानी डिजाइन अंतर
नया trafficController
डिज़ाइन कर्नेल के अंदर per- cgroup
eBPF फ़िल्टर के साथ-साथ xt_bpf
मॉड्यूल पर आधारित है। ये eBPF फ़िल्टर पैकेट tx/rx पर तब लागू होते हैं जब वे फ़िल्टर से गुजरते हैं। cgroup
eBPF फ़िल्टर ट्रांसपोर्ट लेयर पर स्थित है और सॉकेट UID के साथ-साथ यूज़रस्पेस सेटिंग के आधार पर सही UID के विरुद्ध ट्रैफ़िक गिनने के लिए ज़िम्मेदार है। xt_bpf
नेटफिल्टर bw_raw_PREROUTING
और bw_mangle_POSTROUTING
श्रृंखला से जुड़ा हुआ है और सही इंटरफ़ेस के विरुद्ध ट्रैफ़िक गिनने के लिए ज़िम्मेदार है।
बूट समय पर, यूजरस्पेस प्रोसेस trafficController
डेटा संग्रह के लिए उपयोग किए जाने वाले eBPF मैप्स बनाता है और सभी मैप्स को वर्चुअल फाइल के रूप में sys/fs/bpf
bpf पर पिन करता है। फिर विशेषाधिकार प्राप्त प्रक्रिया bpfloader
से संकलित eBPF प्रोग्राम को कर्नेल में लोड करता है और इसे सही cgroup
से जोड़ता है। सभी ट्रैफ़िक के लिए एक रूट cgroup
होता है, इसलिए सभी प्रक्रिया को डिफ़ॉल्ट रूप से उस cgroup
में शामिल किया जाना चाहिए।
रन टाइम पर, traffic_cookie_tag_map
trafficController
traffic_uid_counterSet_map
पर लिखकर टैग/अनटैग कर सकता है। NetworkStatsService
traffic_tag_stats_map
, traffic_uid_stats_map
और traffic_iface_stats_map
से ट्रैफ़िक आँकड़े डेटा पढ़ सकती है। ट्रैफ़िक आँकड़े संग्रह फ़ंक्शन के अलावा, ट्रैफ़िक कंट्रोलर और cgroup
trafficController
फ़िल्टर भी फ़ोन सेटिंग्स के आधार पर कुछ UID से ट्रैफ़िक को अवरुद्ध करने के लिए ज़िम्मेदार हैं। यूआईडी-आधारित नेटवर्किंग ट्रैफिक ब्लॉकिंग फीचर कर्नेल के अंदर xt_owner
मॉड्यूल का प्रतिस्थापन है और डिटेल मोड को traffic_powersave_uid_map
, traffic_standby_uid_map
और traffic_dozable_uid_map
पर लिखकर कॉन्फ़िगर किया जा सकता है।
नया कार्यान्वयन लीगेसी xt_qtaguid
मॉड्यूल कार्यान्वयन का अनुसरण करता है, इसलिए TrafficController
और NetworkStatsService
या तो पुराने या नए कार्यान्वयन के साथ चलेंगे। यदि ऐप सार्वजनिक एपीआई का उपयोग करता है, तो इससे कोई अंतर नहीं आना चाहिए कि पृष्ठभूमि में xt_qtaguid
या eBPF टूल का उपयोग किया गया है या नहीं।
यदि डिवाइस कर्नेल एंड्रॉइड कॉमन कर्नेल 4.9 (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 या इसके बाद के संस्करण) पर आधारित है, तो नए eBPF टूल को लागू करने के लिए HAL, ड्राइवर या कर्नेल कोड में किसी संशोधन की आवश्यकता नहीं है।
आवश्यकताएं
कर्नेल कॉन्फ़िगरेशन में ये निम्न कॉन्फ़िगरेशन चालू होना चाहिए:
-
CONFIG_CGROUP_BPF=y
-
CONFIG_BPF=y
-
CONFIG_BPF_SYSCALL=y
-
CONFIG_NETFILTER_XT_MATCH_BPF=y
-
CONFIG_INET_UDP_DIAG=y
सही कॉन्फ़िगरेशन चालू होने की पुष्टि करते समय VTS कर्नेल कॉन्फ़िगरेशन परीक्षण सहायक होता है।
-
डिवाइस
MEM_LOCK
rlimit को 8 एमबी या अधिक पर सेट किया जाना चाहिए।
विरासती xt_qtaguid बहिष्करण प्रक्रिया
नया eBPF टूल xt_qtaguid
मॉड्यूल और उस पर आधारित xt_owner
मॉड्यूल को बदल रहा है। हम एंड्रॉइड कर्नेल से xt_qtaguid
मॉड्यूल को हटाना शुरू कर देंगे और इसके अनावश्यक कॉन्फ़िगरेशन को अक्षम कर देंगे।
एंड्रॉइड 9 रिलीज में, सभी उपकरणों में xt_qtaguid
मॉड्यूल चालू है, लेकिन सभी सार्वजनिक एपीआई जो सीधे xt_qtaguid
मॉड्यूल proc फ़ाइल को पढ़ते हैं, उन्हें NetworkManagement
Service में स्थानांतरित कर दिया जाता है। डिवाइस कर्नेल संस्करण और पहले API स्तर के आधार पर, NetworkManagement
Service जानता है कि eBPF टूल चालू है या नहीं और प्रत्येक ऐप नेटवर्क उपयोग स्थिति प्राप्त करने के लिए सही मॉड्यूल चुनता है। एसडीके स्तर 28 और उच्चतर वाले ऐप्स को sepolicy द्वारा xt_qtaguid
proc फ़ाइलों तक पहुँचने से रोक दिया गया है।
9 के बाद अगले Android रिलीज़ में, उन xt_qtaguid
proc फ़ाइलों के लिए ऐप एक्सेस पूरी तरह से अवरुद्ध हो जाएगा हम नए Android सामान्य कर्नेल से xt_qtaguid
मॉड्यूल को निकालना शुरू कर देंगे। इसे हटा दिए जाने के बाद, हम xt_qtaguid
मॉड्यूल को स्पष्ट रूप से बंद करने के लिए उस कर्नेल संस्करण के लिए Android बेस कॉन्फिगर को अपडेट करेंगे। जब एंड्रॉइड रिलीज के लिए न्यूनतम कर्नेल संस्करण की आवश्यकता 4.9 या उससे अधिक हो तो xt_qtaguid
मॉड्यूल पूरी तरह से बहिष्कृत हो जाएगा।
एंड्रॉइड 9 रिलीज में, केवल एंड्रॉइड 9 रिलीज के साथ लॉन्च होने वाले उपकरणों के लिए नई ईबीपीएफ सुविधा की आवश्यकता होती है। उन उपकरणों के लिए जो कर्नेल के साथ भेजे गए हैं जो eBPF टूल का समर्थन कर सकते हैं, हम अनुशंसा करते हैं कि Android 9 रिलीज़ में अपग्रेड करते समय इसे नई eBPF सुविधा में अपडेट करें। उस अद्यतन को लागू करने के लिए कोई सीटीएस परीक्षण नहीं है।
मान्यकरण
आपको नियमित रूप से एंड्रॉइड कॉमन कर्नेल और एंड्रॉइड एओएसपी मास्टर से पैच लेना चाहिए। सुनिश्चित करें कि आपका कार्यान्वयन लागू वीटीएस और सीटीएस परीक्षण, netd_unit_test
, और libbpf_test
है।
परिक्षण
यह सुनिश्चित करने के लिए कर्नेल net_tests हैं कि आपके पास आवश्यक सुविधाएँ चालू हैं और आवश्यक कर्नेल पैच बैकपोर्ट किए गए हैं। परीक्षण Android 9 रिलीज़ VTS परीक्षणों के भाग के रूप में एकीकृत हैं। system/netd/
( netd_unit_test
और libbpf_test
) में कुछ इकाई परीक्षण हैं। नए टूल के समग्र व्यवहार को सत्यापित करने के लिए netd_integration_test
में कुछ परीक्षण हैं।
सीटीएस और सीटीएस सत्यापनकर्ता
चूंकि दोनों ट्रैफिक मॉनिटरिंग मॉड्यूल एंड्रॉइड 9 रिलीज में समर्थित हैं, इसलिए सभी उपकरणों पर नए मॉड्यूल को लागू करने के लिए कोई सीटीएस परीक्षण नहीं है। लेकिन 4.9 से अधिक कर्नेल संस्करण वाले उपकरणों के लिए जो मूल रूप से एंड्रॉइड 9 रिलीज (यानी पहला एपीआई स्तर> = 28) के साथ जहाज करते हैं, नए मॉड्यूल को सही ढंग से कॉन्फ़िगर करने के लिए जीएसआई पर सीटीएस परीक्षण हैं। पुराने CTS परीक्षण जैसे कि TrafficStatsTest
, NetworkUsageStatsTest
और CtsNativeNetTestCases
का उपयोग पुराने UID मॉड्यूल के अनुरूप व्यवहार को सत्यापित करने के लिए किया जा सकता है।
मैनुअल परीक्षण
system/netd/
( netd_unit_test
, netd_integration_test
और libbpf_test
) में कुछ इकाई परीक्षण हैं। मैन्युअल रूप से स्थिति की जाँच करने के लिए डंपिस समर्थन है। trafficController
dumpsys netd
कमांड ट्रैफिक कंट्रोलर मॉड्यूल की मूल स्थिति दिखाता है और क्या ईबीपीएफ सही तरीके से चालू है या नहीं। यदि ईबीपीएफ चालू है, तो कमांड dumpsys netd trafficcontroller
प्रत्येक ईबीपीएफ मानचित्र की विस्तृत सामग्री दिखाता है, जिसमें टैग की गई सॉकेट जानकारी, प्रति टैग आंकड़े, यूआईडी और आईफेस, और मालिक यूआईडी मिलान शामिल है।
परीक्षण स्थान
सीटीएस परीक्षण यहां स्थित हैं:
- https://android.googlesource.com/platform/cts/+/master/tests/tests/net/src/android/net/cts/TrafficStatsTest.java {: .external}
- https://android.googlesource.com/platform/cts/+/master/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java {: .external}
- https://android.googlesource.com/platform/system/netd/+/master/tests/bpf_base_test.cpp {: .external}
VTS परीक्षण https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py पर स्थित हैं।
यूनिट परीक्षण यहां स्थित हैं:
- https://android.googlesource.com/platform/system/netd/+/master/libbpf/BpfNetworkStatsTest.cpp {: .external}
- https://android.googlesource.com/platform/system/netd/+/master/server/TrafficControllerTest.cpp {: .external}