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 में भी हैं।

कार्यान्वयन

एंड्रॉइड 9 से शुरू होकर, कर्नेल 4.9 या इसके बाद के संस्करण पर चलने वाले और मूल रूप से पी रिलीज के साथ आने वाले एंड्रॉइड डिवाइसों को xt_qtaguid के बजाय eBPF-आधारित नेटवर्क ट्रैफिक मॉनिटरिंग अकाउंटिंग का उपयोग करना होगा। नया बुनियादी ढांचा अधिक लचीला और अधिक रखरखाव योग्य है और इसके लिए किसी आउट-ऑफ-ट्री कर्नेल कोड की आवश्यकता नहीं है।

लीगेसी और ईबीपीएफ ट्रैफ़िक मॉनिटरिंग के बीच प्रमुख डिज़ाइन अंतर चित्र 1 में दिखाए गए हैं।

लीगेसी और ईबीपीएफ ट्रैफिक मॉनिटरिंग डिज़ाइन में अंतर

चित्र 1. विरासत (बाएं) और ईबीपीएफ (दाएं) यातायात निगरानी डिजाइन अंतर

नया trafficController डिज़ाइन per cgroup eBPF फ़िल्टर के साथ-साथ कर्नेल के अंदर xt_bpf नेटफ़िल्टर मॉड्यूल पर आधारित है। जब ये eBPF फ़िल्टर फ़िल्टर से गुजरते हैं तो पैकेट tx/rx पर लागू होते हैं। cgroup ईबीपीएफ फिल्टर ट्रांसपोर्ट लेयर पर स्थित है और सॉकेट यूआईडी के साथ-साथ यूजरस्पेस सेटिंग के आधार पर सही यूआईडी के खिलाफ ट्रैफिक की गिनती के लिए जिम्मेदार है। xt_bpf नेटफ़िल्टर bw_raw_PREROUTING और bw_mangle_POSTROUTING श्रृंखला से जुड़ा हुआ है और सही इंटरफ़ेस के विरुद्ध ट्रैफ़िक की गणना करने के लिए ज़िम्मेदार है।

बूट समय पर, यूजरस्पेस प्रक्रिया trafficController डेटा संग्रह के लिए उपयोग किए जाने वाले ईबीपीएफ मानचित्र बनाता है और सभी मानचित्रों को 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 ईबीपीएफ फ़िल्टर भी फ़ोन सेटिंग्स के आधार पर कुछ यूआईडी से ट्रैफ़िक को अवरुद्ध करने के लिए ज़िम्मेदार हैं। यूआईडी-आधारित नेटवर्किंग ट्रैफिक ब्लॉकिंग सुविधा कर्नेल के अंदर 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 टूल को लागू करने के लिए HALs, ड्राइवर या कर्नेल कोड में कोई संशोधन की आवश्यकता नहीं है।

आवश्यकताएं

  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

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

लीगेसी xt_qtaguid बहिष्करण प्रक्रिया

नया eBPF टूल xt_qtaguid मॉड्यूल और उस xt_owner मॉड्यूल की जगह ले रहा है जिस पर यह आधारित है। हम एंड्रॉइड कर्नेल से xt_qtaguid मॉड्यूल को हटाना शुरू करेंगे और इसकी अनावश्यक कॉन्फ़िगरेशन को अक्षम करेंगे।

एंड्रॉइड 9 रिलीज़ में, xt_qtaguid मॉड्यूल सभी डिवाइसों में चालू है, लेकिन सभी सार्वजनिक एपीआई जो सीधे xt_qtaguid मॉड्यूल proc फ़ाइल को पढ़ते हैं, उन्हें NetworkManagement सेवा में ले जाया जाता है। डिवाइस कर्नेल संस्करण और पहले एपीआई स्तर के आधार पर, NetworkManagement सेवा जानती है कि ईबीपीएफ उपकरण चालू है या नहीं और प्रत्येक ऐप नेटवर्क उपयोग स्टेट के लिए सही मॉड्यूल चुनता है। SDK स्तर 28 और उच्चतर वाले ऐप्स को sepolicy द्वारा xt_qtaguid proc फ़ाइलों तक पहुंचने से अवरुद्ध कर दिया गया है।

9 के बाद अगले एंड्रॉइड रिलीज में, उन xt_qtaguid proc फ़ाइलों तक ऐप की पहुंच पूरी तरह से अवरुद्ध हो जाएगी, हम नए एंड्रॉइड सामान्य कर्नेल से xt_qtaguid मॉड्यूल को हटाना शुरू कर देंगे। इसे हटाए जाने के बाद, हम xt_qtaguid मॉड्यूल को स्पष्ट रूप से बंद करने के लिए उस कर्नेल संस्करण के लिए एंड्रॉइड बेस कॉन्फ़िगरेशन को अपडेट करेंगे। एंड्रॉइड रिलीज़ के लिए न्यूनतम कर्नेल संस्करण की आवश्यकता 4.9 या उससे ऊपर होने पर xt_qtaguid मॉड्यूल पूरी तरह से अप्रचलित हो जाएगा।

एंड्रॉइड 9 रिलीज़ में, केवल एंड्रॉइड 9 रिलीज़ के साथ लॉन्च होने वाले डिवाइस में नई eBPF सुविधा होना आवश्यक है। उन डिवाइसों के लिए जो कर्नेल के साथ भेजे गए हैं जो ईबीपीएफ टूल का समर्थन कर सकते हैं, हम एंड्रॉइड 9 रिलीज में अपग्रेड करते समय इसे नई ईबीपीएफ सुविधा में अपडेट करने की सलाह देते हैं। उस अद्यतन को लागू करने के लिए कोई सीटीएस परीक्षण नहीं है।

मान्यकरण

आपको नियमित रूप से एंड्रॉइड कॉमन कर्नेल और एंड्रॉइड एओएसपी मेन से पैच लेना चाहिए। सुनिश्चित करें कि आपका कार्यान्वयन लागू वीटीएस और सीटीएस परीक्षण, netd_unit_test और libbpf_test पास कर लेता है।

परिक्षण

यह सुनिश्चित करने के लिए कि आपके पास आवश्यक सुविधाएँ चालू हैं और आवश्यक कर्नेल पैच बैकपोर्ट किए गए हैं , कर्नेल नेट_टेस्ट हैं। परीक्षणों को एंड्रॉइड 9 रिलीज़ वीटीएस परीक्षणों के भाग के रूप में एकीकृत किया गया है। system/netd/ ( netd_unit_test और libbpf_test ) में कुछ यूनिट परीक्षण हैं। नए टूल के समग्र व्यवहार को सत्यापित करने के लिए netd_integration_test में कुछ परीक्षण हैं।

सीटीएस और सीटीएस सत्यापनकर्ता

क्योंकि दोनों ट्रैफ़िक मॉनिटरिंग मॉड्यूल एंड्रॉइड 9 रिलीज़ में समर्थित हैं, सभी उपकरणों पर नए मॉड्यूल को लागू करने के लिए बाध्य करने के लिए कोई सीटीएस परीक्षण नहीं है। लेकिन 4.9 से उच्चतर कर्नेल संस्करण वाले उपकरणों के लिए जो मूल रूप से एंड्रॉइड 9 रिलीज (यानी पहला एपीआई स्तर> = 28) के साथ आते हैं, नए मॉड्यूल को सही ढंग से कॉन्फ़िगर करने के लिए जीएसआई पर सीटीएस परीक्षण होते हैं। पुराने सीटीएस परीक्षण जैसे कि TrafficStatsTest , NetworkUsageStatsTest और CtsNativeNetTestCases का उपयोग पुराने यूआईडी मॉड्यूल के अनुरूप व्यवहार को सत्यापित करने के लिए किया जा सकता है।

मैन्युअल परीक्षण

system/netd/ ( netd_unit_test , netd_integration_test और libbpf_test ) में कुछ यूनिट परीक्षण हैं। स्थिति को मैन्युअल रूप से जांचने के लिए डंपसिस समर्थन है। कमांड dumpsys netd trafficController मॉड्यूल की मूल स्थिति दिखाता है और क्या ईबीपीएफ सही ढंग से चालू है। यदि ईबीपीएफ चालू है, तो कमांड dumpsys netd trafficcontroller प्रत्येक ईबीपीएफ मानचित्र की विस्तृत सामग्री दिखाता है, जिसमें टैग की गई सॉकेट जानकारी, प्रति टैग आंकड़े, यूआईडी और आईफेस, और मालिक यूआईडी मिलान शामिल है।

स्थानों का परीक्षण करें

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

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

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