مراقبة حركة مرور eBPF

تستخدم أداة مرور شبكة eBPF مجموعة من تطبيق kernel ومساحة المستخدم لمراقبة استخدام الشبكة على الجهاز منذ آخر تمهيد للجهاز. يوفر وظائف إضافية مثل وضع علامات على المقبس وفصل حركة المرور الأمامية / الخلفية وجدار الحماية لكل UID لحظر التطبيقات من الوصول إلى الشبكة اعتمادًا على حالة الهاتف. يتم تخزين الإحصائيات التي تم جمعها من الأداة في بنية بيانات kernel تسمى 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 ، يجب أن تستخدم أجهزة Android التي تعمل على kernel 4.9 أو أعلى والتي تم شحنها في الأصل مع الإصدار P محاسبة مراقبة حركة مرور الشبكة القائمة على eBPF بدلاً من xt_qtaguid . البنية التحتية الجديدة أكثر مرونة وأكثر قابلية للصيانة ولا تتطلب أي كود نواة خارج الشجرة.

يوضح الشكل 1 الاختلافات الرئيسية في التصميم بين مراقبة حركة البيانات القديمة و eBPF.

الاختلافات في تصميم مراقبة حركة المرور القديمة و eBPF

الشكل 1. الاختلافات في تصميم مراقبة حركة المرور القديمة (يسار) و eBPF (يمين)

يعتمد تصميم TrafficController الجديد على مرشح trafficController لكل cgroup بالإضافة إلى وحدة تصفية xt_bpf داخل النواة. يتم تطبيق مرشحات eBPF على الحزمة tx / rx عندما تمر عبر المرشح. يوجد مرشح cgroup eBPF في طبقة النقل وهو مسؤول عن حساب حركة المرور مقابل UID الصحيح اعتمادًا على UID للمقبس بالإضافة إلى إعداد مساحة المستخدمين. يتم ربط netfilter 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 مسؤولان أيضًا عن حظر حركة المرور من معرّفات UID معينة اعتمادًا على إعدادات الهاتف. تعد ميزة حظر حركة مرور الشبكات القائمة على UID بمثابة استبدال للوحدة النمطية xt_owner داخل kernel ويمكن تكوين وضع التفاصيل عن طريق الكتابة إلى traffic_powersave_uid_map و traffic_standby_uid_map و traffic_dozable_uid_map .

يتبع التطبيق الجديد تنفيذ الوحدة النمطية القديمة xt_qtaguid ، لذا سيتم تشغيل TrafficController و NetworkStatsService إما بالتطبيق القديم أو الجديد. إذا كان التطبيق يستخدم واجهات برمجة تطبيقات عامة ، فلن يواجه أي اختلاف سواء تم استخدام أدوات xt_qtaguid أو eBPF في الخلفية.

إذا كانت نواة الجهاز تعتمد على النواة المشتركة لنظام Android 4.9 (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 أو أعلى) ، فلا يلزم إجراء تعديلات على HALs أو برامج التشغيل أو كود النواة لتطبيق أداة eBPF الجديدة.

متطلبات

  1. يجب أن يتم تشغيل التكوينات التالية في تهيئة kernel:

    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 kernel مفيدًا عند التحقق من تشغيل التكوين الصحيح.

  2. يجب ضبط الجهاز MEM_LOCK rlimit على 8 ميغا بايت أو أكثر.

عملية إهلاك xt_qtaguid القديمة

تحل أداة eBPF الجديدة محل وحدة xt_qtaguid والوحدة النمطية xt_owner التي تستند إليها. سنبدأ في إزالة الوحدة النمطية xt_qtaguid من نواة Android وتعطيل التكوينات غير الضرورية.

في إصدار Android 9 ، يتم تشغيل الوحدة النمطية xt_qtaguid في جميع الأجهزة ، ولكن يتم نقل جميع واجهات برمجة التطبيقات العامة التي تقرأ ملف proc للوحدة النمطية xt_qtaguid مباشرةً إلى خدمة NetworkManagement الشبكة. اعتمادًا على إصدار نواة الجهاز ومستوى واجهة برمجة التطبيقات الأول ، تعرف خدمة إدارة الشبكة ما إذا كانت أدوات NetworkManagement قيد التشغيل وتختار الوحدة النمطية المناسبة للحصول عليها لكل حالة استخدام لشبكة التطبيق. يتم حظر التطبيقات ذات المستوى 28 من SDK والإصدارات الأحدث من الوصول إلى ملفات proc xt_qtaguid بواسطة سياسة منفصلة.

في إصدار Android التالي بعد 9 ، سيتم حظر وصول التطبيق إلى ملفات proc هذه xt_qtaguid تمامًا وسنبدأ في إزالة الوحدة النمطية xt_qtaguid من نواة Android الشائعة الجديدة. بعد إزالته ، سنقوم بتحديث التكوين الأساسي لنظام Android لإصدار kernel هذا لإيقاف تشغيل الوحدة النمطية xt_qtaguid بشكل صريح. سيتم إهمال الوحدة النمطية xt_qtaguid تمامًا عندما يكون الحد الأدنى لمتطلبات إصدار kernel لإصدار Android هو 4.9 أو أعلى.

في إصدار Android 9 ، الأجهزة التي يتم تشغيلها بإصدار Android 9 فقط هي المطلوبة للحصول على ميزة eBPF الجديدة. بالنسبة للأجهزة التي يتم شحنها بنواة يمكنها دعم أدوات eBPF ، نوصي بتحديثها إلى ميزة eBPF الجديدة عند الترقية إلى إصدار Android 9. لا يوجد اختبار CTS لفرض هذا التحديث.

تصديق

يجب أن تأخذ التصحيحات بانتظام من نواة Android الشائعة و Android AOSP master. تأكد من اجتياز تطبيقك لاختبارات VTS و CTS القابلة للتطبيق و netd_unit_test و libbpf_test .

اختبارات

توجد kernel net_tests للتأكد من تشغيل الميزات المطلوبة وتصحيحات kernel المطلوبة backported. تم دمج الاختبارات كجزء من اختبارات إصدار Android 9 VTS. توجد بعض اختبارات الوحدة في system/netd/ ( netd_unit_test و libbpf_test ). توجد بعض الاختبارات في netd_integration_test للتحقق من صحة السلوك العام للأداة الجديدة.

المدقق CTS و CTS

نظرًا لأن كلا وحدتي مراقبة حركة المرور مدعومان في إصدار Android 9 ، فلا يوجد اختبار CTS لفرض تنفيذ الوحدة الجديدة على جميع الأجهزة. ولكن بالنسبة للأجهزة التي تحتوي على إصدار kernel أعلى من 4.9 والتي تأتي في الأصل مع إصدار Android 9 (أي مستوى واجهة برمجة التطبيقات الأول> = 28) ، توجد اختبارات CTS على GSI للتحقق من صحة تكوين الوحدة الجديدة بشكل صحيح. يمكن استخدام اختبارات 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 للمالك.

مواقع الاختبار

توجد اختبارات CTS في:

توجد اختبارات VTS على https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py .

تقع اختبارات الوحدة في: