写点什么

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

作者:于顾而言
  • 2022 年 9 月 17 日
    江苏
  • 本文字数:1806 字

    阅读完需:约 6 分钟

网络入侵检测系统之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



线程模块是对packet处理任务的抽象。线程模块大概有以下几种:1.Receive模块:收集网络数据包,封装成Packet对象后将其传递给Decode线程模块2.
2.Decode模块:对Packet按协议4层模型(数据链路层、网络层、传输层、应用层)进行解码,获取协议和负荷信息,解码完成后将 Packet传递给FlowWorker线程模块。该模块主要是进行packet解码,不处理应用层。应用层由专门的应用层解码模块处理
3.FlowWorker模块:对packets进行分配flow,Tcp会话管理,TCP重组,应用层数据解析处理,Detect规则检测
4.Verdict模块:根据Detect模块检测的结果,对drop标记的包需要做丢弃处理
5.RespondReject模块:根据detect检测后的结果,对于reject的包需要向双端发送reset包
6.logs模块:将处理结果记录在日志中。
复制代码
  • Autofp(默认运行模式)

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




  1. RX thread

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

1.给线程设置一个有意义的名称;2.将线程绑定到指定CPU核心;3.创建Packet对象池,用于快速存放网络数据包数据;4.初始化与该线程关联的线程模块;5.调用数据包收集模块,启动数据包收集,依次调用各模块处理packet,然后将packet放到输出队列中;6.如果接收到退出信号,则中止数据包收集,销毁Packet对象池,调用线程模块的退出清理函数;7.退出线程的执行。
复制代码



  1. W thread

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

1.给线程设置一个有意义的名称;2.将线程绑定到指定CPU核心;3.创建空Packet对象池;4.初始化与该线程关联的线程模块;5.从输入队列中获取packet,传递给线程模块依次处理后,放到输出队列中;6.如果接收到退出信号,则中止数据包收集,销毁Packet对象池,调用线程模块的退出清理函数;7.退出线程的执行。
复制代码



Data Struct


行级锁

suricata 针对 snort 单线程处理数据包,无法很好利用多核 cpu 的劣势,开发了多线程架构方式并发处理数据包,而很多数据是线程间共享,所以在很多地方使用行级锁哈希表等其他高效数据结构。第一个行锁使用的地方就是连接管理模块(哈希表,检索速度 O(1))

typedef struct FlowBucket_ { Flow *head; /* 链表头*/ Flow *tail;/* 链表尾*/ /* 行锁类型*/#ifdef FBLOCK_MUTEX SCMutex m;#elif defined FBLOCK_SPIN SCSpinlock s;#else #error Enable FBLOCK_SPIN or FBLOCK_MUTEX#endif} __attribute__((aligned(CLS))) FlowBucket;  typedef struct Flow_{.../* 节点锁,提高并发*/#ifdef FLOWLOCK_RWLOCK SCRWLock r;#elif defined FLOWLOCK_MUTEX SCMutex m;#else #error Enable FLOWLOCK_RWLOCK or FLOWLOCK_MUTEX#endif... /* 由hnext hprev 构成双向链表 */ /** hash list pointers, protected by fb->s */ struct Flow_ *hnext; /* hash list */ struct Flow_ *hprev;...} Flow;
复制代码

nf_conntrack_lock

这个锁的作用是保护全局会话表。当 CPU 尝试用当前数据包 skb 进行会话匹配,或者准备插入新的会话时,都需要对 nf_conntrack_lock 进行上锁

Data Flow Chat

线程模块间的数据传递

同线程内的模块之间主要是以参数的形式进行数据传递,不同线程之间以共享队列的方式进行数据传递。每个线程由 ThreaVars 结构体来抽象,ThreadVars 对象指定线程输入数据队列 inq 和输出数据队列 outq。这些队列在多个线程之间进行共享,一个线程的输出队列可能是另一个线程的输入队列。



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



发布于: 刚刚阅读数: 3
用户头像

于顾而言

关注

| 诗酒趁年华诗酒 √ | 2022.09.10 加入

| NJUST Optical M.A. | | SASE | SangFor | Senior Developer | 知乎专栏:https://www.zhihu.com/people/whisper-of-the-Koo

评论

发布
暂无评论
网络入侵检测系统之Suricata(二)--运行模式及数据流图_网络安全_于顾而言_InfoQ写作社区