suricata中runmode包含两层含义

  1. 抓包模式
  2. 线程模型

所有支持的runmode在进程启动时注册到一个静态全局变量runmodes(位于runmodes.c92行)中,runmodes是一个数组,数组中的每一项代表了一种抓包模式,每种模式下链接了此种抓包模式所支持的所有线程模型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* \brief Holds description for a runmode.
*/
typedef struct RunMode_ {
/* the runmode type */
int runmode;
const char *name;
const char *description;
/* runmode function */
int (*RunModeFunc)(void);
} RunMode;

typedef struct RunModes_ {
int no_of_runmodes;
RunMode *runmodes;
} RunModes;

static RunModes runmodes[RUNMODE_USER_MAX];

RunMode结构体中各成员如下

  • runmode
    • 抓包模式的索引值
  • name
    • 线程模型的字符串名
  • description
    • 描述文字
  • RunModeFunc
    • 返回值为整形且无参数的函数指针,在RunModeDispatch函数中被调用,RunModeDispatch的调用位置为main函数中。虽然RunModeFunc返回值标识了执行是否成功,但RunModeDispatch中并没有检查返回值。

runmode注册完成后结构如图

抓包模式

抓包模式由命令行参数指定,可以直接指定抓包模式,也可以通过-i参数在编译有AF_PACKET时使用AF_PACKET否则使用pcap抓包。main函数中存在局部变量suri,抓包模式runmode写入suri.run_mode中。抓包设备列表会注册到一个LiveDevice结构链表中,最后一个抓包设备名写入suri.pcap_dev。参考suricata 4.0.3 配置模块

线程模型

  1. 线程模型由命令行参数--runmode指定,参数值会被写入suri.runmode_custom_mode,后续操作中会被写入配置模块的runmode项。
  2. 若命令行未提供该参数,配置文件中若有runmode项则该项会生效。
  3. 若命令行和配置文件中均未提供线程模型参数或该参数为”auto”,则会根据抓包模型设定为该抓包模型的默认线程模型,每种抓包模型的默认线程模型在所有抓包模型注册到静态全局变量runmodes时设定。

线程模型最后在函数RunModeDispatch中确定,依据线程模型名提取到前文提到的一个RunMode结构,调用RunMode中的函数指针RunModeFunc。以pcap抓包为例,线程模型与对应的函数如下。

线程模型 回调函数
single RunModeIdsPcapSingle
autofp RunModeIdsPcapAutoFp
workers RunModeIdsPcapWorkers

线程模型具体如何运行,参考suricata 4.0.3 线程模型