
نظام كشف حركة المرور الخبيثة في الوقت الفعلي باستخدام القوائم السوداء العامة، وآثار البرمجيات الخبيثة الثابتة، والتحليل الاستدلالي لتحديد التهديدات عبر حركة مرور DNS وHTTP وIP.

Maltrail هو نظام لكشف حركة مرور الشبكة يحدد الاتصال ببنية تحتية خبيثة معروفة ويبلّغ عن حالات شاذة محددة في حركة المرور. وهو يطابق النطاقات وعناوين URL وعناوين IP وأزواج IP:port وقيم User-Agent المرصودة على الشبكة مقابل مجموعة من المؤشرات تُسمى trails.
يُسجَّل الكشف كحدث واحد يحتوي على المصدر والوجهة والبروتوكول وtrail المطابق والتصنيف ومصدر trail:```text "2026-08-07 09:14:22.117034" gw 10.13.13.2 57809 1.1.1.1 53 UDP DNS malware.bakewithdavid.com "asyncrat (malware)" (static)
تم تصميم Maltrail لمراقبة الشبكة القائمة على المؤشرات. تكشف اكتشافاته الاستدلالية عن مسار المطابقة، لكنه ليس بديلاً عن القياس عن بُعد لنقاط النهاية أو نظام منع التسلل العام.
## الميزات
- بناء مسار كامل يجمع أكثر من 3,000 ملف ثابت مضمّن، و42 تكاملًا مع خلاصات عامة، ومسارات اختيارية يوفّرها المشغّل.
- مستشعر Rust متعدد الخيوط يستخدم libpcap، مع عمال التقاط Linux `PACKET_FANOUT` الاختياريين.
- خادم Python يوفّر واجهة التقارير، واستقبال الأحداث، وواجهة HTTP API.
- مسارات وقوائم بيضاء مخصّصة بنص عادي يمكن مراجعتها والتحكم في إصداراتها.
- استدلالات للفحص، واستنزاف DNS، وعمليات البحث الشبيهة بـ DGA، والتنزيلات المشبوهة، وفحوص الوكيل، وقيم User-Agent المشبوهة، والنشاط الشبكي ذي الصلة.
- تسجيل الأحداث محليًا، وتسجيل Maltrail عن بُعد، وCEF عبر syslog، وإخراج Logstash JSON.
- التحقق من صحة النشر باستخدام `maltrail-sensor -T` ومقاييس Prometheus الاختيارية.
## المحتويات
- [البنية](#architecture)
- [واجهة التقارير](#reporting-interface)
- [الأداء](#performance)
- [التثبيت](#installation)
- [المثبّت](#installer)
- [البناء من المصدر](#building-from-source)
- [Systemd](#systemd)
- [Docker](#docker)
- [الإعداد](#configuration)
- [المسارات](#trails)
- [الأحداث وواجهة API](#events-and-api)
- [العمليات](#operations)
- [المراقبة](#monitoring)
- [الاحتفاظ بالأحداث](#event-retention)
- [التوثيق](#documentation)
- [المساهمة](#contributing)
- [المشروع](#project)
- [الترخيص](#license)
- [المشرفون](#maintainers)
- [الرعاة](#sponsors)
- [العروض والمنشورات](#presentations-and-publications)
- [القائمة السوداء المشتقة](#derived-blacklist)
- [تكاملات الطرف الثالث](#third-party-integrations)
- [شكر وتقدير](#acknowledgements)
## البنية
يتكوّن Maltrail من عمليتين مستقلتين قد تعملان على نفس المضيف أو على مضيفين منفصلين:```text
┌──────────┐ events (UDP or file) ┌──────────┐
│ sensor │ ───────────────────────► │ server │ ◄── browser
└──────────┘ └──────────┘
Rust Python
libpcap + PACKET_FANOUT reporting UI + API
trail matching + heuristics
يقوم المستشعر بالتقاط حركة المرور، وإجراء مطابقة المسار والتحليل الاستكشافي، وإنتاج الأحداث.
يمكنه كتابة الأحداث محليًا (LOG_DIR)، أو إرسالها إلى خادم Maltrail بعيد (LOG_SERVER)، أو القيام
بكليهما. يمكنه أيضًا إصدار CEF عبر syslog (SYSLOG_SERVER) وJSON إلى Logstash
(LOGSTASH_SERVER).
يستقبل الخادم الأحداث البعيدة ويخزّنها، ويقدّم سجلات الأحداث المتاحة محليًا، ويوفّر واجهة الويب وواجهة API.
يتضمّن Maltrail واجهة إبلاغ تعمل في المتصفح لاستكشاف حركة المرور المكتشفة، مع تحديثات مباشرة، وبحث واعٍ بالحقول، وبحث استرجاعي، وعروض جغرافية، وفرز، وعروض محفوظة، وتصدير.

تُقدَّم الواجهة بواسطة server.py على HTTP_ADDRESS:HTTP_PORT. وهي JavaScript خالصة مع
اعتماد واحد فقط على وقت التشغيل من طرف ثالث (PapaParse، لتحليل CSV) وبدون خطوة بناء. يُعرض يوم
واحد في كل مرة، يُختار عبر منتقي تاريخ يعمل أيضًا كشبكة كثافة الأحداث على
السجلات اليومية المتاحة. تُبَثّ الأحداث من /events وتُجمَّع في المتصفح إلى
تهديدات — صف واحد لكل (source, trail) مميّز — تُعرض في شبكة قابلة للفرز مع لوحة تفاصيل.
| الميزة | ملاحظات |
|---|---|
| الوضع المباشر | تُدفع الأحداث المُضافة عبر Server-Sent Events (/live) وتُدمج في العرض الحالي. يتراجع إلى استقصاء نطاقات البايتات من السجل اليومي عند عدم توفر SSE، أو للجلسات التي لا تستطيع البث خدمتها. يمكن للتهديدات الجديدة عالية الخطورة إطلاق إشعار سطح مكتب وتنبيه صوتي؛ ويمكن كتم كليهما |
| البحث | رموز محدّدة النطاق بالحقول (src: dst: port: proto: type: trail: info: family: tag: uid: sev: dir: status:؛ family:interlock يجلب interlock-1/-2، وهي الأجزاء التي يصل إليها تفريغ تغذية واحدة مقسّمًا) مع دمج المسافة كـ AND، و- للاستبعاد، وبدائل *، وCIDR (src:10.0.0.0/8)، ونطاقات رقمية ومقارنات (port:>1024، count:>=100). تظهر المرشّحات النشطة كشرائح قابلة للإزالة |
| البحث الاسترجاعي | يبحث في جميع السجلات اليومية المحتفظ بها عن مؤشر واحد (/hunt)، وليس فقط في اليوم المعروض. محدود بحدّ أقصى لعدد الأيام، وميزانية زمنية فعلية، وسقف للعيّنات؛ ويُبلَّغ عن اليوم الذي قطعته الميزانية بشكل منفصل عن الأيام المكتملة بدلًا من احتسابه كإجمالي منتهٍ. يتيح فهرس جانبي لكل يوم (LOG_DIR/index/، USE_EVENT_INDEX) للمسح تخطّي كل سطر غير مطابق ويجعل /counts دقيقًا |
| خريطة العالم | كثافة الأحداث لكل بلد لليوم المحدد (/geo)، مع تحديد موقع النقطة الطرفية الخارجية لكل حدث. تُبلَّغ الأحداث التي لا يمكن نسبتها إلى عنوان خارجي كغير معيّنة على الخريطة بدلًا من تخمينها. اضبط HOME_LAT / HOME_LON لرسم أقواس المنشأ |
| الفرز | حالة لكل تهديد (جديد / قيد التحقيق / محلول / إيجابية كاذبة)، وملاحظات نصية حرة، ووسوم، وإخفاء. تتوفر قواعد القائمة البيضاء ونقاط OSINT الارتكازية من قائمة سياق الصف |
| العروض المحفوظة | إعدادات مرشّحات مسبقة مُسمّاة |
| التصدير | العرض المفلتر الحالي بصيغة CSV أو JSON أو مؤشرات مُبطَّلة |
| المظهر | سمات داكنة وفاتحة، وخطوات منفصلة لحجم النص |
تُخزَّن حالة الفرز والعروض المحفوظة والوسوم وإعدادات المظهر في المتصفح
(localStorage)، وليس على الخادم: فهي خاصة بكل متصفح وبكل أصل، ولا تُشارَك
بين المحللين.
الجلسات المقيّدة بمرشّح شبكة ترى فقط الأحداث من شبكاتها الخاصة، وينطبق هذا التقييد على نقاط counts وmap وblacklist وكذلك على قائمة الأحداث.
يُبحث عن إثراء البلد وASN للعناوين الفردية على stat.ripe.net بواسطة
الخادم، الذي يخزّن النتائج مؤقتًا ويقدّمها للواجهة من نقطة /ripe
الخاصة به؛ ولا يتحدث المتصفح إلى أي شيء سوى Maltrail. اضبط DISABLE_RIPE_LOOKUPS لإيقاف
عمليات البحث الصادرة بالكامل. بدونها — أو على مضيف بلا اتصال بالإنترنت — تأتي الأعلام
من جدول RIR المحلي بدلًا من ذلك ويعمل كل شيء آخر في الواجهة دون اتصال.
يعتمد الأداء على المعالج، وتركيبة حركة المرور، وحجم مجموعة المسارات، ومشغّل الالتقاط، وواجهة الشبكة. تقيس الأرقام أدناه مسار معالجة الحزم في المستشعر بمعزل عن غيره؛ وهي ليست قياسات التقاط مباشر من طرف إلى طرف.
قياسات تمثيلية على AMD Ryzen 7 PRO 4750U مع تمكين الاستكشافات ومجموعة مسارات من 1.5 مليون صف:
| حركة المرور | الوقت لكل حزمة |
|---|---|
| ICMP echo، 58 بايت | 101 ns |
| TCP SYN، 70 بايت | 302 ns |
| Bulk TLS، 1,473 بايت | 402 ns |
| استعلام DNS مع ذاكرة مؤقتة دافئة، 93 بايت | 452 ns |
| حركة مرور مختلطة، بمتوسط 866 بايت | 552 ns |
| طلب HTTP، 169 بايت | 602 ns |
| استعلام DNS باسم فريد، 93 بايت | 1,102 ns |
أظهرت تشغيلات المقارنة دون اتصال باستخدام نفس الالتقاط المُولَّد والإعداد ومجموعة المسارات
تكلفة أقل لكل حزمة في الحالة المستقرة بمقدار 14–37× مقارنة بمستشعر Python المتقاعد عبر الأنظمة
المختبرة. تفصل تلك الأرقام زمن العملية الكامل عن الحالة المستقرة، لأن تحميل المسارات يهيمن على
إعادة تشغيل قصيرة. أما الكشف نفسه فيُؤكَّد بشكل منفصل، عبر مجموعة من 42 حالة في
sensor/tests/replay.rs.