【实验目的】
掌握Snort3的基本配置与三种工作模式的应用。
【知识点】
snort3,规则配置与工作模式
【实验原理】
在1998年,Martin Roesch用C语言开发了开放源代码(Open Source)的入侵检测系统Snort。Snort已发展成为一个具有多平台(Multi-Platform)、实时(Real-Time)流量分析、网络IP数据包(Pocket)记录等特性的强大的网络入侵检测/防御系统(Network Intrusion Detection/Prevention System),即NIDS/NIPS。Snort符合通用公共许可(GPL------GNU General Public License),在网上可以通过免费下载获得Snort,并且只需要几分钟就可以安装并开始使用。
Snort有三种工作模式:嗅探器、数据包记录器、网络入侵检测系统。嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。数据包记录器模式把数据包记录到硬盘上。网络入侵检测模式是最复杂的,而且是可配置的。我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。

Snort能够对网络上的数据包进行抓包分析,但区别于其它嗅探器的是,它能根据所定义的规则进行响应及处理。Snort 通过对获取的数据包,进行各规则的分析后,根据规则链,可采取Activation(报警并启动另外一个动态规则链)、Dynamic(由其它的规则包调用)、Alert(报警),Pass(忽略),Log(不报警但记录网络流量)五种响应的机制。
Snort有数据包嗅探,数据包分析,数据包检测,响应处理等多种功能,每个模块实现不同的功能,各模块都是用插件的方式和Snort相结合,功能扩展方便。例如,预处理插件的功能就是在规则匹配误用检测之前运行,完成TIP碎片重组,http解码,telnet解码等功能,处理插件完成检查协议各字段,关闭连接,攻击响应等功能,输出插件将得理后的各种情况以日志或警告的方式输出。
Snort通过在网络TCP/IP的5层结构的数据链路层进行抓取网络数据包,抓包时需将网卡设置为混杂模式,根据操作系统的不同采用libpcap或winpcap函数从网络中捕获数据包;然后将捕获的数据包送到包解码器进行解码。
Snort 三种工作模式(必须熟练掌握其区别)
| 模式 | 核心功能 | 输出/动作 | 命令示例 (关键参数) |
|---|---|---|---|
| 嗅探器模式 | 将捕获的数据包实时显示 在终端上。用于网络流量监控和分析。 | 屏幕输出(类似tcpdump)。 |
snort -i <网卡> -v(只输出头部) snort -i <网卡> -vd(输出头部+数据) |
| 数据包记录器模式 | 将捕获的数据包记录到硬盘 (二进制pcap格式)。用于事后分析、取证。 | 生成pcap日志文件(默认在/var/log/snort)。 |
snort -i <网卡> -l /var/log/snort snort -i <网卡> -K ascii(以ASCII格式记录) |
| 网络入侵检测/防御模式 | 核心模式 。根据预定义的规则集 分析流量,发现攻击并响应(报警、记录、阻断等)。 | 生成报警日志(如alert.ids)。 |
snort -i <网卡> -c /etc/snort/snort.lua |
Snort 规则结构与响应机制(核心)
-
规则结构 :
动作 协议 源地址 源端口 -> 目标地址 目标端口 (选项关键字)-
动作 :
alert(报警),log(记录),pass(忽略),drop(丢弃,NIPS模式),reject(拒绝并通知双方)。 -
选项 :
msg(报警信息),content(匹配的数据内容),sid(规则唯一标识),rev(规则版本)等。
-
-
响应机制 :与动作对应。在NIDS模式下,主要是
alert和log;在NIPS模式下,可以drop或reject数据包。
3. NIDS 与 NIPS 的区别(重要概念)
这是基于工作模式 的延伸,关键在于是否主动干预流量。
| 特性 | NIDS (网络入侵检测系统) | NIPS (网络入侵防御系统) |
|---|---|---|
| 部署 | 旁路部署(监听端口) | 串行部署(网桥或网关模式) |
| 主要动作 | 检测、报警、记录 (alert, log) |
检测、阻断 (drop, reject) |
| 对流量影响 | 无影响(仅监听) | 直接影响(可丢弃恶意包) |
| 目标 | 事后分析和响应 | 实时防御 |
【软件工具】
- FTP 服务器:Windows Server 2008 1台;
- 操作机:ubuntu-desktop-20.04.5 1台;
- 交换机 1台;
- 软件:Snort3。
【实验拓扑】

【实验预期】
- 配置规则策略,输出日志警告。
- 三种工作模式输出日志警告。
【实验步骤与结果】
1.Snort3的配置
进入【Snort】控制台,Snort现安装在/usr/local/下,打开终端验证【/usr/local/bin/snort -V】Snort是否正确运行(版本为大写V),如下图所示。

默认配置文件测试Snort是否可正常运行,在终端中输入命令【snort -c /usr/local/etc/snort/snort.lua】如下图所示。
-c:这是最常用的选项,用来指定配置文件 snort.lua 的位置。如果执行该选项,Snort 就会去指定路径寻找
snort.conf 文件。例如,如果 snort.conf 文件在/etc 目录中,我们要用命令行选项"-c /usr/local/etc/snort/snort.lua"来启动 Snort。


依次执行以下命令,新建一些 snort 需要的文件夹和规则文件,如下图所示。
mkdir /usr/local/etc/rules
mkdir /usr/local/etc/so_rules/
mkdir /usr/local/etc/lists/
touch /usr/local/etc/rules/snort.rules
touch /usr/local/etc/rules/local.rules
touch /usr/local/etc/lists/default.blocklist
mkdir /var/log/snort
编辑 snort 的配置文件,执行命令【vim /usr/local/etc/snort/snort.lua】,修改路径变量为放置规则的文件路径。
按住shift和冒号输入【set number】回车,显示代码行数,如下图所示。

找到第183修改snort.lua以加载local.rules文件,修改代码,完成后保存并退出,如下图所示。
ips =
{
enable_builtin_rules = true,
include = RULE_PATH .. "/local.rules",
variables = default_variables
}

2.配置snort3规则集
编辑/usr/local/etc/rules/local.rules文件中创建一个规则,在终端中使用vim命令进行local.rules规则编辑,添加规则如下图所示,完成后保存并退出。
alert icmp any any -> any any ( msg:"ICMP Traffic Detected"; sid:10000001; metadata:policy security-ips alert; )
注:此规则将检测ICMP,对于测试Snort是否正常工作和生成警报非常有用。将以上代码粘贴到local.rules文件中(确保准确复制这行,必须在该文件中的每个分号中有一个空格才能正确解析警报)

现在运行Snort并让它加载local.rules文件,以确保正确加载这些规则(验证规则的格式是否正确)。
snort -c /usr/local/etc/snort/snort.lua

3.网络入侵检测模式与数据包记录器模式
(1)网络入侵检测模式
网络入侵检测模式(Network Intrusion Detection Mode)需要载入规则库才能工作。在入侵模式下,Snort 并不记录所有捕获的包,而是将包与规则对比,仅当包与某个规则匹配的时候,才会记录日志或产生报警。如果包并不与任何一个规则匹配,那么它将会被悄悄丢弃,并不做任何记录。运行 Snort 的入侵检测模式的时候,通常会在命令行指定一个配置文件。
网络入侵检测模式是最复杂的,而且是可配置的。我们可以让 Snort 分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。
入侵检测模式选项如下:
| 模式 | 描述 |
|---|---|
| 定义一个配置文件 | -c (配置文件名) |
| 检查规则语法和格式的准确性 | -T -c (配置文件名 ) |
| 警报模式 | -A (模式 : Full, Fast, None ,Console) |
| 系统日志警报 | -s |
| 打印告警信息 | -v |
| 向PC发送SMB警报 | -M (PC name or IP address) |
| ASCII 日志模式 | -K |
| No logging | -N |
| 后台运行 | -D |
| 监听网络接口 | -i |
现在,在接口上以检测模式运行Snort,并将所有警报打印到控制台。
fast:是一种快速简单的输出插件,之所以快是因为它只记录 timestamp(时间戳)、signature(特征)、source IP、destinationIP、source port、destination port、TCP flags 和 Protocol。
full:对每个产生警报的 IP 将其解码后的包记录下来。与 fast 不同的是,它记录地更全面。这也是它的预设告警模式。
none:这个插件作用是关闭警报。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -A alert_fast -s 65535 -k none

切换至【ftp服务器】控制台,打开cmd使用ping命令ping 10.0.0.1,如下图所示。

切换至【Snort】控制台,触发报警日志输出值控制台,如下图所示

(2)数据包记录器模式
数据包记录器模式把数据包记录到硬盘上,通过对文件的读取或者解析数据包发现需要的信息。数据表记录器
模式将数据包记录在日志文件中,通过查看日志文件可获取信息。
数据包记录器相关命令参数介绍:
-l:设置数据包文件存放目录。
-r:从 pcap 格式的文件中读取数据包
现在,按住ctrl+c结束snort运行。
为了方便地将Snort 3警报日志文件导入到选择的SIEM中(如Splunk),以fast模式为例子,需要使用alert_fast插件将所有警报写入alert_fast的文本文件。启用fast输出插件很简单,只需修改snort.lua文件(在第7节:配置输出中,大约247行),完成后保存并退出。
alert_fast =
{
file = true
}

现在以检测模式运行Snort,并将所有警报打印到日志目录。
snort -c /usr/local/etc/snort/snort.lua -i eth0 -s 65535 -k none -l /var/log/snort

标志含义如下:
| Flag | 描述 |
|---|---|
| -c /usr/local/etc/snort/snort.lua | snort.lua配置文件 |
| -i eth0 | 要监听的接口 |
| -A alert_fast | 使用alert_fast快速输出插件将警报写入控制台 |
| -s 65535 | 包含一个ICMP规则的规则文件的路径 |
| -k none | 忽略错误的校验和,否则snort将丢弃具有错误校验和的数据包 |
输入命令 cd /var/log/snort,ls 查看当前目录下文件内容,生成文件alert_fast.txt。

再新建终端使用tail -f 打印日志/var/log/snort/alert_fast.txt,如下图所示


切换至【Snort】控制台,触发报警日志输出值控制台,如下图所示

4.嗅探器模式
嗅探器模式是 Snort 工作的基本模式。只要运行 Snort 时不加载规则,它就可以从网络上读取数据包并连续不断地显示在屏幕上,直到用户按下 Ctrl+C 键终止。
这时,Snort 将显示统计信息。Snort 使用 Libpcap 网络驱动库。在这种模式下,Snort 将网卡设置为混在模式,读取并解析共享信道中的网络数据包。
在嗅探模式下,Snort 也可以将这些信息记录到日志文件中。这些文件随后可以用 Snort 或者 tcpdump 查看。这种模式的用户并非很大,因为现在有很多可以记录包的工具了。在这种模式下并不需要 snort.lua 配置文件。
| Mode | 描述 |
|---|---|
| -v | 把 TCP/IP 包头信息打印在屏幕上,使用这个命令将使 snort 只输出 IP 和 TCP/UDP/ICMP 的包头信息 |
| -e | 显示数据链路层的信息 |
| -d | 显示包的应用层数据 |
| -x | 以十六进制格式显示带有标头的完整数据包 |
| -i | 设置网络接口 |
| -L | 下载数据 |
按下 Ctrl+C 键终止snort3进程。
使用嗅探器模式运行Snort,并将所有警报打印到控制台,如下图所示。
snort -i eth0 -v -d -e -x -L dump

切换至【ftp服务器】控制台,打开cmd使用ping命令ping 10.0.0.1

切换至【Snort】控制台,Ctrl+C 结束 snort 监测。查看完整数据包并进行分析,获取的数据包内容可能会有不同,以实际环境为准,如下图所示。

数据包中可以得知源 MAC 地址及目的 MAC 地址。

可以得知源 IP 地址为 172.168.12.2,目的地址为 10.0.0.1。(以实际 IP 为准)。

数据包中 IP 头的 TTL 值是 63,TOS 值为 0。IP 长度为 20,IP 载荷是 60 字节。

得知数据包的传输协议为 ICMP
