1. 程式人生 > 其它 >suricata 原始碼分析_02

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