参考资料

suricata官方文档https://suricata.readthedocs.io/en/latest/performance/runmodes.html#different-runmodes

suricata的源代码https://blog.csdn.net/shenwansangz/article/details/37900875?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-3&spm=1001.2101.3001.4242

suricata的总体架构https://www.cnblogs.com/zlslch/p/7382176.html

suricata数据结构https://blog.csdn.net/gengzhikui1992/article/details/103031874?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

原理

suricata是基于模块(TMmoudle)的,所谓模块是suricata中的数据结构:

typedef struct TmModule_ {
char *name; // 模块名称
TmEcode (*ThreadInit)(ThreadVars *, void *, void **);
void (*ThreadExitPrintStats)(ThreadVars *, void *);
TmEcode (*ThreadDeinit)(ThreadVars *, void *);
TmEcode (*Func)(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *);
TmEcode (*Init)(void);
TmEcode (*DeInit)(void);
void (*RegisterTests)(void);
uint8_t cap_flags;
uint8_t flags;
} TmModule;

每个模块代表一个特定的功能。

例如获取报文、解码报文、检测报文、记录日志这四个模块。

前一个模块的输出是后一个模块的输入,它们各自拥有一个线程。多线程是suricata具有较高性能的保证。



模块和模块之间的联系通过suricata中的插槽(slot)这一数据结构相连。

typedef struct TmSlot_ {

    ThreadVars *tv;                       // 拥有该slot的线程
SC_ATOMIC_DECLARE(TmSlotFunc, SlotFunc);// 函数指针
TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *); // 模块数据包获取函数
TmEcode (*SlotThreadInit)(ThreadVars *, void *, void **); // 模块初始化执行函数
void (*SlotThreadExitPrintStats)(ThreadVars *, void *); // 模块退出打印函数
TmEcode (*SlotThreadDeinit)(ThreadVars *, void *); // 模块清理执行函数
void *slot_initdata; // 数据存储
SC_ATOMIC_DECLARE(void *, slot_data);
PacketQueue slot_pre_pq;
PacketQueue slot_post_pq;
int tm_id; // tm ID
int id; // slot ID
struct TmSlot_ *slot_next;
} TmSlot;

每个线程运行一个slot对象,slot负责管理其上的模块。包括该模块的初始化,以及对模块数据包的获取和模块的退出和清理。

数据从一个模块到另一个模块是通过slot结构体中的 struct TmSlot_* 指针指向下一个slot,并将数据包输入至下一个slot管理的TmModule上。



图中有3个插槽,每个插槽各有一个模块,3个插槽各自启动了一个线程。类似生产者和消费者原理,模块i是模块i-1的消费者,模块i-1是模块i的生产者。使用模块-插槽结构的好处是便于添加中间组件对数据包进行处理。同时模块化也便于利用多线程。

suricata的模块需要被注册,注册函数名为 TmModuleXXXRegister(void),模块被注册后便被存入全局数组 TmModule tmm_modules[TMM_SIZE]中。该数组使用了枚举-索引方式。用枚举的方式对数组每个位命名。

typedef enum{
TMM_DECODEDFQ,
TMM_XXXX
};

枚举数正好对应TMM数组的index。

运行模式(run-mode)

在suricata中,线程,模块和队列排列在一起的方式称作运行方式。

suricata如何封包捕获?

suricata中的AF_PACKET和PF_RING方法可以捕获数据包。

suricata的模块和插槽的更多相关文章

  1. suricata学习笔记1--初步认识

    1.前言  最近工作需要对网站的关键字进行检测,找出敏感词.这个过程需要对报文进行收集.解码.检测和记录日志.当前只是简单实现功能,根据关键字进行简单的匹配,而没有进行关键字的语义分析.导致的结果就是 ...

  2. FMC

    FMC (FPGA Mezzanine Card) 编辑 FMC:英文全称,FPGA Mezzanine Card.是一个应用范围.适应环境范围和市场领域范围都很广的通用模块.FMC连接器(FMC C ...

  3. suricate学习笔记1--初步认识(转)

    最近在研究关于dpi网卡采集的代码重组这块,公司一个同事,简单的用CPP讲解了suricata内部的一些处理逻辑,,,其中大部分代码是用C语言写的,对于用C重构代码有很好的借鉴作用,,,如果有相关工作 ...

  4. pyqt笔记1模块 信号和插槽

    资料 PyQt5图形界面编程 PyQt5指南 模块 PyQt5本身拥有超过620个类和6000函数及方法. QtCore模块涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及到的 time.文件 ...

  5. [自娱自乐] 2、超声波测距模块DIY笔记(二)

    前言 上一节我们已经大致浏览下目前销售的超声波测距模块同时设计了自己的分析电路,这次由于我买的电子元件都到了,所以就动手实验了下!至写该笔记时已经设计出超声波接收模块和超声波发射模块,同时存在超声波发 ...

  6. 电够动力足——认识主板上的CPU供电模块

    CPU供电模块有啥用 CPU供电模块从字面上理解,就是专给CPU供电的一个电子元器件组合.因为CPU工作时就跟发动机一样,油(电)提供得稳不稳定.品质高不高就是CPU供电模块干的事情.反过来说,如果C ...

  7. 【iCore2 模块相关资料】发布模块DEMO 代码包,目前支持 iM_TFT30、 iM_LAN和 iM_RGB 三个模块

    iCore2 模块底板 和部分模块发布了,所以我们做了一个 DEMO 代码包,此代码包现在有以下功能: 1.支持 iM_TFT30 3寸触摸液晶模块(硬件已发布): 2.支持 iM_LAN 100M以 ...

  8. Suricata配置文件说明

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

  9. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

随机推荐

  1. Python中管理数据库

    前言:Python中是利用MySQL模块和数据库之间建立联系. MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL ...

  2. 通过 layout 探索 kratos 运行原理

    创建项目 首先需要安装好对应的依赖环境,以及工具: go 下载 protoc go install google.golang.org/protobuf/cmd/protoc-gen-go@lates ...

  3. vue 监听父子组件传参,对象数据变化

    watch:{ 组件传参的字段 :{ handler (newV, oldV){ 这里打印 newV, oldV 就可以看到数据变化了 } , immediate: true, // 重点 deep: ...

  4. Systemd Journald占用资源过多

    journald占用过多磁盘空间 方法一 检查当前journal使用磁盘量 journalctl --disk-usage 清理方法可以采用按照日期清理,或者按照允许保留的容量清理,只保存2天的日志, ...

  5. Spring(二)——IOC

    一.入门 1.案例 1 public class Student { 2 3 private String name; 4 5 public Student() { 6 System.out.prin ...

  6. RabbitMQ之消息模式2

    消费端限流 什么是消费端的限流? 假设一个场景,首先,我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法 ...

  7. openswan协商流程之(六):main_inI3_outR3()

    主模式第六包:main_inI3_outR3 1. 序言 main_inI3_outR3()函数是ISAKMP协商过程中第六包的核心处理函数的入口,第五六包主要用来验证对方的身份信息,同时此报文也是加 ...

  8. 清除router路由后面的参数

    清除router参数: 1.this.$router.push({ query: {}}) 2.var path = this.$route.path; //获取路由路径    this.$route ...

  9. 海量列式非关系数据库HBase 架构,shell与API

    HBase的特点: 海量存储: 底层基于HDFS存储海量数据 列式存储:HBase表的数据是基于列族进行存储的,一个列族包含若干列 极易扩展:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加Da ...

  10. this关键字的理解

    this理解为:当前对象 或 当前正在创建的对象 this代表所在类的当前对象的引用(地址值),即对象对自己的引用. 备注:意思方法被那个对象调用,方法中的this就代表那个对象.即谁调用,this就 ...