suricata 3.1 源码分析16 (流管理1)

suricata 3.1 源码分析16 (流管理1)
在suricata.c的main函数执行完RunModeDispatch之后会在判断是否使用UNIX_SOCKET中调用FlowManagerThreadSpawn创建流管理线程。 /** \brief spawn the flow manager thread */ void FlowManagerThreadSpawn() { #ifdef AFLFUZZ_DISABLE_MGTTHREADS return; #endif intmax_t setting = 1; (void)ConfGetInt("flow.managers", &setting); //从配置文件获取希望开开启的flowmanagers...

suricata 3.1 源码分析15 (流更新)

suricata 3.1 源码分析15 (流更新)
流更新 通过FlowWorker线程函数中调用FlowUpdate,FlowUpdate中又调用了FlowHandlePacketUpdate来更新流。 在获取到包所属的流后,接下来将根据这个包对流进行更新。 /** \brief Update Packet and Flow * * Updates packet and flow based on the new packet. * * \param f locked flow * \param p packet * * \note overwrites p::flowflags */ void FlowHandlePacketUpdate(Flow ...

suricata 3.1 源码分析14 (流查找分配)

suricata 3.1 源码分析14 (流查找分配)
流查找/分配 通过FlowWorker线程函数中调用FlowHandlePacket来找到流。 下面将按照FlowHandlePacket的流程,分析flow engine对于新送入的解码后的数据包是如何处理的。 对于一个Packet,首先在流表中查找其所属的流是否已经存在,若存在,则直接返回该流的引用即可,否则就需要分配一个新流。 该过程的实现由FlowGetFlowFromHash完成,函数会返回一个Flow指针,表示找到的或新分配的流。 /** \brief Get F...

suricata 3.1 源码分析13 (流初始化)

suricata 3.1 源码分析13 (流初始化)
简介 Suricata中用于管理和维护流的模块称为Flow Engine,主要由两部分实现,第一部分的入口点是FlowHandlePacket函数,用于为新数据包进行流查找/分配,另一部分是FlowManagerThread线程,用于对超时的流进行删除。 初始化 初始化在FlowInitConfig中完成,与之相关的配置结构体为FlowConfig,其字段含义如下: 字段含义hash_rand用于随机化hash table的分布,后面会介绍hash_size流表所使用的hash table...

centos7 部署shadowsocks服务端

centos7 部署shadowsocks服务端
首先说一下写这篇博客的原因,洒家最近告了个vps,无奈系统与业务不匹配,重装了多次。每次恢复shadowsocks找到的文档和方法都不尽相同。为了后续遇到类似情况不至再费诸多功夫,特意整合和参考的几篇文档。 1、关闭防火墙 #查看所有的可用服务 systemctl list-unit-files |grep service |grep enable #关闭服务 systemctl stop ipatables# 开机不启动 systemctl disable iptables 2、安装ShadowSocks ...

suricata 3.1 源码分析12

suricata 3.1 源码分析12
int engine_retval = EXIT_SUCCESS; while(1) { if (sigterm_count) { suricata_ctl_flags |= SURICATA_KILL; } else if (sigint_count) { suricata_ctl_flags |= SURICATA_STOP; } if (suricata_ctl_flags & (SURICATA_KILL | SURICATA_STOP)) { SCLogNotice("Signal Received. Stoppi...

suricata 3.1 源码分析11

suricata 3.1 源码分析11
/* Wait till all the threads have been initialized */ if (TmThreadWaitOnThreadInit() == TM_ECODE_FAILED) { SCLogError(SC_ERR_INITIALIZATION, "Engine initialization failed, " "aborting..."); exit(EXIT_FAILURE); } 等待子线程初始化完成。检查是否初始化完成的方式是遍历tv_root,调用TmThreadsCheckFlag检查子线程的状...

suricata 3.1 源码分析10

suricata 3.1 源码分析10
/* In Unix socket runmode, Flow manager is started on demand */ if (suri.run_mode != RUNMODE_UNIX_SOCKET) { /* Spawn the unix socket manager thread */ int unix_socket = 0; if (ConfGetBool("unix-command.enabled", &unix_socket) != 1) unix_socket = 0; if (unix_socket == 1) { Unix...

suricata 3.1 源码分析9

suricata 3.1 源码分析9
RunModeDispatch(suri.run_mode, suri.runmode_custom_mode) 初始化运行模式。首先,根据配置文件和程序中的默认值来配置运行模式(single、auto这些),而运行模式类 型(PCAP_DEV、PCAPFILE这些)也在之前已经确定了,因此运行模式已经固定下来,可以从runmodes表中获取到特定的RunMode 了,接着就调用RunMode中的RunModeFunc,进入当前运行模式的初始化函数。以PCAP_DEV类型下的autofp模式为例,该模...

suricata 3.1 源码分析8

suricata 3.1 源码分析8
CSetStartTime(&suri); 设置记录开始时间 SCDropMainThreadCaps(suri.userid, suri.groupid); 去除主线程的权限。这个是通过libcap-ng实现的,首先调用capng_clear清空所有权限,然后根据运行模式添加一些必要权限(主要是为了抓包),最后调用capng_change_id设置新的uid和gid。主线程的权限应该会被新建的子线程继承,因此只需要在主线程设置即可。 if (suri.run_mode != RUNMODE_UNIX_...
Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录