[Suricata-0] Suricata源码分析之IpsNFQ模式(1)

转载 2013年12月02日 10:18:40
最近看了一下suricata-1.2.1的源代码,加之之前在网上没有搜到关于suricata的分析资料,所以就把看源码时的一些笔记整理了一下,发到网上,供其他对suricata感兴趣的网友参考,不足之处还望看到此文章的网友见谅!

先还是进行简要的介绍一下,Suricata 是一个网络入侵检测和阻止引擎,由开放信息安全基金会以及它说支持的提供商说开发。该引擎是多线程的,内置 IPv6 的支持,可加载预设规则,支持 Barnyard 和 Barnyard2 工具。

由于我只对Suricata的IPS模式感兴趣,所以就只看了IpsNFQ的源代码部分,但个人觉得,只要把一种模式看懂了,其它的模式理解起来就是顺其自然的事情了,各模式之间最主要的不同就是数据包的来源不同。下面就开始对suricata的IpsNFQ模式进行分析。


1. IpsNFQ三种模式图

IpsNFQ模式下还有三种模式,先来看看这三种模式的分析图。

a) Auto模式


b) AutoFP模式


c) Worker模式


对上图中的一些值说明一下。Queue数量是指NFQ的Queue数量;CPU数是指CPU的核心数;ratio是一个比率值,在suricata.yaml配置文件中设定,一般设置成0.5、1或1.5。 


2. 各模块功能分析

  •  

      Receive:从NFQUEUE中接收数据包,并将封装在Packet结构中,然后放入下一个缓冲区。

  •   Decode:对数据包进行解码,主要是对数据包头部信息进行分析并保存在Packet结构中。

  •   StreamTCP:对数据包进行TCP流重组。

  •   Detect:检测数据包是否包含入侵行为。

  •   Verdict:对检测后的数据包进行判定,并将判定结果告诉内核(通过ipq_set_verdict函数),方便内核对数据包进行接收、丢弃等处理。

  •   RespondReject:通过libnet对那些要执行Reject操作的数据包进行相应的回应。

3. Tm-queue&Tm-queuehandler分析

3.1Tm-queue

Tm-queue是各个模块(线程)之间传递数据的缓冲区(图中椭圆),这在多线程编程中经常会被用到,用来缓存数据。在这里提醒一下,不要将这里的Tm-queue与NFQ中的Queue混淆了,后者是内核中的Queue(Netfilter Queue),这里的Tm-queue只是suricata各模块间的缓冲区。

一个Tm-queue在程序中包括structTmq_和struct PacketQueue两个结构,前者只存了简单的信息,用于检索,后者用于实际存储数据包,两者之间通过Tmq->id进行关联。这两个结构的定义分别如下:

Tm-queue.h:

typedef struct Tmq_ {

    char *name;

    uint16_t id;

    uint16_t reader_cnt;

    uint16_t writer_cnt;

    /* 0 for packet-queue and1 for data-queue */

    uint8_t q_type;

} Tmq;

Decode.h:

typedef struct PacketQueue_ {

    Packet *top;

    Packet *bot;

    uint32_t len;

#ifdef DBG_PERF

    uint32_t dbg_maxlen;

#endif /* DBG_PERF */

    SCMutex mutex_q;

    SCCondT cond_q;

} PacketQueue;

Tmq的创建是在程序调用TmThreadCreate()(Tm-threads.c)函数创建线程时调用TmqCreateQueue()(Tm-queues.c)函数进行创建。

在NFQ模式中用到的Tm-queue除了packetpool是循环队列之外,其它的(pickup-queue、decode-queue等)都是FIFO队列。所以,这里只对packetpool这个特例进行一下说明。

Packetpool这个Tm-queue其实在源码中是用ringbuffer这个循环队列表示,所以对packetpool的操作其实是在操作ringbuffer。Ringbuffer是存放Packet*指针的一个数组,数组的大小由max_pending_packets(在配置文件中配置,默认为50)的值决定。main()(suricata.c)函数对ringbuffer数组进行了初始化,创建一定数量的Packet,在程序的整个运行中循环使用,直到程序完全退出才释放。

3.2 QueueHandler

QueueHandler是各缓冲区的操作接口,用来对缓冲区进行输入输出操作。该结构在Tm-queuehandlers.h文件中的定义如下:

typedef structTmqh_ {

    char *name;

    Packet *(*InHandler)(ThreadVars *);

    void (*InShutdownHandler)(ThreadVars *);

    void (*OutHandler)(ThreadVars *, Packet *);

    void *(*OutHandlerCtxSetup)(char *);

    void (*OutHandlerCtxFree)(void *);

    void (*RegisterTests)(void);

} Tmqh;

其中InHandler和OutHandler就是分别指向缓冲区的输入、输出操作函数。

所有的QueueHandler组成了一个数组存放在tmqh_table[]中。Tm-queuehandlers.c中的Tmqh_Setup()函数被main()调用来对tmqh_table[]数组进行初始化,并将所有会用到的QueueHandler注册到tmqh_table[]数组中。下面是NFQ模式中用到的三种QueueHandler:

1) Packepool

通过read和write两个位置标记对packetpool(ringbuffer)这个循环队列进行进出操作。

2) Simple

按照FIFO(先进先出)原则对缓冲区内容进行进出操作。

3) Flow

出队的时候是按照FIFO进行,入队的时候对数据包的头部信息进行hash,然后将具有相同hash值的数据包放到一个缓冲区。








suricata 3.1 源码分析7

DetectEngineCtx *de_ctx = NULL; if (!suri.disabled_detect) { //detect设为启用 SCClassCon...
  • superbfly
  • superbfly
  • 2016年09月05日 14:17
  • 807

suricata 架构图------持续更新

suricata架构,红色文字为待分析部分
  • superbfly
  • superbfly
  • 2017年01月31日 19:16
  • 913

suricata学习

《suricata简介》
  • wsk004321
  • wsk004321
  • 2014年05月12日 12:00
  • 9823

Suricata.yaml

Suricata uses the Yaml format for configuration. The Suricata.yaml file included in the source code,...
  • vevenlcf
  • vevenlcf
  • 2016年07月12日 16:38
  • 1483

Suricata配置文件说明1

本系列文章是Suricata官方文档的翻译加上自己对其的理解,部分图片也是来自那篇文章,当然由于初学,很多方面的理解不够透彻,随着深入后面会对本文进行一定的修正和完善。 Suricata使用Yaml...
  • superbfly
  • superbfly
  • 2016年03月10日 18:31
  • 2133

suricata命令行

suricata命令行选项说明 你能两种方式使用命令行选项,用一个横杠后面跟一个字符,或两个横杠后面跟一个单词,例如: -a --long-option ===========...
  • wsk004321
  • wsk004321
  • 2014年05月13日 11:30
  • 1805

suricata安装配置

suricata是开源的IPS工具,其中使用了netfilter_queue库,可以借鉴 安装:(https://redmine.openinfosecfoundation.org/projec...
  • Leeboy_Wang
  • Leeboy_Wang
  • 2016年01月25日 19:33
  • 2450

suricata中模式概念详解

截止目前,结合开源中国中“背着笔记本流浪”的blog中文章,已经对main函数和数据包收取、解码有了初步了解。其中遇到的困难和疑惑的地方记录在这里,便于今后学习和提升。 1、网络编程知识经验不足...
  • wsk004321
  • wsk004321
  • 2014年05月19日 09:48
  • 2307

suricata命令行

suricata命令行选项说明 你能两种方式使用命令行选项,用一个横杠后面跟一个字符,或两个横杠后面跟一个单词,例如: -a --long-option ===========...
  • wsk004321
  • wsk004321
  • 2014年05月13日 11:30
  • 1805

Suricata配置文件说明2

本文接上一篇配置文件说明1,是了解suricata配置文件的第二篇。threadingSuricata是一个多线程的程序,当它在拥有多核CPU的计算机上运行时会产生多线程以同时处理多个网络流量。在前一...
  • wuyangbotianshi
  • wuyangbotianshi
  • 2015年04月23日 14:55
  • 2326
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Suricata-0] Suricata源码分析之IpsNFQ模式(1)
举报原因:
原因补充:

(最多只允许输入30个字)