参考资料

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. Spring Cloud Eureka 实践(一)

    Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,主要在Spring Cloud架构中提供服务注册发现的功能.那么是不是可以尝试在本地搭一个单例Eu ...

  2. 性能测试必备命令(2)- uptime

    性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 系统启动up了(运行了)多 ...

  3. ICCV2021 | MicroNet:以极低的 FLOPs 改进图像识别

    ​前言:这篇论文旨在以极低的计算成本解决性能大幅下降的问题.提出了微分解卷积,将卷积矩阵分解为低秩矩阵,将稀疏连接整合到卷积中.提出了一个新的动态激活函数-- Dynamic Shift Max,通过 ...

  4. 数据导出生成word附件使用POI的XWPFTemplate对象

    比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel.Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组 ...

  5. python库--tensorflow

    方法 返回值类型 参数 说明 张量    .constant() Tensort 张量 实例t value 创建一个常量tensor dtype=None 输出类型 shape=None 返回tens ...

  6. (1)java Spring Cloud+Spring boot+mybatis企业快速开发架构之微服务是什么?它的优缺点有哪些?

    ​ "微服务"一词来源于 Martin Fowler 的<Microservices>一文.微服务是一种架构风格,即将单体应用划分为小型的服务单元,微服务之间使用 HT ...

  7. [第十三篇]——Docker Compose之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Compose Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务.然 ...

  8. Linux中不用用户可以使用相同的uid

    usermod -u 513 -o  tom 使得用户tom可以使用uid等于513,即使513已经被其他用户使用了

  9. HDFS基本命令

    1.创建目录 hadoop dfs -mkdir /data hadoop dfs -mkdir -p /data/data1   创建多级目录 2.查看文件 hadoop dfs -ls / 3.上 ...

  10. HDU2063 过山车(二分匹配)

    过山车 HDU - 2063 RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做part ...