snort源码分析 一 (整体说明)

简介

       snort 有三种工做模式:嗅探器、数据包记录器、网络入侵检测系统。嗅探器模式仅仅是从网络上读取数据包并做为接二连三的流显示在终端上。 数据包记录器模式把数据包记录到硬盘上。网路入侵检测模式是最复杂的,并且是可配置的。咱们可让 snort 分析网络数据流以匹配用户定义的一些规则, 并根据检测结果采起必定的动做。算法


功能介绍

       snort 有三种工做模式:嗅探器、数据包记录器、网络入侵检测系统。嗅探器模式仅仅是从网络上读取数据包并做为接二连三的流显示在终端上。 数据包记录器模式把数据包记录到硬盘上。 网路入侵检测模式是最复杂的, 并且是可配置的。 咱们可让 snort 分析网络数据流以匹配用户定义的一些规则, 并根据检测结果采起必定的动做。shell


嗅探器网络

      所谓的嗅探器模式就是 snort 从网络上读出数据包而后显示在你的控制台上。首先,咱们从最本的用法入手。若是你只要把 TCP/IP 包头信息打印在屏tcp

幕上,只须要输入下面的命令:源码分析

./snort -v

      使用这个命令将使 snort 只输出 IP 和 TCP/UDP/ICMP 的包头信息。 若是你要看到应用层的数据,可使用:性能

./snort -vd

       这条命令使 snort 在输出包头信息的同时显示包的数据信息。 若是你还要显示数据链路层的信息,就使用下面的命令:spa

./snort -vde

       注意这些选项开关还能够分开写或者任意结合在一块。 例如: 下面的命令就和上面最后的一条命令等价:插件

./snort -d -v –e


数据包记录器 命令行

       若是要把全部的包记录到硬盘上,你须要指定一个日志目录,snort 就会自动记录数据包:日志

./snort -dev -l ./log

      固然, ./log 目录必须存在, 不然 snort 就会报告错误信息并退出。 当 snort在这种模式下运行, 它会记录全部看到的包将其放到一个目录中, 这个目录以数据包目的主机的 IP 地址命名,例如:192.168.10.1 若是你只指定了-l 命令开关,而没有设置目录名, snort 有时会使用远程主

机的 IP 地址做为目录,有时会使用本地主机 IP 地址做为目录名。为了只对本地网络进行日志,你须要给出本地网络:

./snort -dev -l ./log -h 192.168.1.0/24

        这个命令告诉 snort 把进入 C 类网络 192.168.1 的全部包的数据链路、TCP/IP 以及应用层的数据记录到目录./log 中。

       若是你的网络速度很快, 或者你想使日志更加紧凑以便之后的分析, 那么应该使用二进制的日志文件格式。 所谓的二进制日志文件格式就是 tcpdump 程序使用的格式。使用下面的命令能够把全部的包记录到一个单一的二进制文件中:

./snort -l ./log -b

       注意此处的命令行和上面的有很大的不一样。 咱们勿需指定本地网络, 由于全部的东西都被记录到一个单一的文件。你也没必要冗余模式或者使用-d、-e 功能选项,由于数据包中的全部内容都会被记录到日志文件中。你可使用任何支持 tcpdump 二进制格式的嗅探器程序从这个文件中读出

数据包,例如:tcpdump 或者 Ethereal。使用-r 功能开关,也能使 snort 读出包的数据。snort 在全部运行模式下都可以处理 tcpdump 格式的文件。例如:若是你想在嗅探器模式下把一个 tcpdump 格式的二进制文件中的包打印到屏幕上,

能够输入下面的命令:

./snort -dv -r packet.log

      在日志包和入侵检测模式下,经过 BPF(BSD Packet Filter)接口,你可使用许多方式维护日志文件中的数据。 例如,你只想从日志文件中提取 ICMP 包,

只须要输入下面的命令行:

./snort -dvr packet.log icmp


网络入侵检测系统 

      snort 最重要的用途仍是做为网络入侵检测系统(NIDS), 使用下面命令行可

以启动这种模式:

./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

      snort.conf 是规则集文件。 snort 会对每一个包和规则集进行匹配, 发现这样的包就采起相应的行动。若是你不指定输出目录,snort 就输出到

/var/log/snort 目录。

注意: 若是你想长期使用 snort 做为本身的入侵检测系统,最好不要使用-v选项。由于使用这个选项,使 snort 向屏幕上输出一些信息,会大大下降 snort的处理速度,从而在向显示器输出的过程当中丢弃一些包。此外,在绝大多数状况下,也没有必要记录数据链路层的包头,因此-e 选项也能够不用:

./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf

这是使用 snort 做为网络入侵检测系统最本的形式,日志符合规则的包,

以 ASCII 形式保存在有层次的目录结构中。

    

结构说明

    以下图所示,snort符合基于模式的匹配的入侵检测系统的基本结构。

即:

  1. 嗅探网络中的数据包

  2. 拆包

  3. 筛选匹配

  4. 执行匹配上的对应动做 


流程说明

        结合上面的结构说明能够明确的理解snort运行的如下流程。

  1. 由于要嗅探因此要作好数据获取的准备工做。

  2. 插件是使snort更加灵活,譬如输出插件使snort能够选取多种日志输出方式。

  3. 规则链表则是用于匹配的规则的储存。

  4. 初始化快速匹配引擎则是为了使对配匹配的规则进行预处理,减小查找时间。

  5. 以上初始化完成后,就进入      获取包->拆包->匹配->动做->获取包...的持续处理过程当中。




总结

   综上所述,snort的关键在于两点:

  1. 灵活性-由于做为入侵检测系统须要与网络的发展同步跟进才能保证代码的功能,所以总体结构必需拥有较高的稳定性和健壮性。

  2. 算法-程序运行中匹配是很频繁的操做,所以良好的匹配筛选算法是该程序性能保证的必要条件。



参考文章

  1. 《snort中文手册》

  2. 《snort入侵检测系统源码分析》

相关文章
相关标签/搜索