我是
靠谱客的博主
体贴太阳,最近开发中收集的这篇文章主要介绍
suricata中模式概念详解,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
截止目前,结合开源中国中“背着笔记本流浪”的blog中文章,已经对main函数和数据包收取、解码有了初步了解。其中遇到的困难和疑惑的地方记录在这里,便于今后学习和提升。
1、网络编程知识经验不足,suricata整个架构采用多线程编程的方式,如若不了解线程的用法,理解起来会存在一些难度。
2、底层网络协议了解不够,需要日后补充下知识,感觉仅限了解的层面即可,至少可以看懂。
3、在收包过程中需要熟悉libpcap库的接口和用法。
今天根据前人的blog和源码的研读,对于数据包收取、解析等整个过程大致走了一遍,疑惑的地方记录如下:
1、suricata中用到大量的注册函数,至于其中精髓还不曾体会的到,目前只停留在表层能够读懂的阶段。
2、一个slot概念(“槽”),貌似不理解这个会对阅读代码产生一定影响。自己目前感觉就是为了注册数据包处理流程中的函数,具体用法日后有体会了再补充。
3、现在最大的一个疑惑就是对于“模式”概念的迷惑,suricata中貌似运行模式中又会细分各种模式,废话少说,还是停下来小结一下,便于自己理解。
● main()中调用RunModeRegisterRunModes()
● RunModeRegisterRunModes()函数中注册各种运行模式
RunModeIdsPcapRegister(); // IDS+pcap
RunModeFilePcapRegister(); // File+pcap
RunModeIdsPfringRegister(); // IDS+pfring
RunModeIpsIPFWRegister(); // IPS+ipfw
RunModeIpsNFQRegister(); // IPS+nfq
RunModeErfFileRegister(); // erf+file
RunModeErfDagRegister(); // erf+dag
RunModeNapatechRegister(); // napatech
RunModeIdsAFPRegister(); // IDS+AFP
RunModeUnixSocketRegister(); // UnixSocket
这些运行模式存储在runmodes数组中,定义如下:
static RunModes runmodes[RUNMODE_MAX];
其中数组大小RUNMODE_MAX定义为如下枚举类型:
enum {
RUNMODE_UNKNOWN = 0,
RUNMODE_PCAP_DEV,
RUNMODE_PCAP_FILE,
RUNMODE_PFRING,
RUNMODE_NFQ,
RUNMODE_IPFW,
RUNMODE_ERF_FILE,
RUNMODE_DAG,
RUNMODE_AFP_DEV,
RUNMODE_UNITTEST,
RUNMODE_NAPATECH,
RUNMODE_UNIX_SOCKET,
RUNMODE_MAX,
};
● 下面以pcap模式为例子说明注册操作内容
RunModeIdsPcapRegister()函数注册IDS+pcap模式,其余模式类似。
具体内容如下:
RunModeRegisterNewRunMode(RUNMODE_PCAP_DEV, "single",
"Single threaded pcap live mode",
RunModeIdsPcapSingle);
RunModeRegisterNewRunMode(RUNMODE_PCAP_DEV, "auto",
"Multi threaded pcap live mode",
RunModeIdsPcapAuto);
RunModeRegisterNewRunMode(RUNMODE_PCAP_DEV, "autofp",
"Multi threaded pcap live mode. Packets from "
"each flow are assigned to a single detect thread, "
"unlike "pcap_live_auto" where packets from "
"the same flow can be processed by any detect "
"thread",
RunModeIdsPcapAutoFp);
RunModeRegisterNewRunMode(RUNMODE_PCAP_DEV, "workers",
"Workers pcap live mode, each thread does all"
" tasks from acquisition to logging",
RunModeIdsPcapWorkers);
暂且不管这里函数作用,但这里可以看出运行模式又细分为四类:
single、auto、autofp、workers
● 这里具体看一下RunModeRegisterNewRunMode()函数作用
函数原型:
void RunModeRegisterNewRunMode(int runmode, const char *name,
const char *description,
int (*RunModeFunc)(DetectEngineCtx *))
函数作用:注册一个新的运行模式
函数参数:runmode是运行模式类型,对应于上面的枚举类型定义,例如:RUNMODE_PCAP_DEV。
name是每一种运行模式下面的自定义模式,为每一种运行模式的主键。
description是运行模式的描述。
RunModeFunc是运行该模式的具体函数。
● 下面回过头看一下RunModeIdsPcapRegister()函数中的四类自定义模式:
single : 单线程pcap live模式
auto :多线程pcap live模式
autofp :多线程pcap live模式,但每个流的数据包被分配到一个单一的detect线程(检测线程)。
不像auto模式中相同流的数据包会被分配到不同的detect线程处理。
workers:workers模式,每个线程完成从接收到日志记录等操作。
● 看到这里已经对运行模式基本了解,为了进一步了解模式操作,接着深入
存储运行模式的结构体定义如下:
typedef struct RunMode_ {
int runmode; // 对应RUNMODE_PCAP_DEV等
const char *name; // 对应autofp等
const char *description; // 描述
int (*RunModeFunc)(DetectEngineCtx *); // 处理函数
} RunMode;
typedef struct RunModes_ {
int no_of_runmodes;
RunMode *runmodes;
} RunModes;
● 接着具体看一下RunModeRegisterNewRunMode()函数的内容
RunModeGetCustomMode(runmode, name);// 参数对应于(RUNMODE_PCAP_DEV, "autofp")
// 函数作用貌似是判断自定义模式是否已经注册
// 这里意思是注册一种类型,动态添加一块内存。
runmodes[runmode].runmodes =
SCRealloc(runmodes[runmode].runmodes,(runmodes[runmode].no_of_runmodes + 1) * sizeof(RunMode));
// 指针数组用法
RunMode *mode = &runmodes[runmode].runmodes[runmodes[runmode].no_of_runmodes];
runmodes[runmode].no_of_runmodes++;
// 以下是填充具体内容
mode->runmode = runmode;
mode->name = SCStrdup(name);
mode->description = SCStrdup(description);
mode->RunModeFunc = RunModeFunc;
● 到这里为止,已经对“模式”的概念基本了解
suricata的运作模式是根据数据源的不同而区分,其中内部的自定义模式主要和程序架构有关,具体可以根据需求选择。
● 还有一些概念性的东西不明白,例如运行模式中ipfw、dag、napatech等概念,有时间再补充吧!
结合以上知识,再看http://blog.csdn.net/firedb/article/details/7581853中《Surciata源码分析之IpsNFQ模式》便很容易理解。
● 盗用链接中图片
autofp模式:
最后
以上就是体贴太阳为你收集整理的suricata中模式概念详解的全部内容,希望文章能够帮你解决suricata中模式概念详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复