suricata初始化流程
1、简介
suricata是一款高性能的IDS、IPS和网络安全监测引擎。采用多线程模式,利用多核优势。支持多种协议:例如ip4、ip6、TCP、UDP、HTTP、FTP、POP3等协议。可以动态加载过滤规则。
2、main函数流程
(1)调用RunModeRegisterRunModes函数注册运行模式
RunModeIdsPcapRegister(); // IDS+pcap
RunModeFilePcapRegister(); // File+pcap
RunModeIdsPfringRegister(); // IDS+pfring
RunModeIpsIPFWRegister(); // IPS+ipfw
RunModeIpsNFQRegister(); // IPS+nfq
RunModeErfFileRegister(); // erf+file
RunModeErfDagRegister(); // erf+dag
RunModeNapatechRegister(); // napatech
RunModeIdsAFPRegister(); // IDS+AFP
RunModeUnixSocketRegister(); // UnixSocket
每种运行模式调用RunModeRegisterNewRunMode注册,
RunModeRegisterNewRunMode(RUNMODE_PCAP_DEV, "single",
"Single threaded pcap live mode",
RunModeIdsPcapSingle);
运行模式名字、运行模式执行函数、运行模式描述保存到全局数组runmodes。
(2)调用RegisterAllModules注册各模块
/* commanders */
TmModuleUnixManagerRegister();
.......
模块保存到TmModule tmm_modules[TMM_SIZE];
typedef struct TmModule_ {
const char *name;
/** thread handling */
TmEcode (*ThreadInit)(ThreadVars *, const void *, void **);//线程初始化
void (*ThreadExitPrintStats)(ThreadVars *, void *);
TmEcode (*ThreadDeinit)(ThreadVars *, void *);
/** the packet processing function */
TmEcode (*Func)(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *);
/** terminates the capture loop in PktAcqLoop */
TmEcode (*PktAcqBreakLoop)(ThreadVars *, void *);
TmEcode (*Management)(ThreadVars *, void *);
/** global Init/DeInit */
TmEcode (*Init)(void); //全局初始化模块函数
TmEcode (*DeInit)(void);
void (*RegisterTests)(void);
uint8_t cap_flags; /**< Flags to indicate the capability requierment of
the given TmModule */
/* Other flags used by the module */
uint8_t flags;
} TmModule;
(3)模块初始化,调用TmModuleRunInit()执行TmModule tmm_modules[TMM_SIZE]中的全局初始化模块函数。
(4)RunModeDispatch()函数调用,根据配置获取运行模式,然后根据运行模式执行全局数组runmodes中的运行模式执行函数。
(5)运行模式执行函数
例如:RunModeFilePcapSingle()
通用模块初始化RunModeInitialize
创建tv实例TmThreadCreatePacketHandler
从tmm_modules中获得模块TmModuleGetByName
插入槽slot
TmThreadSpawn真正创建线程函数
整理下执行顺序:
运行模式注册,设置执行函数
所有模块注册,设置模块相关函数
所有模块初始化
从配置获取运行模式类型,执行函数
创建线程
根据模块名称从全局数组tmm_modules中得到模块指针
插入线程槽slot