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