suricata 源码分析_02 程序流程

suricata 架构图

架构拆分

  1. 数据包队列处理
        在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
posted @ 2022-04-12 16:32  心亘久  阅读(1100)  评论(0)    收藏  举报