1. 介绍
Suricata 是一个高性能的网络入侵检测和防御系统(IDS/IPS)。它是由OISF开发,完全开源,并且可以免费使用。
Suricata和Snort的区别
Snort 也是一个开源的IDS,能够实时监控网络流量,检测和防御潜在的威胁。与Snort相比,Suricata的设计注重性能和可扩展性,它可以在低至中等规格的硬件上运行,支持多线程,同时处理高吞吐量的网络流量,同时流分析功能更为强大和复杂。说白了就是性能更强,功能更多。
Suricata能够检测各种网络威胁,包括但不限于:
-
协议解析:支持多种协议,如TCP, UDP, ICMP, HTTP, FTP等。
-
签名匹配:使用类似于Snort的规则语言进行签名匹配,以检测已知攻击模式。
-
异常检测:可以检测到异常行为,如异常流量或潜在的恶意行为。
-
应用层检测:能够检测应用层的攻击和异常行为,例如SQL注入攻击。
-
流量分析:可以对网络流量进行深入分析,包括状态跟踪和流量重建。
-
实时响应:在检测到攻击时,可以实时阻断或记录攻击流量。
Suricata的一些主要运行模式:
-
Single 模式:在这种模式下,所有的数据处理任务都由单个工作线程完成。
-
Workers 模式:这是为了高性能而设计的模式。在Workers模式中,每个工作线程都独立执行从数据包捕获到日志记录的所有任务,以实现负载均衡和提高处理速度。
-
Autofp 模式:这种模式适用于处理PCAP文件或在某些IPS设置的情况下。Autofp模式下,有一个或多个数据包捕获线程,它们捕获数据包并进行解码,然后将数据包传递给 flow worker 线程。
2. 安装
这里在Linux上安装,根据官方的文档来快速进行
https://docs.suricata.io/en/latest/quickstart.html#installation
安装步骤
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install suricata jq # jq是用来显示Suricata的EVE JSON输出信息的工具
安装完成后查看正在运行的Suricata版本、选项以及服务状态
sudo suricata --build-info
sudo systemctl status suricata


上述需要在Ubuntu22及以上版本进行,可能是因为新的Suricata版本不兼容的问题
3. Suricata基本配置
3.1 配置文件
来看一下Suricata的配置文件,在 /etc/suricata 下面

初始是只有这四个文件
-
classification.config用于定义和分类不同类型的网络事件,比如哪些是潜在的攻击、哪些是正常的网络活动等。 -
reference.config包含了一些安全网站,漏洞平台的URL网址,用来联系外部的恶意攻击检测网站。 -
suricata.yaml是Suricata的主要配置文件,它包含了规则配置、接口配置、日志配置、检测配置等。 -
threshold.config用于定义流量的阈值和速率限制。设置在特定时间内对特定事件或签名的触发次数进行限制。
看文章的时候,别人还有一个自定义的rules目录,可以用来存放自定义规则
rules/规则目录,存放不同种类的规则文件 \*.rules,规则用来判定流量攻击类型,并定义攻击类型和告警种类等。
3.2 基本运行
先根据官方的quick start来运行一下,看看效果,运行前记得将配置文件备份一下,防止改坏
首先确定Suricata要检查数据包的接口和ip地址
ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:16:3e:06:24:d8 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 172.26.234.8/20 metric 100 brd 172.26.239.255 scope global dynamic eth0
valid_lft 1892158259sec preferred_lft 1892158259sec
inet6 fe80::216:3eff:fe06:24d8/64 scope link
valid_lft forever preferred_lft forever
然后利用这些信息配置Suricata
sudo vim /etc/suricata/suricata.yaml
我们主要关注 HOME_NET 变量的配置,在大多数情况下,HOME_NET变量应包括受监视接口的IP地址和所有正在使用的本地网络。
af-packet:
- interface: eth0
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
tpacket-v3: yes

不过这里默认已经配置好了
Suricata 使用签名(Signatures)来触发警报,但签名其实就是规则,使用工具 suricata-update 可以获取、更新和管理规则
我们执行下面命令以运行默认模式获取ET Open规则集
sudo suricata-update

该规则安装在了 /var/lib/suricata/rules 下面

所有规则就在suricata.rules里面,可以看到它的字节数非常大

然后去看了一下 /etc/suricata.yaml 配置文件,发现在下面的地方配置了对应rules扫描目录

所以我们想识别自定义规则目录,就可以在这里进行修改
安装规则后就可以运行Suricata了
先重启
sudo systemctl restart suricata
要确保 Suricata 正在运行,可以检查 Suricata 日志
sudo tail /var/log/suricata/suricata.log
最后一行类似这样
[1517182 - Suricata-Main] 2025-08-27 16:35:51 Notice: threads: Threads created -> W: 2 FM: 1 FR: 1 Engine started.
实际线程数取决于系统和配置。
要查看统计数据,可以查看 stats.log 文件
sudo tail -f /var/log/suricata/stats.log

默认情况下,它每 8 秒更新一次,以显示当前状态的更新值,例如已处理了多少个数据包以及解码了哪种类型的流量。
然后根据官方文档说是有一条id为2100498的规则是专门用来测试Suricata的IDS功能,但是我在ET Open规则集中没找到,那我就自己把这条测试规则加进去好了
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
这条规则将对任何包含有效负载内容的 IP 流量发出警报。因此该规则很容易触发。在触发之前,我们用 tail 来查fast.log文件的更新
sudo tail -f /var/log/suricata/fast.log
curl http://testmynids.org/uid/index.html
分两个窗口执行,然后应该会看到下面的日志输出

08/27/2025-16:56:42.211468 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 18.155.192.31:80 -> 172.26.234.8:51604
其中包括时间戳和系统的 IP
我们再来看一下EVE JSON的输出格式
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
这将显示有关每个警报的更多详细信息,包括元数据。

同样执行上面的curl来测试,得到上面的json输出,格式更加的清晰易读
也可以用jq显示统计数据
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="stats")|.stats.capture.kernel_packets'
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="stats")'
第一个例子显示内核捕获的数据包数量;第二个例子显示所有的统计信息。
Suricata分为两种模式,IDS和IPS,IDS是默认的模式只告警不拦截,而IPS就可以进行拦截
修改模式的话在 /etc/suricata/suricata.yaml 里修改af-packet.copy-mode为ips即可
3.3 suricata规范
一个规则主要由以下三个部分组成:
-
action 决定当规则匹配时的处理动作
-
header 定义协议,IP地址,端口和规则的方向
-
rule options 定义规则的细节
官方文档的示例规则

在上图中,红色部分为action,绿色部分为header,蓝色部分为rule options。
有效的action如下:
-
alert 生成一个告警
-
pass 停止对包的进一步检查,并跳到所有规则的末尾
-
drop 丢弃数据包并产生告警
-
reject 向匹配报文的发送端发送RST/ICMP不可抵达错误
-
rejectsrc - 与 reject 相同。
-
rejectdst - 将 RST/ICMP 错误数据包发送到匹配数据包的接收方。
-
rejectboth - 向会话的双方发送 RST/ICMP 错误数据包。
在 IPS 模式下,使用任何拒绝动作也会启用drop
header部分定义协议,IP地址,端口和规则的方向:
-
注明协议种类,tcp、udp、icmp、ip、http等,ip代表全部或者任何协议都可以,还有很多其他支持的协议,可以看官方文档,这些协议的可用性取决于配置文件 suricata.yaml 中是否启用了该协议
-
Any:源地址/目的地址(IP)
-
Any:源端口/目的端口
-
->:方向,单向流量;<>双向流量
-
Any:源地址/目的地址(IP)
-
Any:源端口/目的端口
header还支持使用变量,例如前面的使$HOME_NET 和 $EXTERNAL_NET 这两个变量,这些变量在suricata.yaml 配置文件指定。

rule options定义规则的细节:
-
msg:警报消息,当规则匹配时输出的消息
-
flow:流量匹配选项,指定规则匹配的流量特征,如是否已建立等
-
content:规则匹配的内容
-
classtype:规则的分类类型,由 classification.config 文件定义
-
sid:用于唯一性规则标识
-
rev:规则版本号
这部分主要是由选项组成,格式主要有两种
<keyword>: <settings>;
<keyword>;
Rule options具体有特定的顺序,改变其顺序会改变规则的含义
字符 ; 和 " 在 Suricata 规则语言中具有特殊含义,在规则选项值中使用时必须转义。
以我们前面的测试规则为例
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
1. alert 就是生成警报的action
2. ip any any -> any any 这表示规则适用于任何流量,不限制源IP和目的IP
3. msg:"GPL ATTACK_RESPONSE id check returned root" 这是当规则触发时显示的消息
4. content:内容修饰符,检测内容中是否有uid=0(root),|28|和|29|表示十六进制转义的ASCII字符
5. classtype:事件分类,归到 “bad-unknown” 类别
6. sid:规则的唯一标识符
7. rev:规则版本号,用来区分同一规则的不同版本
更多的规则规范可以参考官方文档
4. 用suricata检测攻击流量
surcata的几个基本命令:
-c # 指定配置文件的路径
-T # 测试规则是否正常运行
-i # 指定网卡
suricata-update # 更新规则
规则的编写可以看一下网上有的开源项目
https://github.com/al0ne/suricata-rules
这个项目集成了很多suricata的规则,可以看这些规则学习一下
规则匹配的结果同样去前面所说的日志查看,这里就不再演示了,只是快速入门一下。
参考
https://www.cnblogs.com/smileleooo/p/18169413
https://github.com/OISF/suricata
https://docs.suricata.io/en/latest/quickstart.html#installation
https://mp.weixin.qq.com/s?__biz=Mzg5MzgxMTIyOQ==&mid=2247520795&idx=1&sn=afa2e59699816326044e9626f82f6ae2&poc_token=HIHzrmij2BPBEuPUO_W2GkJnMlp7Xnrmcp88Unxu)
https://mp.weixin.qq.com/s?__biz=MzI2NzU4OTExOA==&mid=2247489149&idx=1&sn=45fdc032a5fba2a54d693faceda655c2&chksm=eafdd2ecdd8a5bfab18cd1d12ca7eff81c786a1a53383dc023e4735e9d5abbf23667f9df41fd&cur_album_id=3089598306307129352&scene=189#wechat_redirect(这位大哥里面有一系列的Linux网络协议的知识,对了解suricata的流量抓取实现有些帮助应该。)