网站首页 > 资源文章 正文
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,增加了多个数据包捕获线程和数据包解码线程:
- RX thread
RX thread的作用体现为线程函数-TmThreadsSlotPktAcqLoop,主要执行的任务为:
1.给线程设置一个有意义的名称;
2.将线程绑定到指定CPU核心;
3.创建Packet对象池,用于快速存放网络数据包数据;
4.初始化与该线程关联的线程模块;
5.调用数据包收集模块,启动数据包收集,依次调用各模块处理packet,然后将packet放到输出队列中;
6.如果接收到退出信号,则中止数据包收集,销毁Packet对象池,调用线程模块的退出清理函数;
7.退出线程的执行。
- W thread
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模式下数据包的传递路径
猜你喜欢
- 2024-09-11 pytbull-入侵检测/预防系统(IDS / IPS)测试框架
- 2024-09-11 Windows系统的入侵排查——基础技术原理
- 2024-09-11 网络入侵检测系统之Suricata(三)--日志代码详解
- 2024-09-11 一套详细的弱电工程入侵报警系统设计方案
- 2024-09-11 应急响应:Linux系统入侵排查示例(linux入侵检测系统)
- 2024-09-11 网站入侵检测系统的优点是什么(网络入侵检测系统的优点)
- 2024-09-11 海水入侵在线监测系统——爱默里地下水原位自动监测仪
- 2024-09-11 一套详细的入侵报警系统技术要求,可作招标要求
- 2024-09-11 入侵防御系统IPS(入侵防御系统IPS部署)
- 2024-09-11 入侵检测原型系统的设计与实现(入侵检测的原理)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)