توليد حركة مرور الفضاء المستخدم


توليد حركة المرور باستخدام MoonGen + DPDK + Lua في عرض الفنان

يتطلب تحييد هجمات DDoS في ظروف حقيقية اختبارًا أوليًا واختبارًا لتقنيات مختلفة. يجب اختبار معدات وبرامج الشبكة في ظروف اصطناعية قريبة من الظروف الحقيقية - مع تدفقات حركة المرور المكثفة التي تحاكي الهجمات. بدون مثل هذه التجارب ، من الصعب للغاية الحصول على معلومات موثوقة حول الميزات والقيود المحددة لأي أداة معقدة.

في هذه المقالة ، سنكشف عن بعض طرق توليد حركة المرور المستخدمة في مختبرات Qrator.

تحذير

نوصي بشدة ألا يحاول القارئ استخدام الأدوات المذكورة لمهاجمة كائنات البنية التحتية الحقيقية. يُعاقب على تنظيم هجمات DoS بموجب القانون ويمكن أن يؤدي إلى عقوبات شديدة. تجري مختبرات Qrator جميع الاختبارات في بيئة معملية معزولة.

المستوى الفني الحديث


تتمثل المهمة المهمة في منطقتنا في إشباع واجهة إيثرنت 10G بحزم صغيرة ، مما يعني معالجة 14.88 ميجابت في الثانية (ملايين الحزم في الثانية). فيما يلي ، نعتبر أصغر حزم شبكة Ethernet - 64 بايت - لأن مصلحتنا الرئيسية هي زيادة عدد الحزم المرسلة إلى أقصى حد لكل وحدة زمنية. يظهر حساب بسيط أنه ليس لدينا سوى حوالي 67 نانو ثانية لمعالجة حزمة واحدة.

للمقارنة فقط ، هذه المرة قريبة من ما يحتاجه المعالج الحديث للحصول على جزء من البيانات من الذاكرة إذا فاتته ذاكرة التخزين المؤقت. يصبح كل شيء أكثر تعقيدًا عندما نبدأ العمل مع واجهات 40G و 100 G Ethernet ومحاولة تشبعهم بالكامل حتى معدل الخط (أقصى أداء معلن ممكن لجهاز الشبكة).

نظرًا لأنه في الحالة المعتادة ، يمر تدفق البيانات من خلال التطبيق في مساحة المستخدم (مساحة المستخدمين) ، ثم من خلال النواة ، وأخيرًا الدخول إلى وحدة تحكم الشبكة (NIC) ، فإن الفكرة الأولى والأكثر مباشرة هي محاولة تكوين تكوين الحزم مباشرة في النواة. مثال على هذا الحل هو الوحدة النووية pktgen [2]. تسمح لك هذه الطريقة بتحسين الأداء بشكل كبير ، ولكنها ليست مرنة بما فيه الكفاية ، حيث أن أدنى تغيير في شفرة المصدر في النواة يؤدي إلى دورة بناء طويلة ، وإعادة تشغيل وحدات النواة أو حتى النظام بأكمله ، وفي الواقع ، الاختبار ، مما يقلل من الإنتاجية الإجمالية (أي أنه يتطلب المزيد من الوقت من المبرمج والجهد).

نهج آخر محتمل هو الحصول على وصول مباشر من مساحة المستخدمين إلى مخازن ذاكرة وحدة تحكم الشبكة. هذا المسار أكثر تعقيدًا ، ولكنه يستحق الجهد لتحقيق إنتاجية أعلى. تشمل المساوئ التعقيد العالي والمرونة المنخفضة. أمثلة على هذا الأسلوب هي netmap و PF_RING و DPDK [4].

طريقة أخرى فعالة ، وإن كانت مكلفة للغاية لتحقيق أداء عالٍ ، هي استخدام معدات غير عالمية ، ولكن متخصصة. مثال: Ixia .

هناك أيضًا حلول تستند إلى DPDK باستخدام البرامج النصية ، مما يزيد من المرونة في التحكم في معلمات المولد ، ويسمح لك أيضًا بتغيير نوع الحزم التي تم إنشاؤها أثناء بدء التشغيل. فيما يلي وصف لتجربتنا الخاصة مع واحدة من هذه الأدوات - MoonGen.

هندسة MoonGen


السمات المميزة لـ MoonGen هي:

  1. إن معالجة بيانات DPDK في مساحة المستخدمين هي السبب الرئيسي لزيادة الأداء ؛
  2. مكدس Lua [ 5 ] مع نصوص بسيطة في المستوى الأعلى وربط مكتبة DPDK المكتوبة في C ، في الأسفل ؛
  3. بفضل تقنية JIT (في الوقت المناسب) ، تعمل النصوص البرمجية لوا بسرعة كافية ، والتي تتناقض إلى حد ما مع الأفكار المقبولة عمومًا حول فعالية لغات البرمجة النصية.

يمكن اعتبار MoonGen كغلاف لوا حول مكتبة DPDK. تظهر عمليات DPDK التالية على الأقل على مستوى واجهة مستخدم Lua:

  • تكوين وحدات تحكم الشبكة ؛
  • التخصيص والوصول المباشر إلى التجمعات والمخازن المؤقتة للذاكرة ، والتي ، لأغراض التحسين ، يجب تخصيصها في مناطق محاذاة مستمرة ؛
  • الوصول المباشر إلى قوائم انتظار RSS لوحدات تحكم الشبكة ؛
  • API لإدارة التدفقات الحسابية ، مع مراعاة عدم تجانس الوصول إلى الذاكرة (تقارب NUMA و CPU) [ 12 ].



العمارة MoonGen ، مخطط من المواد [ 1 ].

مونغين


MoonGen هو مولد حزم عالي السرعة مكتوب على أساس مكتبة DPDK. تتحكم البرامج النصية لـ Lua في العملية بأكملها: فالبرنامج النصي الذي ينشئه المستخدم مسؤول عن إنشاء وتعديل وإرسال الحزم. بفضل مكتبة معالجة الحزم LuaJIT و DPDK السريعة جدًا ، تتيح لك هذه البنية تشبع واجهة إيثرنت بسرعة 10 جيجابت مع حزم 64 بايت باستخدام نواة واحدة فقط من وحدة المعالجة المركزية. يسمح لك MoonGen بتحقيق هذه السرعة حتى عندما يعدل برنامج Lua النصي كل حزمة. لا يستخدم الحيل مثل إعادة استخدام نفس المخزن المؤقت لوحدة تحكم الشبكة.

يمكن لـ MoonGen أيضًا تلقي الحزم ، أي التحقق من الحزم التي تم إسقاطها بواسطة النظام قيد الاختبار. نظرًا لأنه يتم التحكم في استقبال الحزم بشكل حصري من خلال نص برمجي مخصص لـ Lua ، فيمكن استخدامه أيضًا لإنشاء نصوص اختبار أكثر تعقيدًا. على سبيل المثال ، يمكنك استخدام مثيلين من MoonGen لإنشاء اتصال مع بعضها البعض. يمكن استخدام هذا التكوين ، على وجه الخصوص ، لاختبار ما يسمى الصناديق الوسطى (المعدات بين نقطة إرسال واستقبال حركة المرور) ، على سبيل المثال ، الجدران النارية. يركز MoonGen على أربعة مجالات رئيسية:

  • أداء عالي وتطور متعدد النوى: أكثر من 20 مليون حزمة في الثانية على وحدة معالجة مركزية واحدة ؛
  • المرونة: يتم إنشاء كل حزمة في الوقت الفعلي بناءً على برنامج Lua النصي الذي أنشأه المستخدم ؛
  • الطوابع الزمنية الدقيقة: على الأجهزة (السلع) العادية ، يتم وضع علامة على الوقت بدقة ميلي ثانية ؛
  • التحكم الدقيق في الفترات الفاصلة بين الحزم المرسلة: إنشاء موثوق للأنماط وأنواع الحركة المطلوبة على الأجهزة العادية.

DPDK


DPDK هي اختصار لـ Data Plane Development Kit وتتكون من المكتبات التي تتمثل وظائفها الرئيسية في زيادة أداء توليد حزم الشبكة على مجموعة واسعة من معماريات المعالج المركزي.

في عالم أصبحت فيه شبكات الكمبيوتر أساس التواصل البشري ، أصبح الأداء وعرض النطاق الترددي وزمن الانتقال معلمات مهمة بشكل متزايد لأنظمة مثل الشبكات اللاسلكية والبنية التحتية للكابلات ، بما في ذلك جميع مكوناتها الفردية: أجهزة التوجيه وموازنات التحميل وجدران الحماية ؛ بالإضافة إلى مجالات التطبيق: نقل الوسائط (الدفق) ، VoIP ، إلخ.

DPDK هي طريقة خفيفة الوزن ومريحة لبناء الاختبارات والنصوص. نقل البيانات داخل مساحة المستخدمين هو شيء لا نلاحظه كثيرًا ، ويرجع ذلك أساسًا إلى أن معظم التطبيقات تتواصل مع معدات الشبكة من خلال نظام التشغيل ومكدس النواة ، وهو عكس نموذج DPDK.

لوا


الغرض الرئيسي من وجود Lua هو توفير أدوات تعبيرية بسيطة ومرنة قابلة للتوسيع لمهام حالية محددة ، بدلاً من مجموعة من البدائية المطبقة في نموذج برمجة واحد فقط. ونتيجة لذلك ، فإن اللغة الأساسية خفيفة للغاية - لا يستغرق المترجم بأكمله 180 كيلوبايت إلا في شكل مترجم ويتكيف بسهولة مع مجموعة واسعة من التطبيقات الممكنة.

لوا هي لغة ديناميكية. إنه مضغوط للغاية بحيث يمكن وضعه على أي جهاز تقريبًا. يدعم Lua مجموعة صغيرة من الأنواع: القيم المنطقية والأرقام (النقطة العائمة المزدوجة الدقة) والسلاسل. يمكن تمثيل هياكل البيانات التقليدية ، مثل المصفوفات والمجموعات والقوائم ، من خلال بنية البيانات المضمنة الوحيدة في Lua - وهو جدول ، وهو عبارة عن مجموعة ترابطية غير متجانسة.

تستخدم Lua تجميع JIT (في الوقت المناسب) ، وبالتالي ، كونها لغة برمجة نصية ، فإنها تعرض أداءً مشابهًا للغات المترجمة مثل C [ 10 ]

لماذا مونغين


كشركة متخصصة في تحييد هجمات DDoS ، تحتاج مختبرات Qrator إلى طريقة موثوقة لإنشاء حلول الأمان الخاصة بها وترقيتها واختبارها. من أجل الاختبار الأخير ، هناك حاجة إلى طرق مختلفة لتوليد حركة المرور التي تحاكي الهجمات الحقيقية. ومع ذلك ، ليس من السهل محاكاة هجوم فيضان خطير ، لكنه مباشر ، عند 2-3 مستويات من نموذج OSI ، ويرجع ذلك أساسًا إلى الصعوبات في تحقيق أداء عالي في توليد الحزم.

بعبارة أخرى ، بالنسبة لشركة تعمل على التوافر المستمر وإبطال مفعول DDoS ، فإن محاكاة هجمات DoS المختلفة في بيئة مختبرية منعزلة هي طريقة لفهم كيفية تصرف المعدات المختلفة التي تعد جزءًا من مجمعات أجهزة الشركة في الواقع.

تعد MoonGen طريقة جيدة لتوليد قيم حركة المرور قريبة من الحد الأقصى لوحدة تحكم الشبكة بحد أدنى من نوى وحدة المعالجة المركزية. يعمل نقل البيانات داخل مساحة المستخدمين على تحسين أداء المكدس المعني بشكل ملحوظ (MoonGen + DPDK) ، مقارنة بالعديد من الخيارات الأخرى لتوليد قيم عالية لحركة المرور. يتطلب استخدام DPDK الخالص مزيدًا من الجهد ، لذلك لا يجب أن تفاجأ برغبتنا في تحسين الأداء. ندعم أيضًا استنساخًا [ 7 ] لمستودع MoonGen الأصلي من أجل توسيع وظائف وتنفيذ اختباراتنا الخاصة.

من أجل تحقيق أقصى قدر من المرونة ، يتم تعيين منطق إنشاء الحزم من قبل المستخدم باستخدام برنامج Lua النصي ، وهو أحد الميزات الرئيسية لـ MoonGen. في حالة معالجة الحزم البسيطة نسبيًا ، يعمل هذا الحل بسرعة كافية لإشباع واجهة 10G على وحدة معالجة مركزية واحدة. من الطرق المعتادة لتعديل الحزم الواردة وإنشاء حزم جديدة العمل مع الحزم من نفس النوع ، والتي تتغير فيها بعض الحقول فقط.

ومن الأمثلة على ذلك اختبار l3-tcp-syn-ack-الفيضانات الموصوف أدناه. لاحظ أنه يمكن إجراء أي تعديل على الحزمة في نفس المخزن المؤقت ، حيث اتضح أن الحزمة التي تم إنشاؤها أو استلامها في الخطوة السابقة. في الواقع ، يتم تنفيذ تحويلات الحزم هذه بسرعة كبيرة ، نظرًا لأنها لا تنطوي على عمليات باهظة الثمن ، مثل مكالمات النظام ، والوصول إلى أقسام الذاكرة غير المخزنة مؤقتًا ، وما شابه ذلك.

الاختبارات على أجهزة مختبرات Qrator


تجري مختبرات Qrator جميع الاختبارات في المختبر على معدات مختلفة. في هذه الحالة ، استخدمنا وحدات تحكم واجهة الشبكة التالية:

  • انتل 82599ES 10G
  • Mellanox ConnectX-4 40G
  • Mellanox ConnectX-5100G

نلاحظ بشكل منفصل أنه عند العمل مع وحدات تحكم الشبكة التي تعمل على معايير أعلى من 10G ، تصبح مشكلة الأداء أكثر حدة. اليوم ليس من الممكن تشبع واجهة 40G بنواة واحدة ، على الرغم من أن هذا العدد واقعي مع عدد قليل من النوى.

في حالة وحدات التحكم بالشبكة المصنعة بواسطة Mellanox ، من الممكن تغيير بعض المعلمات وإعدادات الجهاز باستخدام دليل الموالفة [ 3 ] المقدم من قبل الشركة المصنعة. هذا يسمح لك بزيادة الأداء ، وفي بعض الحالات الخاصة ، لتعميق سلوك NIC. قد يكون لدى الشركات المصنعة الأخرى مستندات مماثلة لأجهزتها عالية الأداء المخصصة للاستخدام المهني. حتى إذا لم تتمكن من العثور على مثل هذا المستند في المجال العام ، فمن المنطقي دائمًا الاتصال بالشركة المصنعة مباشرة. في حالتنا ، كان ممثلو Mellanox طيبون للغاية ، بالإضافة إلى توفير الوثائق ، أجابوا بسرعة على أسئلتنا ، والتي تمكننا من تحقيق 100 ٪ من الشريط ، وهو أمر مهم جدًا بالنسبة لنا.

اختبار الفيضان TCP SYN


L3-tcp-syn-ack -فيض هو مثال لمحاكاة هجوم مثل فيضان SYN [ 6 ]. هذه نسخة موسعة من Qrator Labs لاختبار l3-tcp-syn-الفيضانات من مستودع MoonGen الرئيسي ، والذي يتم تخزينه في استنساخ المستودع الخاص بنا.

يمكن أن يقوم اختبارنا بإجراء ثلاثة أنواع من العمليات:

  1. إنشاء دفق حزم TCP SYN من البداية ، وتغيير الحقول المطلوبة ، مثل عنوان IP المصدر ورقم منفذ المصدر ، إلخ.
  2. إنشاء استجابة ACK صالحة لكل حزمة SYN مستلمة وفقًا لـ TCP ؛
  3. قم بإنشاء استجابة SYN-ACK صالحة لكل حزمة ACK مستلمة وفقًا لبروتوكول TCP.

على سبيل المثال ، حلقة التعليمات البرمجية الداخلية (على التوالي ، "الأكثر سخونة") لإنشاء استجابات ACK هي كما يلي:

local tx = 0 local rx = rxQ:recv(rxBufs) for i = 1, rx do local buf = rxBufs[i] local pkt = buf:getTcpPacket(ipv4) if pkt.ip4:getProtocol() == ip4.PROTO_TCP and pkt.tcp:getSyn() and (pkt.tcp:getAck() or synack) then local seq = pkt.tcp:getSeqNumber() local ack = pkt.tcp:getAckNumber() pkt.tcp:unsetSyn() pkt.tcp:setAckNumber(seq+1) pkt.tcp:setSeqNumber(ack) local tmp = pkt.ip4.src:get() pkt.ip4.src:set(pkt.ip4.dst:get()) pkt.ip4.dst:set(tmp) … -- some more manipulations with packet fields tx = tx + 1 txBufs[tx] = buf end end if tx > 0 then txBufs:resize(tx) txBufs:offloadTcpChecksums(ipv4) -- offload checksums to NIC txQ:send(txBufs) end 

الفكرة العامة لإنشاء حزمة استجابة هي كما يلي. أولاً ، تحتاج إلى إزالة الحزمة من قائمة انتظار RX ، ثم تحقق مما إذا كان نوع الحزمة يتطابق مع النوع المتوقع. في حالة الصدفة ، قم بإعداد إجابة بتعديل بعض مجالات الحزمة الأصلية. أخيرًا ، ضع الحزمة التي تم إنشاؤها في قائمة انتظار TX باستخدام نفس المخزن المؤقت. لتحسين الأداء ، بدلاً من أخذ الحزم واحدة تلو الأخرى وتعديلها واحدة تلو الأخرى ، نقوم بتجميعها واستخراج جميع الحزم المتاحة من قائمة انتظار RX وإنشاء الردود المقابلة ووضعها جميعًا في قائمة انتظار TX. على الرغم من وجود عدد كبير إلى حد ما من التلاعب في حزمة واحدة ، إلا أن الأداء لا يزال مرتفعًا ، ويرجع ذلك أساسًا إلى حقيقة أن Lua JIT تقوم بتجميع كل هذه العمليات في عدد صغير من تعليمات المعالج. تعمل العديد من الاختبارات الأخرى ، ليس فقط TCP SYN / ACK ، على نفس المبدأ.

يوضح الجدول أدناه نتائج اختبار الفيضان SYN (توليد SYN بدون محاولات استجابة) باستخدام Mellanox ConnectX-4. يحتوي NIC هذا على منفذين 40G بسقف أداء نظري يبلغ 59.52 Mpps على منفذ واحد و 2 * 50 Mpps لمنفذين. يحد التطبيق المحدد لربط NIC بـ PCIe إلى حد ما من عرض النطاق الترددي (إعطاء 2 * 50 بدلاً من 2 * 59.52 المتوقع).
النوى لكل منفذمنفذ واحد ، Mppsمنفذين ، Mpps لكل منفذ
12019
23836
356.547
459.550

اختبار الفيضانات SYN. NIC: عائلة Mellanox Technologies MT27700 (ConnectX-4) ، منفذ 40G مزدوج ؛ وحدة المعالجة المركزية: Intel® Xeon® Silver 4114 CPU @ 2.20GHz

يوضح الجدول التالي نتائج نفس اختبار الفيضان SYN الذي تم إجراؤه على Mellanox ConnectX-5 بمنفذ 100G واحد.
النوىMpps
135
269
3104
4127
5120
6131
7132
8144

اختبار الفيضانات SYN. NIC: عائلة Mellanox Technologies MT27800 (ConnectX-5) ، منفذ واحد 100G ؛ وحدة المعالجة المركزية: Intel® Xeon® Silver 4114 CPU @ 2.20GHz

لاحظ أنه في جميع الحالات نحقق أكثر من 96٪ من سقف الأداء النظري على عدد صغير من نوى المعالج.

التقاط حركة المرور الواردة وحفظها في ملفات PCAP


مثال آخر على الاختبار هو rx-to-pcap ، الذي يحاول التقاط جميع حركة المرور الواردة وحفظها على عدد معين من ملفات PCAP [ 8 ]. على الرغم من أن هذا الاختبار لا يتعلق على وجه التحديد بإنشاء الحزم على هذا النحو ، إلا أنه بمثابة دليل على حقيقة أن أضعف رابط في تنظيم نقل البيانات من خلال مساحة المستخدمين هو نظام الملفات. حتى نظام الملفات الظاهري tmpfs يبطئ الدفق بشكل ملحوظ. في هذه الحالة ، هناك حاجة إلى 8 نوى من المعالج المركزي لاستخدام 14.88 ميجابت في الثانية ، في حين أن نواة واحدة فقط تكفي لتلقي (وإعادة تعيين أو إعادة توجيه) نفس مقدار حركة المرور.

يوضح الجدول التالي مقدار حركة المرور (في Mpps) التي تم استلامها وحفظها في ملفات PCAP الموجودة في نظام الملفات ext2 على SSD (العمود الثاني) أو على نظام ملفات tmpfs (العمود الثالث).
النوىعلى SSD ، Mppsعلى tmpfs ، Mpps
11.481.62
244.6
36.948.1
49.7511.65
512.113.8
613.3814.47
714.414.86
814.8814.88

اختبار Rx-to-pcap ؛ NIC: Intel 82599ES 10-Gigabit ؛ المعالج: Intel® Xeon® CPU E5-2683 v4 @ 2.10GHz

تعديل MoonGen: tman Task Manager


نود أيضًا أن نقدم للقارئ امتدادنا الخاص لوظيفة MoonGen ، والتي توفر طريقة أخرى لبدء مجموعة من المهام للاختبار. الفكرة الرئيسية هنا هي فصل التكوين العام والإعدادات الخاصة بكل مهمة ، مما يسمح لك بتشغيل عدد عشوائي من المهام المختلفة (مثل البرامج النصية لوا) في نفس الوقت. في نسختنا من مستودع MoonGen ، يتم تقديم تنفيذ MoonGen مع مدير المهام [ 9 ] ، وهنا سنذكر بإيجاز وظائفه الرئيسية فقط.

تتيح لك واجهة سطر الأوامر الجديدة تشغيل مهام متعددة من أنواع مختلفة في نفس الوقت. السيناريو الأساسي كما يلي:

 ./build/tman [tman options...] [-- <task1-file> [task1 options...]] [-- <task2-file> [task2 options...]] [-- ...] 

بالإضافة إلى ./build/tman -h يقدم المساعدة التفصيلية.

ومع ذلك ، هناك قيود - ملفات مهمة Lua العادية غير متوافقة مع واجهة tman . يجب أن يحدد ملف مهمة tman بوضوح الكائنات التالية:

  • الدالة config (parser) التي تصف معلمات المهمة ؛
  • دالة المهمة (taskNum ، txInfo ، rxInfo ، args) ، التي تصف عملية المهمة الفعلية. هنا txInfo و rxInfo صفائف RX و TX قوائم الانتظار على التوالي؛ يحتوي args على معلمات مدير المهام والمهمة نفسها.
  • يمكن العثور على أمثلة في الأمثلة / tman.

يمنحك استخدام مدير المهام مرونة أكبر في إجراء الاختبارات غير المتجانسة.

الاستنتاجات


تبين أن الطريقة التي تقدمها MoonGen تتناسب تمامًا مع أهدافنا وترضي الموظفين بالنتائج التي تم الحصول عليها. لقد حصلنا على أداة ذات أداء عالي ، مع الحفاظ على بيئة الاختبار واللغة بكل بساطة. يتم تحقيق الأداء العالي لهذا الإعداد بفضل ميزتين رئيسيتين: الوصول المباشر إلى مخازن وحدة تحكم واجهة الشبكة وتقنية التجميع Just-In-Time في Lua.

كقاعدة ، يعد تحقيق سقف نظري لأداء وحدة تحكم واجهة الشبكة مهمة مجدية. كما أظهرنا ، قد يكون نواة واحدة كافية لإشباع منفذ 10G ، بينما مع عدد أكبر من النوى ، لا يمثل الحمل الكامل لمنفذ 100G مشكلة.

نحن ممتنون بشكل خاص لفريق Mellanox لمساعدتهم في معداتهم وفريق MoonGen لرد فعلهم على تصحيح الأخطاء.

المواد


  1. MoonGen: مولد حزم عالي السرعة قابل للبرمجة - Paul Emmerich et al. ، مؤتمر قياس الإنترنت 2015 (IMC'15) ، 2015
  2. بكتجن
  3. دليل ضبط Mellanox
  4. مجموعة تطوير طائرة البيانات
  5. لوا
  6. الفيضانات سين
  7. استنساخ Qrator Labs لمستودع MoonGen
  8. تنسيق ملف PCAP
  9. مدير المهام
  10. أداء لوا
  11. وظائف الشبكة الافتراضية
  12. NUMA ، وصول إلى ذاكرة غير موحدة

Source: https://habr.com/ru/post/ar423957/


All Articles