本文主要描述了int SuricataMain(int argc, char **argv)中的主要函数及其作用,来自文件suricata.c。
SCInstanceInit(&suricata, argv[0])
suricata实例初始化,其中结构体变量用来容纳配置文件的参数和命令行参数。
InitGlobal()
- 初始化suricata_context的函数指针,其中rs_init(&suricata_context)调用了rust函数rs_intit,本人对rust没有研究,TODO。
- SCLogInitLogModule(NULL),初始化日志模块,常用的日志有4个,分别是suricata.log, eve.json, fast.log, stats.log; 其他的日志输出如果有需要的话可以在suricata.yaml 配置文件中修改将enable:no 改为yes 即可。
- ParseSizeInit() 与正则表达式有关的设置。
- RunModeRegisterRunModes() 注册runmode函数,常用的有IDS模式(Intrusion detection system),IPS(intrusion protection system)模式,FilePcap(本地pcap包检测)模式等。
ParseCommandLine(argc, argv, &suricata)
用于解析命令行参数。
FinalizeRunMode(&suricata, argv)
确定运行模式。
StartInternalRunMode(&suricata, argc, argv)
开始运行内部模式,支持列出app-layer,版本,dump配置,keyword等进行查看。
GlobalsInitPreConfig()
Initializations for global vars, queues, etc (memsets, mutex init…)。
LoadYamlConfig(&suricata)
加载yaml配置
LogVersion,UtilCpuPrintSummary
打印出一些系统信息和日志信息。
ParseInterfacesList
解析网络接口列表,有pcap_deve, pfring, afp_dev, af_packet等。
PostConfLoadedSetup(&suricata)
解析配置文件后加载设置,会包含大部分运行代码。
- MpmTableSetup,SpmTableSetup, 跟pattern match有关的函数设置;
- AppLayerSetup(), 设置应用层函数,包括proto detect, proto parse, register proto, set up counters等功能;
- SigTableSetup(), load the rule keywords;
- RegisterAllModules(), 注册所有功能模块,这个函数非常重要;
CoredumpEnable()
设置coredump,可以在yaml文件中设置coredump的size,如果size为0,那么coredump就不生效。
RunModeDispatch
生成两个线程:FlowManager和FlowRecycle。
TmThreadContinueThreads()
让线程继续工作
SuricataMainLoop(&suricata)
循环检测suricata_ctl_flags,若设置为停止则退出程序。
GlobalsDestroy(&suricata)
释放资源,结束程序