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函数,该函...

suricata 3.1 源码分析26 (数据包VLAN解码)

suricata 3.1 源码分析26 (数据包VLAN解码)
由于VLAN可能嵌套,因此Packet结构体中使用以下相应字段进行记录: 字段含义vlan_idx当前的vlan层数,初始为0,最多为2,即最多只能嵌套一层VLAN,否则会报错。vlan_id[2]记录每一层的VLAN ID(共12位,可表示4096个VLAN),通过GET_VLAN_ID获得。vlanh[2]记录每一层的VLAN头指针(VLANHdr *类型)。 /** * \internal * \brief this function is used to decode IEEE802.1q packets * * \param tv...

suricata 3.1 源码分析24 (数据包解码模块执行)

suricata 3.1 源码分析24 (数据包解码模块执行)
/** * \brief This function passes off to link type decoders. * * DecodePcap reads packets from the PacketQueue and passes * them off to the proper link type decoder. * * \param t pointer to ThreadVars * \param p pointer to the current packet * \param data pointer that gets cast into PcapThreadVars for ptv * \param pq pointer to the current PacketQueue */...

suricata 3.1 源码分析23 (数据包解码模块注册及初始化)

suricata 3.1 源码分析23 (数据包解码模块注册及初始化)
th,td,tr{border:1px solid #eee;text-align:center;padding:10px;}/* css注释:只对table标签设置红色边框样式 */ 简介 Suricata的解码模块与数据包获取模块是一一对应的,例如DecodePcap对应ReceivePcap,DecodeAFP对应ReceiveAFP。 然而,我们知道数据包格式都是协议规定的,因此核心的数据包解码流程一定会是固定的。例如,对于常规的以太网包IPV4包TCP包,无非是DecodeEthernet->DecodeIPV4->...

suricata 3.1 源码分析22 (数据包处理2)

suricata 3.1 源码分析22 (数据包处理2)
对数据包进行进一步处理的TmThreadsSlotVarRun函数原型如下: TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p,TmSlot *slot) 按照函数头的注释说明,这个函数被从母函数中拉出来独立存在的原因是,为了能够对其进行递归调用。函数主流程是一个遍历所有slot的for循环, /** * \brief Separate run function so we can call it recursively. * * \todo Deal with post_pq for slots beyond t...
Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录