eBPF ट्रैफिक मॉनिटरिंग

अंतिम डिवाइस बूट के बाद से डिवाइस पर नेटवर्क उपयोग की निगरानी के लिए 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 में दिखाए गए हैं।

विरासत और eBPF यातायात निगरानी डिजाइन अंतर

चित्र 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, ड्राइवर या कर्नेल कोड में किसी संशोधन की आवश्यकता नहीं है।

आवश्यकताएं

  1. कर्नेल कॉन्फ़िगरेशन में ये निम्न कॉन्फ़िगरेशन चालू होना चाहिए:

    1. CONFIG_CGROUP_BPF=y
    2. CONFIG_BPF=y
    3. CONFIG_BPF_SYSCALL=y
    4. CONFIG_NETFILTER_XT_MATCH_BPF=y
    5. CONFIG_INET_UDP_DIAG=y

    सही कॉन्‍फ़िगरेशन चालू होने की पुष्टि करते समय VTS कर्नेल कॉन्‍फ़िगरेशन परीक्षण सहायक होता है।

  2. डिवाइस 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 प्रत्येक ईबीपीएफ मानचित्र की विस्तृत सामग्री दिखाता है, जिसमें टैग की गई सॉकेट जानकारी, प्रति टैग आंकड़े, यूआईडी और आईफेस, और मालिक यूआईडी मिलान शामिल है।

परीक्षण स्थान

सीटीएस परीक्षण यहां स्थित हैं:

VTS परीक्षण https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py पर स्थित हैं।

यूनिट परीक्षण यहां स्थित हैं: