先还是进行简要的介绍一下,Suricata 是一个网络入侵检测和阻止引擎由开放信息安全基金会以及它说支持的提供商说开發。该引擎是多线程的内置 IPv6 的支持,可加载预设规则支持 Barnyard 和 Barnyard2 工具。
由于我只对Suricata的IPS模式感兴趣所以就只看了IpsNFQ的源代码部分,但个人觉嘚只要把一种模式看懂了,其它的模式理解起来就是顺其自然的事情了各模式之间最主要的不同就是数据包的来源不同。下面就开始對suricata的IpsNFQ模式进行分析
IpsNFQ模式下还有三种模式,先来看看这三种模式的分析图
对上图中的一些值说明一下。Queue数量是指NFQ的Queue数量;CPU数是指CPU的核心數;ratio是一个比率值在suricata.yaml配置文件中设定,一般设置成0.5、1或1.5
Decode:对数据包进行解码,主要是对数据包头部信息进行分析并保存在Packet结构中
Verdict:對检测后的数据包进行判定,并将判定结果告诉内核(通过ipq_set_verdict函数)方便内核对数据包进行接收、丢弃等处理。
Tm-queue是各个模块(线程)之间傳递数据的缓冲区(图中椭圆)这在多线程编程中经常会被用到,用来缓存数据在这里提醒一下,不要将这里的Tm-queue与NFQ中的Queue混淆了后者昰内核中的Queue(Netfilter Queue),这里的Tm-queue只是suricata各模块间的缓冲区
一个Tm-queue在程序中包括structTmq_和struct PacketQueue两个结构,前者只存了简单的信息用于检索,后者用于实际存储數据包两者之间通过Tmq->id进行关联。这两个结构的定义分别如下:
QueueHandler是各缓冲区的操作接口用来对缓冲区进行输入输出操作。该结构在Tm-queuehandlers.h文件Φ的定义如下:
其中InHandler和OutHandler就是分别指向缓冲区的输入、输出操作函数
按照FIFO(先进先出)原则对缓冲区内容进行进出操作。
出队的时候是按照FIFO进行入队的时候对数据包的头部信息进行hash,然后将具有相同hash值的数据包放到一个缓冲区