/ مقالات
مراقبة المختبر المنزلي: بناء رصد شبكة ذاتي الاستضافة فوق Proxmox و ntopng و Docker
أنا عبدالمحسن العيوني، مهندس رصد وأمن شبكات من الرياض، وأبني كل ما يخص شبكتي داخل مختبر منزلي حقيقي في البيت. هذه المقالة عن كيف حوّلت شبكتي المنزلية من صندوق أسود إلى نظام مراقبة ذاتية الاستضافة يريني كل تدفق وكل استعلام DNS وكل جلسة، فوق Proxmox للحوسبة وntopng لرؤية الحركة وDocker لتشغيل كل خدمة في حاوية معزولة. الفكرة ليست شراء منتج جاهز، بل تركيب أدوات مفتوحة المصدر بطريقة مدروسة، بحيث تبقى الشبكة سريعة والرؤية كاملة.
فلسفة التصميم: سلبي، إضافي، قابل للتراجع، ومحصور
قبل أي أداة، لدي أربع قواعد أطبّقها على كل ما أضيفه للشبكة، وهي التي تجعل المختبر المنزلي قابلاً للحياة على المدى الطويل بدل أن يتحول إلى كومة أعطال:
- سلبي (Passive): الرصد يستمع فقط. لا يعترض حزمة ولا يغيّر مساراً. إذا توقف نظام المراقبة بالكامل، تبقى الشبكة تعمل كأن شيئاً لم يكن.
- إضافي (Additive): كل مكوّن جديد يضاف بجانب ما يعمل، لا فوقه. لا أستبدل خدمة قائمة بأخرى تجريبية.
- قابل للتراجع (Reversible): أي مرحلة أركّبها أستطيع إزالتها في دقائق والعودة للحالة السابقة. أعمل على مراحل مفصولة بلقطات (snapshots) على Proxmox.
- محصور (Fenced): لكل خدمة حدود موارد صارمة على CPU والذاكرة. أداة الرصد لا يُسمح لها أبداً أن تجوّع المسارات الحاملة للحِمل.
القاعدة الذهبية: لا تلمس أبداً المسار الحرج. المراقبة تُبنى حول الشبكة، لا داخل شريانها.
الأساس: OPNsense و Suricata كحارس للحافة
جدار الحماية عندي هو OPNsense، وعليه أشغّل Suricata كنظام كشف تسلل (IDS) في وضع الاستماع فقط. هذه النقطة مهمة: أنا لا أضيف أي عفريت (daemon) جديد على الحافة. Suricata يعمل أصلاً، فبدل تشغيل جامع تدفقات منفصل، وسّعته ليصدّر أحداث EVE من نوع flow و http و tls و dns. مصدر واحد يعطيني نية الاتصال (من يكلّم من)، واسم النطاق المطلوب، وبصمة TLS، دون أي حمل إضافي على جدار الحماية.
فوق ذلك أتحكّم في OPNsense عبر واجهته البرمجية (API): أراقب زمن ذهاب وإياب البوابة (RTT) ونسبة الفقد، وأقرأ سجلات الجدار وعقود DHCP آلياً. كل هذا يغذّي طبقة التنبيه لاحقاً.
EmberEye: لوحة واحدة توحّد المختبر المنزلي
المشكلة التي تواجه كل صاحب مختبر منزلي أن كل خدمة لها لوحتها الخاصة. Proxmox في مكان، وntopng في مكان، وPortainer في ثالث، وحالة WireGuard في مكان رابع. فبنيت EmberEye، وهي بوابة مراقبة قائمة على Docker توحّد Proxmox VE وntopng وNGINX وOPNsense وWireGuard وPortainer ولوحة الألعاب في لوحة واحدة.
المكدّس التقني الذي اخترته لها متعمَّد وقابل للتوسّع في أي بيت:
- الخلفية: FastAPI مع جدولة خلفية عبر APScheduler لاستطلاع الخدمات دورياً، ودفع فوري للحالة عبر WebSocket.
- الواجهة: Next.js و React، خلف عاكس NGINX، مع مصادقة JWT.
- التخزين: PostgreSQL للبيانات، وRedis للتخزين المؤقت والطوابير.
- محرك تنبيهات: قواعد مع فترات تهدئة (cooldowns) ترسل عبر webhook إلى Discord والبريد.
- خريطة خدمات: رسم طوبولوجيا على canvas يوضح ما يتصل بماذا.
- الاحتفاظ بالمقاييس: تجميعات ساعية (rollups) لتقليص الحجم، وتقارير CSV.
النتيجة: أفتح تبويباً واحداً فأرى صحة المختبر كله. هذا وحده يستحق العناء.
EmberScope: مستودع تدفقات الشبكة
عندما أردت رؤية أعمق من مجرد الحالة، بنيت EmberScope، وهي منصة رصد تدفقات (flow) ذاتية الاستضافة بالكامل. الهدف: أن أستطيع الرجوع في الزمن وأسأل "من كلّم هذا العنوان قبل ثلاثة أيام الساعة الثالثة فجراً، وكم بايت، وعبر أي بروتوكول؟". خط المعالجة كالتالي:
- المستشعرات: Suricata على الحافة يصدّر أحداث EVE (كما شرحت)، وحسّاس ثانٍ هو softflowd يصدّر IPFIX بصيغة biflow من خادم VPS بعيد على الحافة، لتغطية ما لا تراه الشبكة المنزلية.
- ناقل الاستيعاب: Vector كنقطة دخول واحدة توحّد كل شيء إلى سجل تدفق واحد قياسي (canonical)، مع إثراء جغرافي ومعلومات ASN عبر ملفات MMDB، وإزالة التكرار، وإدراج مخزّن على القرص لتحمّل الانقطاعات.
- المستودع العمودي: ClickHouse كمخزن للتدفقات، مع سياسة احتفاظ TTL، وتجميعات عبر materialized views على مستويات دقيقة وساعية ويومية، وقواميس (dictionaries) للإثراء السريع.
- التقاط الحزم: Arkime فوق OpenSearch لالتقاط الحزم و"إعادة لفّ" الجلسات عند الحاجة للتحقيق العميق.
مفتاح الربط بين كل هذه المستشعرات هو community_id: بصمة موحّدة للتدفق تسمح لي بمطابقة نفس الجلسة سواء رآها Suricata أو softflowd أو Arkime. بدونها تصبح البيانات جزراً منعزلة.
نفق WireGuard للقياس: الجامع يتصل للخارج
نقطة أمنية أفتخر بها: الحسّاس البعيد لا يفتح أي منفذ داخل نحو بيتي. بدل ذلك، الجامع في البيت هو من يطلب الاتصال للخارج عبر نفق WireGuard مخصص للقياس. صفر ثقوب واردة في جدار الحماية. القياس يتدفق عبر قناة مشفّرة أنا من بدأها، وهذا يقلب نموذج المخاطر لصالحي.
كشف الشذوذ: من البيانات إلى التنبيه المفيد
تكديس البيانات بلا تحليل عبء لا فائدة له. لذلك أبني كل ليلة ملفات أساس (baselines) لسلوك الشبكة الطبيعي، ثم أشغّل كواشف شذوذ فوقها:
- حجمي (z-score): قفزة غير معتادة في حجم الحركة مقارنة بالأساس.
- وجهة جديدة: خروج نحو نظام ذاتي (ASN) أو دولة لم تتصل بها الشبكة من قبل.
- عشوائية DNS (entropy): مؤشر على نطاقات مولّدة آلياً أو نفق عبر DNS.
- النبض (beaconing): اتصالات دورية بفواصل ثابتة، وهي سلوك كلاسيكي للبرمجيات الخبيثة.
عند إطلاق أي كاشف يصلني تنبيه على Discord مع رابط محوري بنقرة واحدة ينقلني مباشرة إلى التدفق المعني وحزمه في Arkime. هذا التحويل من "تنبيه" إلى "دليل" هو ما يجعل النظام صالحاً للاستخدام فعلاً في الثالثة فجراً.
طبقات إضافية: EmberMonitor و PortSync
فوق هذا الأساس أشغّل مشروعين متخصصين. EmberMonitor طبقة تحرٍّ ذكية تربط بيانات ntopng وOPNsense، مع حلقة تحقيق مدفوعة بنموذج لغوي تقترح أو تنفّذ حظراً على جدار الحماية، إضافة إلى أدوات لتحقيق هجمات حجب الخدمة (DDoS). وPortSync يوفّق قواعد جدار الحماية السحابي (AWS Security Group) مع قواعد iptables الحيّة على بوابة WireGuard، ويكشف أي انحراف (drift) بينهما قبل أن يتحول إلى ثغرة صامتة.
لماذا يستحق هذا العناء
يمكنك تشغيل مختبر منزلي بلا أي رصد، وسيعمل. لكن اللحظة التي يبدأ فيها جهاز غريب بالثرثرة نحو الخارج، أو ترتفع فيها زمن استجابة بوابتك بلا سبب، ستتمنى لو كانت لديك رؤية. الجمال في هذا النهج أنه ذاتي الاستضافة بالكامل: لا سحابة تحتفظ ببياناتك، ولا اشتراك، ولا صندوق أسود. أدوات مفتوحة المصدر، مركّبة بعناية فوق Proxmox وDocker، مع احترام صارم للمسارات الحاملة للحِمل. ابدأ صغيراً: OPNsense وSuricata وntopng ولوحة تجمعها، ثم أضف خط التدفقات حين تكون جاهزاً. كل مرحلة قائمة بذاتها، وكل مرحلة قابلة للتراجع.
