ساختار یک سامانه تشخیص نفوذ شبکه
تجزیه لایهای پروتکل، قواعد الهامگرفته از 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 بایت)، سرآیند ثابت است، اما در پورت 53 تجزیه DNS را فعال میکند
- 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 برای هر جفت IP یک
std::set<uint16_t>نگه میدارد و با مشاهده 15+ پورت یکتا در 60 ثانیه هشدار میدهد. - سیل SYN، با نرخ اتصالهای نیمهباز تشخیص داده میشود. برای هر IP مقصد،
std::dequeزمانهای SYN نگه میدارد و هنگام دسترسی پاکسازی میشود. آستانه، 100+ SYN در 10 ثانیه است. - تونلسازی DNS، خروج داده با پرسوجوهای کدگذاریشده DNS، نامهای غیرعادی بلند تولید میکند. آشکارساز پرسوجوهای بیش از 50 نویسه را دنبال میکند و با عبور حجم از آستانه هشدار میدهد.
تمام آشکارسازهای حالتمند از پنجره زمانی لغزان با پاکسازی هنگام دسترسی استفاده میکنند. دادههای قدیمی هنگام دسترسی بعدی حذف میشوند، نه با رشته پسزمینه؛ بنابراین سربار همگامسازی حذف میشود.
کارایی تجزیه بدون کپی
تجزیهگرها مستقیم روی بافر خام libpcap کار میکنند؛ بدون کپی میانی یا تخصیص پویا برای هر بسته. الگوی memcpy + ntohs/ntohl در پردازش پربازده بسته رایج است و در DPDK، PF_RING و NIDS عملیاتی به کار میرود. بنچمارک، 500K+ بسته در ثانیه در یک رشته را نشان میدهد؛ این عدد فقط توان تجزیه بستههای TCP SYN مصنوعی است.
خروجیهای هشدار
سامانه هشدار از الگوی راهبرد استفاده میکند. AlertManager هر هشدار را به تمام خروجیهای ثبتشده میفرستد:
- کنسول: رنگبندی ANSI بر اساس شدت (سبز → زرد → قرمز → قرمز برجسته)
- CSV: مطابق RFC 4180 با گریزگذاری درست و آماده ورود به SIEM
افزودن خروجی جدید مانند syslog، webhook یا Kafka فقط به پیادهسازی یک متد emit() نیاز دارد.