我是靠谱客的博主 体贴太阳,最近开发中收集的这篇文章主要介绍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模式:


auto模式:


worker模式:


  

最后

以上就是体贴太阳为你收集整理的suricata中模式概念详解的全部内容,希望文章能够帮你解决suricata中模式概念详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部