مراقبة حركة مرور 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 . تعد البنية التحتية الجديدة أكثر مرونة وأكثر قابلية للصيانة ولا تتطلب أي كود نواة خارج الشجرة.

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

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

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

يعتمد التصميم الجديد trafficController على مرشح eBPF لكل cgroup بالإضافة إلى وحدة xt_bpf netfilter داخل النواة. يتم تطبيق مرشحات eBPF هذه على الحزمة tx/rx عندما تمر عبر المرشح. يوجد مرشح cgroup eBPF في طبقة النقل وهو مسؤول عن حساب حركة المرور مقابل UID الصحيح اعتمادًا على UID للمقبس بالإضافة إلى إعداد مساحة المستخدم. يتم ربط xt_bpf netfilter بسلسلة bw_raw_PREROUTING و bw_mangle_POSTROUTING وهو مسؤول عن حساب حركة المرور مقابل الواجهة الصحيحة.

في وقت التمهيد، تقوم trafficController الخاصة بعملية مساحة المستخدم بإنشاء خرائط eBPF المستخدمة لجمع البيانات وتثبيت جميع الخرائط كملف افتراضي في 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 eBPF مسؤولان أيضًا عن حظر حركة المرور من معرفات 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 kernel 4.9 الشائع (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 أو أعلى)، فلن تكون هناك حاجة لإجراء تعديلات على HALs أو برامج التشغيل أو كود kernel لتنفيذ أداة 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 مفيدًا عند التحقق من تشغيل التكوين الصحيح.

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

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

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

في إصدار Android التالي بعد 9، سيتم حظر وصول التطبيق إلى ملفات xt_qtaguid proc تمامًا، وسنبدأ في إزالة وحدة 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 الرئيسي. تأكد من أن تنفيذك يجتاز اختبارات VTS وCTS المعمول بها، و netd_unit_test ، و libbpf_test .

اختبارات

هناك اختبارات net_tests لـ kernel للتأكد من تشغيل الميزات المطلوبة وتصحيحات kernel المطلوبة. تم دمج الاختبارات كجزء من اختبارات VTS لإصدار Android 9. توجد بعض اختبارات الوحدات في 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/+/main/net/test/bpf_test.py .

اختبارات الوحدة موجودة في: