suricata 源码分析_02 程序流程

suricata 架构图

架构拆分

  1. 数据包队列处理
        在TmThreadCreate中调用TmqCreateQueue创建PackQueue,autofp模式下且输出队列为flow时,首先要看outqh的OutHandleCtxSetup是否设置,若设置了则会调用该函数去间接创建队列,否则直接调用了TmpCreateQueue创建。
  • 接收数据模块
1
2
3
4
5
6
PacketPool
TmThreadsSlotVarRun
tv->tmqh_out
数据包队列模块
TmThreadSlotProcessPkt
接收线程
接收数据包模块
解析数据包模块
循环抓包
初始化数据包模块
退出时释放资源
  • 数据包队列和流操作线程模块
        流程序号承接前文。
7
8
10
11
12
13
14
15
9
file
flieLog
file_data
Json
JsonAlertLog
JsonDnsLog
JsonDropLog
JsonEmailLog
JsonEmailLog
JsonFileLog
JsonFlowLog
JsonHttpLog
JsonNetFlowLog
JsonSmtpLog
JsonSshLog
JsonStatsLog
JsonTemplateLog
JsonTlsLog
LuaLog
PacketLog
StatesLog
StreamingLog
TxLog
初始化线程变量
处理超时的流
紧急情况使用,资源不足时启用
退出时释放资源
数据包队列模块
TmThreadsSlotVar
p=tv->tmqh_in
p=tv->tmqh_out
TmqhInputFlow
流操作线程
查找包对应的流_FowHandlePacket
FlowGetFlowFromHash,获取包对应的流,
找不到就新建流,返回流指针,返回空说明内存不足
如果p->flow_hash找不到对应的FlowBucket,
则新建flow挂到对应的bucket上,并通过参数dest返回
流操作
若遍历bucket链表找到对应的flow,
将当前flow放到bucket的flow->head,判断流重用,并通过参数dest返回
如果packet和bucket第一个flow匹配,
五元组和vlan相同,判断流重用,
并通过参数dest返回
p->flags=PKT_HAS_FLOW,设置包的标记为属于某条流
FlowWorker
根据包的信息更行对应的流
判断包的流向,并设置对应标志FLOW_PKT_TOSERVER,FLOW_PKT_TOCLIENT,
判断是不是第一个流向server或clent的包,并设置该包的标志对应的flow的标志:

FLOW_TO_SET_SEEN和FLOW_TO_SRC_SEEN,根据流标志设置包的流标志是否为FLOW_PKT_ESTABLISHED,

根据流标志设置包的标志对应的检测位
StreamTCP
判断包是否需要效验,不需要则设置包的PKT_IGNORE_CHECKSUM标志
StreamTcpPacket
Detect
Flow
ResponseReject
日志输出模块
流管理线程
posted @   心亘久  阅读(983)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示