suricata 4.0.3 runmode
suricata中runmode包含两层含义
- 抓包模式
- 线程模型
所有支持的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中并没有检查返回值。
抓包模式
抓包模式由命令行参数指定,可以直接指定抓包模式,也可以通过-i
参数在编译有AF_PACKET时使用AF_PACKET否则使用pcap抓包。main函数中存在局部变量suri,抓包模式runmode写入suri.run_mode中。抓包设备列表会注册到一个LiveDevice
结构链表中,最后一个抓包设备名写入suri.pcap_dev。参考suricata 4.0.3 配置模块
线程模型
- 线程模型由命令行参数
--runmode
指定,参数值会被写入suri.runmode_custom_mode,后续操作中会被写入配置模块的runmode项。 - 若命令行未提供该参数,配置文件中若有runmode项则该项会生效。
- 若命令行和配置文件中均未提供线程模型参数或该参数为”auto”,则会根据抓包模型设定为该抓包模型的默认线程模型,每种抓包模型的默认线程模型在所有抓包模型注册到静态全局变量runmodes时设定。
线程模型最后在函数RunModeDispatch中确定,依据线程模型名提取到前文提到的一个RunMode结构,调用RunMode中的函数指针RunModeFunc。以pcap抓包为例,线程模型与对应的函数如下。
线程模型 | 回调函数 |
---|---|
single | RunModeIdsPcapSingle |
autofp | RunModeIdsPcapAutoFp |
workers | RunModeIdsPcapWorkers |
线程模型具体如何运行,参考suricata 4.0.3 线程模型