200字
Suricata学习
2025-11-20
2025-11-20

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的流量抓取实现有些帮助应该。)

评论