بنية نظام لكشف التسلل إلى الشبكة
تحليل بروتوكولات متعدد الطبقات، وقواعد مستوحاة من Snort، وكشف تهديدات ذو حالة؛ تحليل 500K+ حزمة/ثانية بخيط واحد وبحزم SYN اصطناعية.
مسار معالجة IDS
تتبع أنظمة كشف التسلل التجارية مثل Snort وSuricata بنية مشتركة: التقاط → تحليل → كشف → تنبيه. ينفّذ SentinelFlow هذا المسار كاملًا باستخدام C++17 وlibpcap، ويحلّل 500K+ حزمة/ثانية بخيط واحد.
الالتقاط: تعمل مرشحات BPF في مساحة النواة
يستخدم SentinelFlow مكتبة libpcap مع واجهة PacketCapture متعددة الأشكال: LiveCapture للتدفق الحي وPcapFileReader للتحليل دون اتصال. التحسين الحاسم هو BPF؛ يُترجم تعبير مثل tcp port 80 باستخدام pcap_compile() ويعمل داخل النواة. لا تُنسخ الحزم غير المطابقة إلى مساحة المستخدم، وهو أكثر كفاءة بكثير من الترشيح في كود التطبيق.
تحليل البروتوكولات على طبقات
إطارات الشبكة هياكل متداخلة. لا يمكن القفز إلى إزاحة بايت ثابتة لأن طول كل طبقة متغير:
- Ethernet (14 بايت)، يوجّه
ntohsعلى EtherType إلى IPv4 (0x0800) أو ARP (0x0806) - IPv4، يحدد حقل IHL بداية L4؛ ويتغير الطول بسبب خيارات IP.
- TCP، يحدد حقل
data_offsetبداية الحمولة؛ ويتغير الطول بسبب خيارات TCP. - UDP (8 بايت)، ترويسة ثابتة، لكن تحليل DNS يبدأ مشروطًا عندما يكون المنفذ 53
- DNS، يعبر أسماء الاستعلامات المرمّزة بتسميات، وهي مقاطع يسبقها طولها
- ICMP / ARP، رموز الأنواع والعناوين العتادية
كل محلّل دالة مستقلة عديمة الحالة تعمل على const uint8_t* الخام؛ دون نسخ أو تخصيص. تستخدم بنية ParsedPacket نوع std::optional<T> لكل طبقة: عند فشل التحليل أو غياب البروتوكول يبقى الحقل فارغًا وتُتجاوز الطبقات التالية.
محرّك قواعد مستوحى من Snort
ينفّذ SentinelFlow جزءًا من لغة قواعد Snort، المعيار الشائع للكشف المعتمد على التوقيعات:
alert tcp any any -> any 22 (msg:"SSH brute force"; flags:S; threshold:10,60; sid:2001;)القواعد وصفية. تعمل الترويسة كمرشح أولي سريع للبروتوكول وIP والمنفذ، بينما تدقق الخيارات المطابقة: أقنعة بتات الرايات، ونصوص الحمولة، وحدود طول استعلام DNS. يستخرج محلّل القواعد هذه العناصر إلى كائنات منظمة لتقييم كل حزمة بواسطة مطابق التوقيعات.
الكشف ذو الحالة والكشف عديم الحالة
تكشف مطابقة التوقيعات الأنماط الخبيثة المعروفة داخل الحزمة المنفردة. لكن كثيرًا من الهجمات الفعلية تتوزع على حزم متعددة:
- مسح المنافذ: لا يظهر إلا عند تتبع منافذ الوجهة لكل IP مصدر عبر الزمن. يحتفظ SentinelFlow بـ
std::set<uint16_t>لكل زوج IP، ويطلق تنبيهًا عند استهداف 15+ منفذًا فريدًا خلال 60 ثانية. - إغراق SYN: يُكشف بمراقبة معدل الاتصالات نصف المفتوحة. يحتفظ
std::dequeبطوابع SYN لكل IP وجهة، مع حذف البيانات القديمة عند الوصول. العتبة 100+ SYN خلال 10 ثوانٍ. - أنفاق DNS: ينتج تسريب البيانات عبر الاستعلامات المرمّزة أسماء طويلة بصورة غير طبيعية. يتتبع الكاشف الاستعلامات التي تتجاوز 50 محرفًا، ويطلق تنبيهًا عند تجاوز حجمها العتبة.
تستخدم جميع الكواشف ذات الحالة نوافذ زمنية منزلقة مع حذف مؤجل عند الوصول. تُزال المدخلات القديمة في الوصول التالي بدلًا من خيط خلفي، مما يلغي كلفة المزامنة.
أداء التحليل دون نسخ
تعمل المحلّلات مباشرة على مخزن libpcap الخام، دون نسخ وسيط أو تخصيص ديناميكي لكل حزمة. نمط memcpy + ntohs/ntohl شائع في معالجة الحزم عالية الأداء، كما في DPDK وPF_RING وNIDS التشغيلية. يثبت الاختبار 500K+ حزمة/ثانية بخيط واحد؛ وهذا معدل تحليل خالص مقاس على حزم TCP SYN اصطناعية.
مخرجات التنبيه
يستخدم نظام التنبيه نمط الاستراتيجية؛ يرسل AlertManager كل تنبيه إلى جميع المخرجات المسجّلة:
- وحدة التحكم: ألوان ANSI حسب الشدة (أخضر → أصفر → أحمر → أحمر بارز)
- CSV: متوافق مع RFC 4180 مع تهريب صحيح للمحارف، وجاهز للإدخال إلى SIEM
إضافة مخرج جديد مثل syslog أو webhook أو Kafka تتطلب تنفيذ دالة emit() واحدة.