مرشح حزم بيركلي
مرشح حزم بيركلي ( BPF ؛ ويُعرف أيضًا باسم مرشح حزم BSD ، أو مرشح حزم بيركلي الكلاسيكي ، أو cBPF ) هو آلية لالتقاط حزم الشبكة وتصفية حزم البيانات ، تسمح بالتقاط حزم الشبكة الحاسوبية وتصفيتها على مستوى نظام التشغيل . يوفر هذا المرشح واجهة مباشرة لطبقات ربط البيانات ، مما يسمح بإرسال واستقبال حزم طبقة الربط الخام، [ 1 ] كما يسمح لعملية المستخدم بتوفير برنامج تصفية يحدد الحزم التي ترغب في استقبالها. على سبيل المثال، قد ترغب عملية tcpdump في استقبال الحزم التي تبدأ اتصال TCP فقط. يُعيد مرشح BPF الحزم التي تجتاز التصفية التي توفرها العملية فقط. هذا يمنع نسخ الحزم غير المرغوب فيها من نواة نظام التشغيل إلى العملية، مما يُحسّن الأداء بشكل كبير. يكون برنامج التصفية على شكل تعليمات لآلة افتراضية ، يتم تفسيرها، أو ترجمتها إلى لغة الآلة بواسطة آلية الترجمة الفورية (JIT)، ثم تنفيذها في النواة.
يُستخدم بروتوكول BPF من قِبل البرامج التي تحتاج، من بين أمور أخرى، إلى تحليل حركة مرور الشبكة. إذا كان برنامج تشغيل واجهة الشبكة يدعم الوضع المختلط ، فإنه يسمح بوضع الواجهة في هذا الوضع بحيث يمكن استقبال جميع الحزم على الشبكة ، حتى تلك المُوجهة إلى مضيفين آخرين.
تتوفر آلية ترشيح BPF في معظم أنظمة التشغيل الشبيهة بنظام يونكس . ويُستخدم مصطلح BPF أحيانًا للإشارة إلى آلية الترشيح فقط، وليس إلى الواجهة بأكملها. بعض الأنظمة، مثل لينكس و Tru64 يونكس ، توفر واجهة خام لطبقة ربط البيانات تختلف عن واجهة BPF الخام، ولكنها تستخدم آليات ترشيح BPF لتلك الواجهة الخام.
توفر نواة لينكس نسخة موسعة من آلية تصفية BPF، تُسمى eBPF ، والتي تستخدم آلية JIT، وتُستخدم لتصفية الحزم، بالإضافة إلى أغراض أخرى في النواة. كما تتوفر eBPF لنظام التشغيل مايكروسوفت ويندوز . [ 2 ]
تاريخ
كتب الورقة البحثية الأصلية ستيفن ماكان وفان جاكوبسون في عام 1992 أثناء وجودهما في مختبر لورانس بيركلي . [ 1 ] [ 3 ]
واجهة ربط البيانات الخام
يوفر BPF أجهزة وهمية يمكن ربطها بواجهة الشبكة؛ ستقرأ عمليات القراءة من الجهاز مخازن مؤقتة مليئة بالحزم المستلمة على واجهة الشبكة، وستقوم عمليات الكتابة إلى الجهاز بحقن الحزم على واجهة الشبكة.
في عام ٢٠٠٧، أضاف روبرت واتسون وكريستيان بيرون امتدادات مخزن مؤقت بدون نسخ إلى تطبيق BPF في نظام التشغيل FreeBSD ، [ ٤ ] مما يسمح لعملية التقاط حزم البيانات في نواة النظام، ضمن معالج مقاطعة برنامج تشغيل الجهاز، بالكتابة مباشرةً إلى ذاكرة عملية المستخدم لتجنب الحاجة إلى نسختين لجميع بيانات الحزم المستلمة عبر جهاز BPF. وبينما تبقى نسخة واحدة في مسار الاستلام لعمليات المستخدم، فإن هذا يحافظ على استقلالية مستهلكي جهاز BPF المختلفين، كما يسمح بتجميع رؤوس الحزم في مخزن BPF المؤقت بدلاً من نسخ بيانات الحزمة كاملةً. [ ٥ ]
تصفية
تُنفَّذ إمكانيات التصفية في BPF كمترجم للغة الآلة الخاصة بالآلة الافتراضية BPF ، وهي آلة 32 بت ذات تعليمات ثابتة الطول، ومُجمِّع واحد ، ومسجل فهرس واحد . تستطيع البرامج المكتوبة بهذه اللغة جلب البيانات من الحزمة، وإجراء عمليات حسابية عليها، ومقارنة النتائج بثوابت أو ببيانات الحزمة أو بتات اختبار في النتائج، ثم قبول الحزمة أو رفضها بناءً على نتائج هذه الاختبارات.
غالبًا ما يتم توسيع BPF عن طريق "تحميل" تعليمات التحميل (ld) والتخزين (str) بشكل زائد.
يمكن استخدام تطبيقات BPF التقليدية الشبيهة بنظام يونكس في مساحة المستخدم، على الرغم من أنها مصممة لمساحة النواة. ويتم ذلك باستخدام شروط المعالج المسبق .
منذ الإصدار 3.18، تتضمن نواة لينكس آلة افتراضية موسعة لـ BPF مزودة بعشرة سجلات 64 بت، تُسمى eBPF . يمكن استخدامها لأغراض غير متعلقة بالشبكات، مثل ربط برامج eBPF بنقاط تتبع مختلفة . [ 6 ] [ 7 ] [ 8 ] منذ الإصدار 3.19، يمكن ربط مرشحات eBPF بالمآخذ ، [ 9 ] [ 10 ] ومنذ الإصدار 4.1، يمكن ربطها بمصنفات التحكم في حركة البيانات لمسار بيانات الشبكة الداخلة والخارجة. [ 11 ] [ 12 ] أُعيد تسمية الإصدار الأصلي والقديم إلى BPF الكلاسيكي ( cBPF ). حاليًا، تُشغّل نواة لينكس eBPF فقط، ويتم ترجمة بايت كود cBPF المُحمّل بشفافية إلى تمثيل eBPF في النواة قبل تنفيذ البرنامج. [ 13 ] يتم التحقق من جميع التعليمات البرمجية قبل تشغيلها لمنع هجمات حجب الخدمة. وحتى إصدار لينكس 5.3، كان نظام التحقق يمنع استخدام الحلقات، وذلك لتجنب أوقات التنفيذ غير المحدودة المحتملة؛ أما الآن، فيُسمح باستخدام الحلقات ذات وقت التنفيذ المحدود في النواة الأحدث. [ 14 ]
الإضافات والتحسينات
تستخدم بعض المشاريع مجموعات تعليمات BPF أو تقنيات تنفيذ مختلفة عن النسخ الأصلية.
تستخدم بعض المنصات، بما في ذلك FreeBSD و NetBSD و WinPcap ، مُترجمًا فوريًا (JIT) لتحويل تعليمات BPF إلى كود أصلي بهدف تحسين الأداء. يتضمن نظام Linux مُترجم BPF فوريًا (JIT) مُعطّلًا افتراضيًا.
تُستخدم مترجمات وضع النواة لنفس لغة الآلة الافتراضية في آليات طبقة ربط البيانات الخام في أنظمة التشغيل الأخرى، مثل Tru64 Unix ، وفي مرشحات المقابس في نواة Linux وفي آلية التقاط الحزم WinPcap و Npcap .
التطبيقات
يُوفّر تطبيق libpcap/WinPcap/Npcap لواجهة برمجة تطبيقات pcap مُفسّرًا لنمط المستخدم لـ BPF ، بحيث يُمكن تصفية الحزم في نمط المستخدم عند التقاطها على أنظمة لا تدعم نمط النواة لآلية التصفية هذه. يعمل الكود الذي يستخدم واجهة برمجة تطبيقات pcap على كلا النوعين من الأنظمة، مع العلم أنه في الأنظمة التي تُجرى فيها التصفية في نمط المستخدم، تُنسخ جميع الحزم، بما فيها الحزم المراد تصفيتها، من النواة إلى مساحة المستخدم. يُمكن أيضًا استخدام هذا المُفسّر عند قراءة ملف يحتوي على حزم مُلتقطة باستخدام pcap.
يُعد uBPF مُفسِّرًا آخر يعمل في وضع المستخدم ، وهو يدعم JIT وeBPF (بدون cBPF). وقد أُعيد استخدام شفرته البرمجية لتوفير دعم eBPF في أنظمة غير لينكس. [ 15 ] يعتمد eBPF من مايكروسوفت على نظام ويندوز على uBPF ومُدقِّق PREVAIL الرسمي. [ 16 ] أما rBPF ، وهو نسخة مُعاد كتابتها من uBPF بلغة Rust، فتستخدمه منصة Solana blockchain كمحرك تنفيذ. [ 17 ]
برمجة
يُصدر برنامجٌ ما عادةً BPF الكلاسيكي من قاعدة نصية عالية المستوى تصف النمط المراد مطابقته. يوجد أحد هذه التمثيلات في مكتبة libpcap . [ 18 ] يمكن كتابة BPF الكلاسيكي وeBPF إما مباشرةً بلغة الآلة ، أو باستخدام لغة تجميع لتمثيل نصي. من أبرز المجمعات bpf_asmأداة نواة لينكس (cBPF)، bpfcو(cBPF)، ubpfوالمجمع (eBPF). bpftoolيمكن للأمر أيضًا أن يعمل كمفكك لكلا نوعي BPF. لغات التجميع ليست بالضرورة متوافقة مع بعضها البعض.
أصبح رمز البايت eBPF مؤخرًا هدفًا للغات البرمجة عالية المستوى. أضافت LLVM دعم eBPF في عام 2014، وتبعتها GCC في عام 2019. تتيح كلتا مجموعتي الأدوات ترجمة لغة C وغيرها من اللغات المدعومة إلى eBPF. كما يمكن ترجمة مجموعة فرعية من P4 إلى eBPF باستخدام BCC، وهي مجموعة أدوات ترجمة تعتمد على LLVM. [ 19 ]
حماية
يمكن لهجوم Spectre استغلال مُفسِّر eBPF أو مُجمِّع JIT في نواة لينكس لاستخراج البيانات من عمليات النواة الأخرى. [ 20 ] تعمل ميزة تقوية JIT في النواة على التخفيف من هذه الثغرة الأمنية. [ 21 ]
قالت مجموعة بانغو لاب الصينية لأمن الحاسوب إن وكالة الأمن القومي الأمريكية استخدمت برنامج BPF لإخفاء اتصالات الشبكة كجزء من باب خلفي معقد لنظام لينكس . [ 22 ]
انظر أيضاً
مراجع
- 1 2 ماكان، ستيفن؛ جاكوبسون، فان (1992-12-19). "مرشح حزم BSD: بنية جديدة لالتقاط الحزم على مستوى المستخدم" (ملف PDF) . مؤرشف (PDF) من الأصل بتاريخ 2009-04-19 . تم الاطلاع عليه بتاريخ 2009-05-25 .
- ↑ «تتبنى مايكروسوفت أداة eBPF الفائقة من نواة لينكس، وتوسع نطاقها لتشمل ويندوز» . ذا ريجستر . ١١ مايو ٢٠٢١. مؤرشف من الأصل في ١١ مايو ٢٠٢١.
- ↑ ماكان، ستيفن؛ جاكوبسون، فان (يناير 1993). "مرشح حزم BSD: بنية جديدة لالتقاط الحزم على مستوى المستخدم" . USENIX . مؤرشف من الأصل في 3 أغسطس 2020. تم الاسترجاع في 10 يونيو 2014 .
- ↑ "bpf(4) مرشح حزم بيركلي" . فري بي إس دي . 15-06-2010. مؤرشف من الأصل في 21-10-2020 . تم الاسترجاع في 10-06-2014 .
- ↑ واتسون، روبرت ن.م.؛ بيرون، كريستيان س.ج. (9 مارس 2007). "ملف BPF بدون نسخ" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 16 مايو 2008. تم الاطلاع عليه بتاريخ 29 يوليو 2008 .
- ↑ "نواة لينكس 3.18، القسم 1.3. استدعاء النظام bpf() لبرامج الآلة الافتراضية eBFP" . kernelnewbies.org . 7 ديسمبر 2014. مؤرشف من الأصل في 25 أكتوبر 2019. تم الاطلاع عليه في 6 سبتمبر 2019 .
- ↑ جوناثان كوربيت (24 سبتمبر 2014). "واجهة برمجة تطبيقات استدعاء نظام BPF، الإصدار 14" . LWN.net . مؤرشف من الأصل في 27 ديسمبر 2014. تم الاطلاع عليه في 19 يناير 2015 .
- ↑ جوناثان كوربيت (2 يوليو 2014). "توسيع نطاق BPF الممتد" . LWN.net . مؤرشف من الأصل في 24 أبريل 2019. تم الاطلاع عليه في 19 يناير 2015 .
- ↑ "نواة لينكس 3.19، القسم 11. الشبكات" . kernelnewbies.org . 8 فبراير 2015. مؤرشف من الأصل في 26 فبراير 2025. تم الاطلاع عليه في 13 أبريل 2025 .
- ↑ جوناثان كوربيت (10 ديسمبر 2014). "ربط برامج eBPF بالمآخذ" . LWN.net . مؤرشف من الأصل في 14 فبراير 2015. تم الاطلاع عليه في 13 فبراير 2015 .
- ↑ "نواة لينكس 4.1، القسم 11. الشبكات" . kernelnewbies.org . 21 يونيو 2015. مؤرشف من الأصل في 16 أكتوبر 2015. تم الاطلاع عليه في 17 أكتوبر 2015 .
- ↑ "دليل مرجعي لـ BPF وXDP" . cilium.readthedocs.io . 24 أبريل 2017. مؤرشف من الأصل في 24 أبريل 2018. تم الاطلاع عليه في 23 أبريل 2018 .
- ↑ "دليل مرجعي لـ BPF وXDP - وثائق Cilium 1.6.5" . docs.cilium.io . مؤرشف من الأصل بتاريخ 18-09-2020 . تم الاطلاع عليه بتاريخ 18-12-2019 .
- ↑ "bpf: تقديم الحلقات المحدودة" . git.kernel.org . ١٩ يونيو ٢٠١٩. مؤرشف من الأصل في ٢٠ أغسطس ٢٠٢٢. تم الاطلاع عليه في ١٩ أغسطس ٢٠٢٢ .
- ↑ "generic-ebpf/generic-ebpf" . جيت هاب . ٢٨ أبريل ٢٠٢٢. مؤرشف من الأصل في ٢٧ سبتمبر ٢٠٢٠. تم الاطلاع عليه في ٤ أغسطس ٢٠٢٠ .
- ↑ "microsoft/ebpf-for-windows: تطبيق eBPF يعمل على نظام ويندوز" . جيت هاب . مايكروسوفت. ١١ مايو ٢٠٢١. مؤرشف من الأصل في ١١ مايو ٢٠٢١. تم الاطلاع عليه في ١١ مايو ٢٠٢١ .
- ↑ "نظرة عامة | مستندات سولانا" . مؤرشف من الأصل بتاريخ 31 يناير 2022. تم الاطلاع عليه بتاريخ 31 يناير 2022 .
- ↑ "بنية BPF" . biot.com . مؤرشف من الأصل بتاريخ 14 أغسطس 2020. تم الاطلاع عليه بتاريخ 3 أغسطس 2020 .
- ↑ "التعمق في BPF: قائمة بمواد القراءة" . qmonnet.github.io . مؤرشف من الأصل بتاريخ 2019-10-02 . تم الاطلاع عليه بتاريخ 2020-08-04 .
- ↑ "قراءة الذاكرة المميزة باستخدام قناة جانبية" . فريق مشروع زيرو في جوجل . 3 يناير 2018. مؤرشف من الأصل في 1 أكتوبر 2019. تم الاطلاع عليه في 20 يناير 2018 .
- ↑ "bpf: تقديم إعداد BPF_JIT_ALWAYS_ON" . git.kernel.org . مؤرشف من الأصل بتاريخ 19-10-2020 . تم الاطلاع عليه بتاريخ 20-09-2021 .
- ↑ "تشريح ثغرة أمنية سرية تابعة لوكالة الأمن القومي الأمريكية، يُشتبه في أنها من الدرجة الأولى، ظلت مخفية لعقد من الزمن" . صحيفة ذا ريجستر . 23 فبراير 2022. مؤرشف من الأصل في 23 فبراير 2022. تم الاطلاع عليه في 24 فبراير 2022 .
للمزيد من القراءة
- ماكان، ستيفن؛ جاكوبسون، فان (1992-12-19). "مرشح حزم BSD: بنية جديدة لالتقاط الحزم على مستوى المستخدم" (PDF) .
روابط خارجية
- – دليل واجهات نواة FreeBSD – مثال على BPF التقليدي
- bpfc، وهو مُجمِّع Berkeley Packet Filter، ومفكِّك Linux BPF JIT (جزء من netsniff-ng)
- وثائق BPF ، لنواة لينكس
- وثائق مرشحات لينكس ، لكل من تنسيقات بايت كود cBPF و eBPF
- برامج الشبكات القائمة على بروتوكول الإنترنت
- الحزم (تكنولوجيا المعلومات)
