suricata源码阅读main函数
- 格式:docx
- 大小:38.31 KB
- 文档页数:18
Suricata学习笔记Suricata学习笔记王丽波 2013.9 1.ItemIDS:Intrusion Detection System⼊侵检测系统IPS:Intrusion Prevention System⼊侵防御系统2.Suricata.yaml⽂件Action-orde1) PassIf a signature matches and contains pass, Suricata stops scanning the packet and skips to the end of all rules (only for the current packet).2) DropThis only concerns the IPS/inline mode.If the program finds a signature that matches, containing drop, it stops immediately. The packet will not be sent any further. Drawback: The receiver does not receive a message of what is going on, resulting in a time-out (certainly with TCP). Suricata generates an alert for this packet.3) RejectThis is an active rejection of the packet. Both receiver and sender receive a reject packet. There are two types of reject packets that will be automatically selected. If the offending packet concerns TCP, it will be a Reset-packet. For all other protocols it will be an ICMP-error packet. Suricata also generates an alert. When in Inline/IPS mode, the offending packet will also be dropped like with the 'drop' action.4) AlertIf a signature matches and contains alert, the packet will be treated like any other non-threatening packet, except for this one an alert will be generated by Suricata. Only the system administrator can notice this alert.Inline/IPS can block network traffic in two ways. One way is by drop and the other by reject.Log output for use with Barnyard (unified.log)This log is designed to be stored in a binary format on the hard disc, where it will be further processed by Barnyard. Barnyard can store the output in a database, so Suricata can work on other important tasks. Barnyard can add the files in the Mysql-database, send them to Sguil or several other output options.There is a size-limit to the log-file: If Suricata generates an alert, it stores this alert in a unified-file. Suricata keeps continuing doing that, until the file has reached its limit. Which in the default case is at 32 MB. At that point Suricata generates a new file and the process starts all over again. Barnyard keeps on processing these files. To prevent Suricata from filling up the hard disc, a size limit is enforced. When the limit is reached, the file will 'role-over', creating a new file. Barnyard removes old files. To every file, Suricata adds a time stamp, so it is easy to see which one came first and which one is the latter.A line based log of HTTP requests (http.log)This log keeps track of events happening in the HTTP-traffic. It contains the HTTP request, the host-name, URI and the user-agent. This information will be stored as a http.log file in the default logging directory.Packet log (pcap-log)With the pcap-log option you can save all packets, that are registered by Suricata, in a log file named log.pcap. This way, you can take a look at all packets whenever you want.Threading1The decode module decodes the packets and the stream application layer performs its job here. The stream application layer has three tasks:First: it performs stream-tracking, meaning it is making sure all steps will be taken to make a correct network-connection. Second: TCP-network traffic comes in as packets. The Stream-Assembly engine reconstructs the original stream. Finally: the application layer will be inspected. HTTP and DCERPC will be analyzed.2The detection threads will compare signatures. There can be several detection threads so they can operate simultaneously. Example 7 Balancing workloadcpu_affinity:- management_cpu_set:cpu: [ 0 ] #Set the CPU('s) you want to process this set/thread.- receive_cpu_set:cpu: [ 0 ]- decode_cpu_set:cpu: [ 0, 1 ]mode: "balanced" #Can be set at 'balanced' and 'exclusive'.- stream_cpu_set:cpu: [ "0-1" ]- detect_cpu_set:cpu: [ "all" ]mode: "exclusive"prio:low: [ 0 ]medium: [ "1-2" ]high: [ 3 ]default: "medium"- verdict_cpu_set:cpu: [ 0 ]prio:- reject_cpu_set:cpu: [ 0 ]prio:default: "low"- output_cpu_set:cpu: [ "all" ]prio:default: "medium"IP DefragAt the moment Suricata receives a fragment of a packet, it keeps in memory that other fragments of that packet will appear soon to complete the packet. However, there is a possibility that one of the fragments does not appear. To prevent Suricata for keeping waiting for that packet (thereby using memory) there is a timespan after which Suricata discards the fragments. This occurs by default after 60 seconds.defrag:max-frags: 65535prealloc: yestimeout: 60Packet AcquisitionPf-ringThe Pf_ring is a library that aims to improve packet capture performance over libcap. It performs packet acquisition.There are three options within Pf_ring: interface, cluster-id and cluster-type.pfring:interface: eth0 # In this option you can set the network-interface# on which you want the packets of the network to be read.Pf_ring will load balance packets based on flow. All packet acquisition threads that will participate in the load balancing need to have the same cluster-id. It is important to make sure this ID is unique for this cluster of threads, so that no other engine / program is making use of clusters with the same id.cluster-id: 99Pf_ring can load balance traffic using pf_ring-clusters. All traffic for pf_ring can be load balanced in one of two ways, in a round robin manner or a per flow manner that are part of the same cluster. All traffic for pf_ring will be load balanced across acquisition threads of the same cluster id.The cluster_round_robin manner is a way of distributing packets one at a time to each thread (like distributing playing cards to fellow players). The cluster_flow manner is a way of distributing all packets of the same flow to the same thread. The flows itself will be distributed to the threads in a round-robin manner.cluster-type: cluster_round_robin附录1:AutoMake学习笔记1.安装autoconf⼯具#sudo apt-get install autoconf2.AutoMake的流程1. 在存放源代码的⽬录下执⾏autoscan命令⽣成configure.scan⽂件。
suricata命令行选项说明你能两种方式使用命令行选项,用一个横杠后面跟一个字符,或两个横杠后面跟一个单词,例如:-a--long-option-c 这个选项是最重要的选项。
在-c之后,要输入suricata.yaml文件所在的路径。
-i 这个选项之后中,你要输入你想用来抓包的网卡名称。
这个参数关联网卡使用libpcap在pacp live模式下抓包。
-r 在这个选项之后,你可以输入记录数据的抓包文件的路径和文件名。
可以在pcap/offline模式下,在这个文件中查看包数据。
-s在这个选项之后,你可以设置一个说明名文件,这个文件将与yaml中设置的rules文件集一起载入使用。
-l在这个选项之后,你可设置一个默认的日志文件夹。
如果已在yaml文件中设置了默认的日志文件夹(default-log-dir),只有-l后的选项参数起做用。
如果不使用-l选项,则使用yaml中设置的默认值。
-D 一般情况下你使用终端窗口运行suricata,这个终端窗口会被suricata占用,你不能使用终端窗口处理其他工作,将关闭窗口时suricata也被关闭。
如果你使用-D选项,使用suricata成为一个后台运行的进程,在他运行时,你可能使用终端窗口干其他的事而不会影响suricata运行。
--list-runmodes 使用该选项将列出所有可能的运行模式。
--runmode该选项与-i或-r选项联合使用。
用这个选项你可以设置suricate工作于你所选择的运行模式。
该选项的值可以覆盖yaml文件中设置的运行模式。
将于运行模式请看有关runmodes的更多信息。
-u该选项用于运行单元测试,测试suricata代码。
-U 该选项用于选择能运行哪一个单元测试。
这个先项可以使用正则表达式。
例如Suricata –u –U http--list-unittests,该选项用于例出可用的单元测试。
--fatal-unittests,使用该选项,当一个单元测试失败后能立即停止,以便于立即查看错误信息。
suricata学习笔记1. 参考资料:(1)suricata架构——数据结构和代码流程图解(这⾥⾯⼏张图很不错,⽅便结构理解,另外解释了⾏锁,全局的nf_conntrack_lock)⾏锁:⾏级锁哈希表则每⼀⾏都有⼀把锁,内存开销⼤,实现复杂,但是在⼤并发,⾼效率的后台服务程序中使⽤⾮常⼴泛。
suricata针对snort单线程处理数据包,⽆法很好利⽤多核cpu的劣势,开发了多线程架构⽅式并发处理数据包,⽽很多数据是线程间共享,所以在很多地⽅使⽤⾏级锁哈希表等其他⾼效数据结构。
全局的nf_conntrack_lock:⽤于保护全局会话表(2)suricata 源码分析之⾏锁连接管理的哈希表:FlowBucket *flow_hash。
其为链式哈希表(数组每个元素存放⼀个链表⾸地址,⼀个链表为⼀个桶。
输⼊⼀个数据,函数h将其转化为整型数据k,根据k处理得到数组元素指向的桶,在桶(链表)中执⾏插⼊或删除操作。
)。
flow_hash 是⼀个数组,每个FlowBucket 元素由 head 、tail和flow的hnext、hprev 构成⼀个双向链表,也就是所谓的⾏。
该哈希的⾏数由配置⽂件或者默认值决定(flow_config.hash_size)flow_hash = SCCalloc(flow_config.hash_size, sizeof(FlowBucket));使⽤接⼝如下,以下两个函数的返回成功的话,会对该节点加锁保护,也是⽤来并发访问;并且都会将当前的这个节点放在该⾏的第⼀个节点,作为缓存假定其为最活跃的、近期最可能被访问的内容。
FlowGetFlowFromHash:通过数据包的信息获取连接,如果哈希表中没有,则创建flow;作⽤:先计算出该数据包对应的flow的哈希值,然后通过哈希值去定位到某⼀⾏,再对该⾏加锁,此时,flow_hash的其他⾏可以访问的,如果这⼀⾏不为空,再去遍历者这个链表(⾏),如果已经存在,对该链表节点加锁、解锁⾏锁返回,如果没有创建节点插⼊链表,对该链表节点加锁、解锁⾏锁返回,如果这⼀⾏为空,创建节点插⼊链表,对该链表节点加锁、解锁⾏锁返回。
matlab unique源码MATLAB是一个非常强大的数据处理和编程语言。
它内置了许多有用的函数和工具包,其中一个非常重要的函数就是unique函数。
本文将介绍MATLAB中unique函数的实现详解。
1. unique函数的作用unique函数是MATLAB中非常常用的函数之一。
它的功能是将矩阵或向量中的重复元素去除,只保留其中的一个。
unique函数的语法是:[C,IA,IC] = unique(A)其中,A是一个输入的矩阵或向量,C是去重后的矩阵或向量,IA是A对应的索引向量,IC是C对应的索引向量。
2. unique函数的源码实现unique函数的源码实现较为复杂,大致流程如下:(1) 首先对输入的矩阵或向量A进行排序,这里采用了MATLAB 内置的sort函数进行排序。
(2) 然后依次比较相邻的元素,找出重复的元素。
(3) 最后将重复的元素去重,只保留其中的一个。
下面是MATLAB unique函数的源码实现:function [C,IA,IC] = unique(A)% 将A排序[ASorted,ind]=sort(A(:));% 寻找重复元素d=[true;diff(ASorted)>0];C=ASorted(d);% 记录C中元素的位置IC=accumarray(cumsum(d),ind,[],@min);% 生成IA向量if nargout>1IA=zeros(size(A),'like',A);IA(ind(d))=1:numel(C);IA=IA+IC-1;endend以上代码中,第一行是定义函数并声明返回值。
第2到5行是将输入的矩阵或向量进行排序;第7到9行是寻找重复元素;第11和12行是记录C中元素的位置;第14到18行是生成IA向量。
3. unique函数的优化unique函数的源码实现虽然能够实现去重的功能,但是计算量大,时间效率比较低。
matlab中main函数在 MATLAB 中,main 函数可以用来规定程序的主入口点,是整个程序运行的核心。
在 main 函数中,我们可以定义各种变量、调用其他函数、完成各种算法的计算等。
下面就来详细了解一下 MATLAB 中 main 函数的相关知识。
一、什么是 main 函数main 函数是 C/C++ 语言中的一个概念,在 MATLAB 中同样存在main 函数的概念。
main 函数是一个程序的入口点,是程序开始执行的地方。
在 MATLAB 中,程序会按照 main 函数所在的文件的文件名来确定程序名。
二、如何定义 main 函数在 MATLAB 中,main 函数的定义形式为:function [输出参数] = main(输入参数)% 函数体end其中,输出参数和输入参数都是可选的,函数体中可以包含各种计算和操作。
三、main 函数的作用在 MATLAB 中,main 函数的作用很多。
一般来说,main 函数会负责完成以下几项任务:1. 定义程序所需要的变量,包括输入参数、输出参数和其他需要使用的变量。
2. 调用其他函数或脚本文件,完成各种计算和操作,包括数据的读取、处理、展示等。
3. 完成程序的需要的算法计算等操作。
4. 打开GUI窗口或者在命令行中输出结果。
四、main 函数的使用方法在使用 main 函数时,我们需要注意以下几点:1. main 函数必须保存在与程序名相同的.m文件中,这是MATLAB 编译器的要求。
2. 在 main 函数中,我们可以调用其他的函数或者脚本文件,在这些函数或者脚本文件中可以定义其他变量和算法操作,以达到分模块、分层次的程序设计目的。
3. main 函数可以在命令行中执行,也可以被其他函数或脚本文件调用。
在被其他函数或脚本文件调用时,main 函数可以作为一个子函数来运行。
4. main 函数可以接收输入参数和输出参数,以实现程序的输入和输出功能。
suricata 源码编译
Suricata是一款强大的网络安全工具,可以帮助用户进行威胁检测和网络监测任务。
为了更好地进行自定义配置和优化,您可以选择从源代码编译安装Suricata。
首先,您需要下载Suricata源代码。
您可以通过搜索引擎找到官方网站然后下载最新版本。
解压缩文件后,使用终端进入Suricata 文件夹。
在终端运行 "./configure" 命令,此时会提示您操作系统正在运行的类型和版本,并自动检测系统上已安装的库和程序。
如果出现错误,请安装系统所需的缺失库文件。
接下来,在终端输入 "make" 命令开始构建Suricata代码。
如果出现错误,请检查是否有缺失库或程序,或者请在各大社区中搜索解决方案。
最后,在终端输入 "make install" 安装Suricata。
安装完成后,您可以在系统上使用Suricata工具。
通过源代码编译安装Suricata可以让您更加灵活地进行定制和使用。
需要注意的是,在编译时遇到的错误一般都与库或程序的缺失有关。
如果您不确定自己的系统是否能够支持Suricata,请在社区中搜索相关信息或查阅官方文档。
答案:Suricata是一款开源的高性能网络安全引擎,主要用于网络入侵检测(IDS)和网络入侵防御(IPS)。
其代码库采用C语言编写,模块化设计,易于扩展和定制。
Suricata 基于多线程和事件驱动架构,能够实现高性能的数据包处理和检测。
通过对Suricata代码的解读,我们可以深入了解其工作原理和实现细节,从而更好地应用和优化这一强大的网络安全工具。
一、Suricata概述--------Suricata是一款由Open InfoSec Foundation开发和维护的开源网络安全引擎。
它支持多种操作系统和硬件平台,可以部署在各种网络环境中,为网络提供实时的入侵检测和防御能力。
Suricata具有丰富的功能,包括高性能的数据包捕获和处理、灵活的规则配置、多种协议解析和检测、用户自定义插件等。
这些功能使得Suricata成为网络安全领域的一款重要工具。
二、Suricata代码结构----------Suricata的代码库采用C语言编写,遵循模块化设计原则,将不同的功能划分为独立的模块。
主要的模块包括数据包捕获、协议解析、规则解析、检测引擎、日志输出等。
每个模块都有明确的接口和功能,便于扩展和定制。
此外,Suricata还提供了丰富的插件接口,用户可以根据需要开发自己的插件,实现特定的功能。
三、数据包捕获和处理----------Suricata使用libpcap库实现数据包捕获。
在启动时,Suricata会创建一个或多个捕获线程,每个线程负责监听一个网络接口。
当数据包到达时,捕获线程会将数据包从内核空间复制到用户空间,并交给处理线程进行处理。
处理线程会对数据包进行一系列的解析和检测操作,包括协议解析、规则匹配、异常检测等。
四、协议解析------Suricata支持多种协议的解析和检测,包括TCP、UDP、ICMP、HTTP、SSL/TLS等。
每种协议都有对应的解析模块,负责将数据包解析为对应的协议格式,并提取关键的信息供检测引擎使用。
suricata 编译Suricata是一种高性能的网络安全监控系统,它可以通过深度包检测和多种协议支持来检测各种网络威胁。
本文将介绍如何编译Suricata 并安装它以进行网络安全监控。
编译 Suricata 的前提条件包括以下几点:1. 安装 libpcap、libpcre、libyaml、libjansson 和libnetfilter_queue 等库。
2. 下载 Suricata 的源码包并解压它。
3. 进入解压后的 Suricata 目录,使用以下命令进行编译:```$ ./configure --prefix=/usr/local/suricata$ make && make install```在编译过程中,可以通过添加一些选项来自定义 Suricata 的特性。
例如,添加 --enable-lua 选项可以启用对 Lua 脚本的支持。
编译完成后,可以使用以下命令启动 Suricata:```$ /usr/local/suricata/bin/suricata -c/usr/local/suricata/etc/suricata/suricata.yaml -i eth0```其中,-c 选项指定了 Suricata 的配置文件路径,-i 选项指定了要监控的网络接口。
除了使用命令行启动 Suricata 外,还可以将它作为系统服务来启动。
这需要创建一个 systemd 单元文件,并将其放置在/etc/systemd/system 目录下。
以下是一个示例的 Suricata systemd 单元文件:```[Unit]Description=Suricata Network Security Monitoring[Service]Type=simpleExecStart=/usr/local/suricata/bin/suricata -c/usr/local/suricata/etc/suricata/suricata.yaml -i eth0Restart=on-failure[Install]WantedBy=multi-user.target```在创建完 systemd 单元文件后,可以使用以下命令启动Suricata 服务:```$ sudo systemctl start suricata```此外,还可以使用 stop、restart、enable 和 disable 命令来停止、重启、开机启动和关闭 Suricata 服务。
python 匹配suricata规则(原创版)目录1.Suricata 简介2.Python 与 Suricata 的结合3.使用 Python 匹配 Suricata 规则的方法4.实际应用案例5.总结正文【1.Suricata 简介】Suricata 是一款开源的网络安全监测工具,可以用于检测入侵、异常行为和其他安全威胁。
它具有高度可定制的规则引擎,可以根据需求进行定制和扩展。
Suricata 在网络安全领域被广泛应用,其强大的功能和灵活的规则引擎使其成为安全专家的首选工具之一。
【2.Python 与 Suricata 的结合】Python 作为一门广泛应用于数据处理和网络编程的语言,可以方便地与 Suricata 进行结合。
通过 Python 编写的脚本可以实现对Suricata 规则的定制和匹配,从而提高安全监测的效率和准确性。
Python 的易用性和丰富的库资源,使得开发者可以快速地开发出功能强大的安全监测系统。
【3.使用 Python 匹配 Suricata 规则的方法】Python 与 Suricata 的结合可以通过 Python 的 socket 库实现。
首先,需要建立一个到 Suricata 的连接,然后通过发送规则和数据包进行匹配。
具体步骤如下:1.导入 socket 库2.建立到 Suricata 的连接3.发送规则4.发送数据包5.接收匹配结果通过以上步骤,Python 可以实现对 Suricata 规则的匹配。
在实际应用中,需要根据需求编写相应的 Python 脚本,以实现对 Suricata 规则的灵活定制和匹配。
【4.实际应用案例】例如,在检测网络中的恶意软件行为时,可以通过 Suricata 的规则引擎进行匹配。
首先,需要编写一个 Python 脚本,用于发送恶意软件的特征数据包给 Suricata。
然后,Suricata 根据规则进行匹配,如果匹配成功,则返回相应的告警信息。
suricata 手册Suricata是一种网络安全工具,它能够在网络上检测恶意行为,从而保障网络的安全。
为了使Suricata更加易于使用,开发团队编写了一份详细的手册。
该手册提供了有关Suricata的基本概念、使用方法和技术细节的全面信息。
本文将提供一份关于Suricata手册的详尽说明。
第一部分:概述Suricata是一种用于网络安全的自由、开源软件,由Open Information Security Foundation(OISF)维护开发。
Suricata的主要功能是在网络上进行威胁检测和流量分析。
它可以检测高级威胁,包括网络钓鱼、网络蠕虫、恶意软件等。
Suricata采用多线程架构,能够快速并发地处理高速网络流量。
它支持各种协议和格式,包括TCP、UDP、ICMP、HTTP和FTP等等。
此外,Suricata还提供了HTTP和SMTP协议的深度检测功能,能够检测协议规范违规等问题。
第二部分:手册内容Suricata手册的主要内容包括以下几个方面:1.安装和配置:该部分提供了关于安装Suricata的详细说明,包括从源码编译、二进制包下载等多种方式,同时提供了配置文件中各项参数的详细解释。
2.规则集:该部分介绍了Suricata的主要规则集,包括Emerging Threats、Snort等,同时提供了规则的详细解释,方便用户进行修改和自定义。
3.使用实例:该部分提供了关于Suricata如何进行流量分析和威胁检测的详细说明,包括命令行参数、日志输出等。
4.技术细节:该部分提供了Suricata的一些技术细节,包括多线程架构、协议支持等等。
第三部分:使用建议以下是一些关于使用Suricata的建议:1.建议阅读完整手册,了解Suricata的基本概念和使用方法。
2.建议使用最新版本的Suricata,保证软件的稳定性和安全性。
3.根据实际需求进行配置,以达到最优化的效果。
4.建议使用多个规则集,并且根据实际情况进行自定义。
main()函数位于suricata.c文件,其主要流程如下:1. 定义并初始化程序的全局实例变量。
•SCInstance类型的suri变量用来保存程序当前的一些状态、标志等上下文环境,通常是用来作为参数传递给各个模块的子函数,因此为了更好的封装性而放到一个结构体变量中,而不是使用零散的长串参数或一堆全局变量。
•SCInstanceInit函数,顾名思义,即是对suri中各个字段进行初始化。
注意,这里对所有字段都进行了显示初始化,因为虽然一个memset清零已经基本达到目的了,但显示地将各个成员设成0/NULL/FALSE对于可读性来说还是有好处的,可以明确地说明各个字段的初始值,且对扩展性也会有好处,例如若后续初始化需要设置一些非0值(如用-1表示无效值),直接更改就好了。
2. 初始化sc_set_caps为FALSE –> 标识是否对主线程进行特权去除(drop privilege),主要是出于安全性考虑。
3. 初始化原子变量engine_stage –> 记录程序当前的运行阶段:SURICATA_INIT、SURICATA_RUNTIME、SURICATA_FINALIZE4. 初始化日志模块,因为后续的执行流程中将使用日志输出,所以需要最先初始化该模块。
5. 设置当前主线程名字为“Suricata-Main”。
线程名字还是挺重要的,至少在gdb调试时info threads可以看到各个线程名,从而可以精确地找到想要查看的线程。
另外,在top -H 时,也能够显示出线程名字(然而ps -efL时貌似还是只是显示进程名)。
6. 初始化ParserSize模块–> 使用正则表达式来解析类似“10Mb”这种大小参数,其中正则引擎用的是pcre,因此初始化时就是调用pcre_compile、pcre_study对已经写好的正则表达式进行编译和预处理。
7. 注册各种运行模式。
Suricata对“运行模式”这个概念也进行了封装。
运行模式存储在runmodes数组中,定义为RunModes runmodes[RUNMODE_USER_MAX]。
•首先,数组中每一项(例如runmodes[RUNMODE_PCAP_DEV]),对应一组运行模式,模式组包括(RunModes类型):“IDS+Pcap”模式组、“File+Pcap”模式组、“UnixSocket”模式组等(另外还有其他一些内部模式,如:“列出关键字”模式、“打印版本号”模式等,这些没有存储在runmodes数组中)。
•然后,每一个模式组,其中可以包含若干个运行模式(RunMode类型),例如:single、auto、autofp、workers。
•运行模式的注册,则是为各个模式组(如RunModeIdsPcapRegister)添加其所支持的运行模式(通过调用RunModeRegisterNewRunMode),并定义改组的默认运行模式,以及非常重要的:注册各个模式下的初始化函数(如RunModeIdsPcapSingle),等后续初始化阶段确定了具体的运行模式后,就会调用这里注册的对应的初始化函数,对该模式下的运行环境进行进一步配置。
8. 初始化引擎模式为IDS模式。
引擎模式只有两种:IDS、IPS,初始默认为IDS,而在nfq 或ipfw启用时,就会切换成IPS模式,该模式下能够执行“Drop”操作,即拦截数据包。
9. 初始化配置模块,为配置节点树建立root节点。
10. 解析命令行参数。
其中,与包捕获相关的选项(如“-i”)都会调用LiveRegisterDevice,以注册一个数据包捕获设备接口(如eth0)。
全局的所有已注册的设备接口存储在变量live_devices中,类型为LiveDevice。
注意,用多设备同时捕获数据包这个特性在Suricata 中目前还只是实验性的。
“-v”选项可多次使用,每个v都能将当前日志等级提升一级。
11. 若运行模式为内部模式,则进入该模式执行,完毕后退出程序。
12. FinalizeRunMode,即为运行模式的处理划上句号。
主要是设置offline标志、对unknown 运行模式进行报错,以及设置全局的run_mode变量。
13. 若运行模式为单元测试模式,则跑(用户通过正则表达式指定的)单元测试,并输出测试结果。
14. 检查当前模式是否与daemon标志冲突。
Pcap文件模式及单元测试模式都不能在daemon开启下进行。
15. 初始化全局变量。
包括:数据包队列trans_q、数据队列data_queues(干嘛的?)、对应的mutex和cond、建立小写字母表。
16. 初始化时间。
包括:获取当前时间所用的spin lock,以及设置时区(调用tzset()即可)。
17. 为快速模式匹配注册关键字。
调用SupportFastPatternForSigMatchList函数,按照优先级大小插入到sm_fp_support_smlist_list链表中。
18. 若用户未在输入参数中指定配置文件,则使用默认配置文件(/etc/suricata/suricata.yaml)。
19. 调用LoadYamlConfig读取Yaml格式配置文件。
Yaml格式解析是通过libyaml库来完成的,解析的结果存储在配置节点树(见conf.c)中。
对include机制的支持:在第一遍调用ConfYamlLoadFile载入主配置文件后,将在当前配置节点树中搜寻“include”节点,并对其每个子节点的值(即通过include语句所指定的子配置文件路径),同样调用ConfYamlLoadFile进行载入。
20. 再次初始化日志模块。
这次,程序将会根据配置文件中日志输出配置(logging.outputs)填充SCLogInitData类型的结构体,调用SCLogInitLogModule重新初始化日志模块。
21. 打印版本信息。
这是Suricata启动开始后第一条打印信息。
22. 打印当前机器的CPU/核个数,这些信息是通过sysconf系统函数获取的。
23. 若运行模式为DUMP_CONFIG,则调用ConfDump打印出当前的所有配置信息。
ConfDump通过递归调用ConfNodeDump函数实现对配置节点树的DFS(深度优先遍历)。
24. 执行PostConfLoadedSetup,即运行那些需要在配置载入完成后就立马执行的函数。
这里面涉及的流程和函数非常多:•MpmTableSetup:设置多模式匹配表,该表中每一项就是一个实现了某种多模式匹配算法(如WuManber、AC)的匹配器。
以注册AC匹配器为例,MpmTableSetup会调用MpmACRegister函数实现AC注册,函数内部其实只是填充mpm_table中对应AC的那一项(mpm_table[MPM_AC])的各个字段,如:匹配器名称("ac")、初始化函数(SCACInitCtx)、增加模式函数(SCACAddPatternCS)、实际的搜索执行函数(SCACSearch)。
•设置rule_reload标志。
如果配置文件中对应选项打开,则会设置该标志,表示可以进行“规则热重载”,即能够在程序运行时载入或替换规则集。
•AppLayerDetectProtoThreadInit:初始化应用层协议检测模块。
其中,AlpProtoInit函数初始化该模块所用到的多模式匹配器,RegisterAppLayerParsers函数注册各种应用层协议的解析器(如RegisterHTPParsers函数对应HTTP协议),而AlpProtoFinalizeGlobal函数完成一些收尾工作,包括调用匹配器的预处理(Prepare)函数、建立模式ID和规则签名之间的映射等。
•AppLayerParsersInitPostProcess:这个函数内部建立了一个解析器之间的映射,还不太懂其用途。
•设置并验证日志存储目录是否存在。
若配置文件中未指定,则使用默认目录,linux下默认为/var/log/suricata。
•获取与包捕获相关的一些配置参数,目前包括:max-pending-packets、default-packet-size。
•设置host_mode(主机模式),两种模式:router和sniffer-only,而如果设置为“auto”,则会进行自动选择:IPS模式下运行为router,否则为sniffer-only。
•SCHInfoLoadFromConfig:从配置文件中载入host os policy(主机OS策略)信息。
网络入侵通常是针对某些特定OS的漏洞,因此如果能够获取部署环境中主机的OS信息,肯定对入侵检测大有裨益。
具体这些信息是怎么使用的,暂时也还不清楚。
•DefragInit:初始化IP分片重组模块。
•SigTableSetup:初始化检测引擎,主要是注册检测引擎所支持的规则格式(跟Snort规则基本一致)中的关键字,比如sid、priority、msg、within、distance等等。
•TmqhSetup:初始化queue handler(队列处理函数),这个是衔接线程模块和数据包队列之间的桥梁,目前共有5类handler:simple, nfq, packetpool, flow,ringbuffer。
每类handler内部都有一个InHandler和OutHandler,一个用于从上一级队列中获取数据包,另一个用于处理完毕后将数据包送入下一级队列。
•StorageInit:初始化存储模块,这个模块可以用来临时存储一些数据,数据类型目前有两种:host、flow。
具体在何种场景下用,目前未知。
•CIDRInit:初始化CIDR掩码数组,cidrs[i]对应前i位为1的掩码。
•SigParsePrepare:为规则签名解析器的正则表达式进行编译(pcre_compile)和预处理(pcre_study)。
•SCPerfInitCounterApi:初始化性能计数器模块。
这个模块实现了累加计数器(例如统计收到的数据包个数、字节数)、平均值计数器(统计平均包长、处理时间)、最大计数器(最大包长、处理时间)、基于时间间隔的计数器(当前流量速率)等,默认输出到日志目录下的stats.log文件。
•几个Profiling模块的初始化函数。
Profiling模块提供内建的模块性能分析功能,可以用来分析模块性能、各种锁的实际使用情况(竞争时间)、规则的性能等。
•SCReputationInitCtx:初始化IP声望模块。
IP声望数据在内部是以Radix tree的形式存储的,但目前还不知道数据源是从哪来的,而且也没看到这个模块的函数在哪调用。