suricata 3.2 源码分析(IP数据包分片重组流程)

suricata 3.2 源码分析(IP数据包分片重组流程)
在网络通信中如果发送的IP包超过MTU值就会将IP包拆分成多个包发送。那么在suricata中对于这种拆分开得IP包又是如何处理的呢?下面我们一步一步来分析。 判断数据包是不是分片包是在DecedeIPV4这个函数中做的,具体位置是在 数据包解析模块->DecodeEthernet->DecedeIPV4 在DecedeIPV4这个函数中有如下一段代码: /* If a fragment, pass off for re-assembly. */ if (unlikely(IPV4_GET_IPO...

suricata 3.1 源码分析34 (FlowWorker处理流程3 – 流重用)

suricata 3.1 源码分析34 (FlowWorker处理流程3 – 流重用)
上一章提到了一个流重用的概念,这里主要说一下。根据code,所谓流重用仅仅重用了流的thread_id。其他内容都是新建流得来的,具体threa_id有什么作用以后看到了再分析,今天就说一下什么样的流可以被重用。 //这就是判断包所属的流是否能重用的函数 int TcpSessionPacketSsnReuse(const Packet *p, const Flow *f, const void *tcp_ssn) { if (p->proto == IPPROTO_TCP && p->tcph !...

suricata 3.1 源码分析33 (FlowWorker处理流程2 – FlowHandlePacket)

suricata 3.1 源码分析33 (FlowWorker处理流程2 – FlowHandlePacket)
void FlowHandlePacket(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p) { /* Get this packet's flow from the hash. FlowHandlePacket() will setup * a new flow if nescesary. If we get NULL, we're out of flow memory. * The returned flow is locked. */ //获取包对应的流,找不到就新建流,返回流指针,返回空说明内存不足 Flow *f = FlowGetFlowFromHash(tv, dtv...

suricata 3.1 源码分析32 (FlowWorker处理流程1)

suricata 3.1 源码分析32 (FlowWorker处理流程1)
TmEcode FlowWorker(ThreadVars *tv, Packet *p, void *data, PacketQueue *preq, PacketQueue *unused) { FlowWorkerThreadData *fw = data; /*FlowWorkerThreadInit中初始化,包含大量stats统计指标, decode指标在DecodeThreadVars中, tcp指标在StreamTcpThread中*/ void *detect_thread = SC_ATOMIC_GET(fw->detect_thread); //获取detect线程(3.1中的worker线程)的数据 S...

suricata 3.1 源码分析31 (RespondReject)

suricata 3.1 源码分析31 (RespondReject)
简介 RespondReject工作在worker线程,在FlowWorker模块之后对数据包进行处理。此处主要的作用是直接对符合过滤规则的数据包进行阻断并回复,从而使得数据包不会流入后续的操作模块。个人理解这点在IPS模式时会十分有用,可以阻断网络攻击、爬虫等。 原码分析 函数RespondRejectFunc只支持IPv4和IPv6的数据包回复,因此其中只调用了4个函数:RejectSendIPv4TCP、RejectSendIPv4ICMP、RejectSendIPv6TCP、R...

suricata 3.1 源码分析30 (packet_pool处理流程)

suricata 3.1 源码分析30 (packet_pool处理流程)
简介 suricata中的packet_poo是专门用于存放receive线程抓到的数据包的。 receive线程初始化时在TmThreadsSlotPktAcqLoop中调用PacketPoolInit来初始化它的packet_pool,并为packet_pool划分内存空间。默认是申请1024个packet结构大小的空间,以链表的开示存储。这里的packet_pool被记为“my_pool”,也就是receive的线程全局变量thread_pkt_pool。 worker线程初始化时在TmThreadsSlotVar中调用PacketPoolIn...

suricata 3.1 源码分析29 (数据包队列)

suricata 3.1 源码分析29 (数据包队列)
th,td,tr{border:1px solid #eee;text-align:center;padding:10px;}/* css注释:只对table标签设置红色边框样式 */ 这块的东西我现在还没有用到,所以很不厚道的抄了背着笔记本流浪的原文下来。 简介 Suricata中使用队列来缓存数据包,包括缓存线程模块内部新产生数据包的线程内队列,以及线程之间用来传递数据包的线程间队列。 用于表示数据包队列的结构体为PacketQueue,其定义如下(省略了调试相关字...

suricata 3.1 源码分析28 (数据包TCP解码)

suricata 3.1 源码分析28 (数据包TCP解码)
th,td,tr{border:1px solid #eee;text-align:center;padding:10px;}/* css注释:只对table标签设置红色边框样式 */ int DecodeTCP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq) { StatsIncr(tv, dtv->counter_tcp); if (unlikely(DecodeTCPPacket(tv, p,pkt,len) < 0)) { //调用DecodeTCPPacket完成实际的解码 SCLogD...

suricata 3.1 源码分析27 (数据包IPv4解码)

suricata 3.1 源码分析27 (数据包IPv4解码)
int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq) { StatsIncr(tv, dtv->counter_ipv4); SCLogDebug("pkt %p len %"PRIu16"", pkt, len); /* do the actual decoding */ if (unlikely(DecodeIPV4Packet (p, pkt, len) < 0)) { /* DecodeIPV4首先会调用完成实际解码的DecodeIPV4Packet函数,该函...
Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录