Surciata源码分析之IpsNFQ模式(2)
来源:互联网 发布:办公软件基础视频教程 编辑:程序博客网 时间:2024/06/06 03:31
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值的数据包放到一个缓冲区。
- Surciata源码分析之IpsNFQ模式(2)
- Surciata源码分析之IpsNFQ模式(2)
- Surciata源码分析之IpsNFQ模式(2)
- Surciata源码分析之IpsNFQ模式(1)
- Surciata源码分析之IpsNFQ模式(1)
- Surciata源码分析之IpsNFQ模式(1)
- [Suricata-0] Suricata源码分析之IpsNFQ模式(1)
- 设计模式之----建造者模式(AlertDialog源码分析)
- Android之观察者模式源码分析(DataSetObserver)
- Hessian源码分析之设计模式篇(八)
- Android源码分析之简单工厂模式
- Android源码分析之工厂方法模式
- Android源码分析之抽象工厂模式
- Android源码分析之单例模式
- Android源码分析之Builder模式
- Android源码分析之原型模式
- Android源码分析之模板方法模式
- Android源码分析之原型模式
- 用Latex写IEEE论文
- ubuntu C++ preprocessor "/lib/cpp" fails sanity check
- Objective-c语法速成
- Sieve of Eratosthenes
- CVSNT和Eclipse配置
- Surciata源码分析之IpsNFQ模式(2)
- sql日期格式化
- sideboxes里的模块随意插入到网页任意位置方法
- 日记-5月18日-痛苦与快乐
- dangerous fork !
- 计算机学生的未来
- zen cart忘记密码怎么办
- 三层架构通用ORM类库 ThreeTierLib v2.0
- zen-cart后台邮箱参数设置