suricata 源码分析_02 程序流程
suricata 架构图

架构拆分
- 数据包队列处理
在TmThreadCreate中调用TmqCreateQueue创建PackQueue,autofp模式下且输出队列为flow时,首先要看outqh的OutHandleCtxSetup是否设置,若设置了则会调用该函数去间接创建队列,否则直接调用了TmpCreateQueue创建。
- 接收数据模块
graph
A(接收线程)-->B[接收数据包模块]
A==>D[解析数据包模块]
2[PacketPool]-->|1|C[循环抓包]
A-->2
C-->|2|2
2-->|3|10[TmThreadSlotProcessPkt]
B-->E[初始化数据包模块]
B-->C
B-->F[退出时释放资源]
10-->4[TmThreadsSlotVarRun]
10-->5[tv->tmqh_out]
5-->|4|D
D-->|5|5
5-->|6|6[数据包队列模块]
- 数据包队列和流操作线程模块
流程序号承接前文。
graph
A(数据包队列模块)-->|7|B[TmThreadsSlotVar]
B-->C[p=tv->tmqh_in]
B-->D[p=tv->tmqh_out]
C-->E[TmqhInputFlow]
D-->H[TmqhOutputPacketpool]
E-->|8|G[查找包对应的流_FowHandlePacket]
G-->INFO[FlowGetFlowFromHash,获取包对应的流,<br/>找不到就新建流,返回流指针,返回空说明内存不足<br/>]
INFO-->J[如果p->flow_hash找不到对应的FlowBucket,<br/>则新建flow挂到对应的bucket上,并通过参数dest返回<br/>]
INFO-->L[如果packet和bucket的第一个flow不匹配,5元组+vlan不完全相同,<br/>若遍历整个bucket链表找不到对应的flow,就新建流挂到对应成bucket上,并通过dest返回<br/>]
INFO-->K[若遍历bucket链表找到对应的flow,<br/>将当前flow放到bucket的flow->head,判断流重用,并通过参数dest返回<br/>]
INFO-->M[如果packet和bucket第一个flow匹配,<br/>五元组和vlan相同,判断流重用,<br/>并通过参数dest返回<br/>]
G-->N[p->flags=PKT_HAS_FLOW,设置包的标记为属于某条流]
H[流操作线程]-->F[FlowWorker]
F-->L[流操作]
L-->UP[根据包的信息更行对应的流]
UP-->UPINFO[判断包的流向,并设置对应标志FLOW_PKT_TOSERVER,FLOW_PKT_TOCLIENT,<br/>判断是不是第一个流向server或clent的包,并设置该包的标志对应的flow的标志:<br/><br/>FLOW_TO_SET_SEEN和FLOW_TO_SRC_SEEN,根据流标志设置包的流标志是否为FLOW_PKT_ESTABLISHED,<br/><br/>根据流标志设置包的标志对应的检测位<br/>]
L-->StreamTcp[StreamTCP]
StreamTcp-->SINFO[判断包是否需要效验,不需要则设置包的PKT_IGNORE_CHECKSUM标志]
StreamTcp-->Stream[StreamTcpPacket]
L-->Detect[Detect]
Flow-->|10|UP
UP-->|11|StreamTcp
StreamTcp-->|12|Detect
Detect-->|13|F
F-->|14|R
H-->R[ResponseReject]
H-->Log[日志输出模块]
Log-->1[file]
Log-->2[flieLog]
Log-->3[file_data]
Log-->4[Json]
4-->5[JsonAlertLog]
4-->6[JsonDnsLog]
4-->7[JsonDropLog]
4-->8[JsonEmailLog]
4-->9[JsonEmailLog]
4-->10[JsonFileLog]
4-->11[JsonFlowLog]
4-->12[JsonHttpLog]
4-->13[JsonNetFlowLog]
4-->14[JsonSmtpLog]
4-->15[JsonSshLog]
4-->16[JsonStatsLog]
4-->17[JsonTemplateLog]
4-->18[JsonTlsLog]
Log-->19[LuaLog]
Log-->20[PacketLog]
Log-->21[StatesLog]
Log-->22[StreamingLog]
Log-->23[TxLog]
R-->|15|Log
flowM[流管理线程]
flowM-->24[初始化线程变量]
flowM-->25[处理超时的流]
flowM-->26[紧急情况使用,资源不足时启用]
flowM-->27[退出时释放资源]
G-->|9|flowM
本文来自博客园,作者:{心亘久},转载请注明原文链接:https://www.cnblogs.com/zhaodejin/p/16135118.html

浙公网安备 33010602011771号