网络入侵检测系统之 Suricata(二)-- 运行模式及数据流图

Running mode
Sruciata 由线程和队列组成,数据包在线程间传递通过队列实现。线程由多个线程模块组成,每个线程模块实现一种功能。
Suricata 有多种运行模式,这些模式与抓包驱动和 IDS/IPS 选择相关联。抓包驱动如:pcap, pcap file,nfqueue,ipfw,dpdk 或者一个特有的抓包驱动等。Suricata 在启动时只能选择某个运行模式。如-i 选项表示 pcap, -r 表示 pcapfile,-q 表示 nfqueue 等。每一种运行模式都会初始化一些 threads,queues 等。模式的具体任务是由线程模块来完成。根据线程和线程模块的组织方式的不同,我们可以./suricata --list-runmodes 查看运行模式,运行模式又细分为"autofp", “single”,“wokers”
通常情况下 workers 性能最好,因为网卡驱动确保数据包平均分担到 Suricata 处理线程,每一个线程包含数据包处理完整的流水线;
Single mode

Workers

Autofp(默认运行模式)
For processing PCAP fifiles, or in case of certain IPS setups (like NFQ), autofp is used,增加了多个数据包捕获线程和数据包解码线程:


RX thread
RX thread 的作用体现为线程函数-TmThreadsSlotPktAcqLoop,主要执行的任务为:

W thread
w thread 的作用体现为线程函数-TmThreadsSlotVar,主要执行的任务为:

Data Struct

行级锁
suricata 针对 snort 单线程处理数据包,无法很好利用多核 cpu 的劣势,开发了多线程架构方式并发处理数据包,而很多数据是线程间共享,所以在很多地方使用行级锁哈希表等其他高效数据结构。第一个行锁使用的地方就是连接管理模块(哈希表,检索速度 O(1))
nf_conntrack_lock
这个锁的作用是保护全局会话表。当 CPU 尝试用当前数据包 skb 进行会话匹配,或者准备插入新的会话时,都需要对 nf_conntrack_lock 进行上锁
Data Flow Chat
线程模块间的数据传递
同线程内的模块之间主要是以参数的形式进行数据传递,不同线程之间以共享队列的方式进行数据传递。每个线程由 ThreaVars 结构体来抽象,ThreadVars 对象指定线程输入数据队列 inq 和输出数据队列 outq。这些队列在多个线程之间进行共享,一个线程的输出队列可能是另一个线程的输入队列。

autofp 模式下数据包的传递路径

版权声明: 本文为 InfoQ 作者【于顾而言】的原创文章。
原文链接:【http://xie.infoq.cn/article/cb995bd0b1a944d7c9967c245】。文章转载请联系作者。
评论