Surciata源碼分析之IpsNFQ模式(2)

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值的數據包放到一個緩衝區。

轉載至:http://blog.csdn.net/firedb/article/details/7581894

發佈了28 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章