suricata基本使用
suricata基本使用
Suricata 是一个开源的高性能网络入侵检测系统(IDS)、入侵防御系统(IPS)和网络安全监控工具,它可以监测、记录和分析网络流量,并检测潜在的安全威胁。Suricata 的工作原理类似于其他 IDS/IPS 系统,主要通过分析网络流量中的数据包来检测恶意活动。
参考:https://docs.suricata.io/en/suricata-8.0.2/
环境搭建
macos
1 | brew install suricata |
linux
1 | sudo apt-get install software-properties-common |
启动
1 | sudo systemctl start suricata |

使用时,需要明确网卡抓取
suricata rules
规则/签名由以下部分组成
- action : 决定规则匹配时会发生什么
- header : 定义规则的协议、IP 地址、端口和方向
- rule options : 定义规则的具体内容

action
action包括:
- alert - 生成警报。
- pass - 停止进一步检查数据包。
- drop - 丢弃数据包并生成警报。
- reject - 向匹配数据包的发送方发送 RST/ICMP unreach error。
- rejectsrc - 与 reject 相同。
- rejectdst - 向匹配数据包的接收方发送 RST/ICMP error 数据包。
- rejectboth - 向对话双方发送 RST/ICMP error 数据包。
In IPS mode, using any of the reject actions also enables drop.
header
protocol
协议包括:
tcp、udp、icmp、ip
以及tcp相关协议
- tcp-pkt(用于匹配单个 tcp 数据包中的内容)
- tcp-stream(仅用于匹配重新组装的 tcp 数据流中的内容)
还有几个应用层协议
HTTP(1/2)、FTP、TLS、SMB、DNS、DCERPC、DHCP、SSH、SMTP、IMAP、POP3、NFS、IKE、Kerberos(KRB5)、BitTorrent-DHT、NTP、RFB(VNC)、RDP、SNMP、TFTP、SIP、WebSocket
这些协议的可用性取决于配置文件 suricata.yaml 中是否启用了该协议。
如果签名的协议声明为 “http”,Suricata 会确保签名只在 TCP 流包含 http 流量时才匹配。
source 和 destination
规则样式如下:
1 | alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET Request Containing Rule in URI"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;) |
通常,您还需要使用 $HOME_NET 和 $EXTERNAL_NET 等变量。suricata.yaml 配置文件指定了这些变量所涉及的 IP 地址。相应的$HOME_NET和 $EXTERNAL_NET 设置将在规则中取代变量。
-
$HOME_NET:表示受监控环境中被视为本地或内部的受保护网络地址集合。 -
$EXTERNAL_NET:表示相对于 HOME_NET 而言,被定义为外部或非本地的网络地址集合,其具体范围取决于配置策略。 -
$not HOME_NET:表示所有不属于 HOME_NET 的网络地址集合,即 HOME_NET 的补集。 -
$EXTERNAL_NET and not HOME_NET:表示在已定义的外部网络范围内,进一步排除 HOME_NET 后得到的、明确不属于本地网络的地址集合。
规则使用示例:
| 示例 | 含义 |
|---|---|
| !1.1.1.1 | 除1.1.1.1外的所有IP地址 |
| ![1.1.1.1, 1.1.1.2] | 除1.1.1.1和1.1.1.2外的所有IP地址 |
| $HOME_NET | yaml中设置的HOME_NET |
| [$EXTERNAL_NET, !$HOME_NET] | EXTERNAL_NET且不包括HOME_NET |
| [10.0.0.0/24, !10.0.0.5] | 10.0.0.0/24,不包括10.0.0.5 |
| […, [….]] | |
| […, ![…..]] |
port 端口
规则使用样例
| 示例 | 含义 |
|---|---|
| [80, 81, 82] | 端口80、81和82 |
| [80: 82] | 从80到82的范围 |
| [1024: ] | 从1024到最高端口号 |
| !80 | 除80外的所有端口 |
| [80:100,!99] | 从80到100的范围,不包括99 |
| [1:80,![2,4]] | 从1到80的范围,不包括端口2和4 |
| [.., [..,..]] |
rules option
option用括号括起来,并用分号隔开。有些选项有设置(如 msg),设置由选项的关键字、冒号和设置指定。其他选项则没有设置,只有关键字(如 nocase):
1 | <keyword>: <settings>; |
字符 ; 和 “ 在 Suricata 规则语言中具有特殊含义,在规则选项值中使用时必须转义。例如
1 | msg:"Message with semicolon\;"; |
\有转义功能,所以也需要转义
Meta keywords
msg
关键字 msg 提供有关签名和可能警报的上下文信息。
example:
1 | msg:"ET MALWARE Win32/RecordBreaker CnC Checkin"; |
sid
关键字 sid 赋予每个签名自己的 id。该 ID 用大于 0 的数字表示。sid 的格式为:
1 | sid: 123; |
编写规则的标准做法是将签名 sid 作为签名的最后一个关键字(如果有 rev,则倒数第二个关键字)
对于同一规则组(gid)内的所有规则,该值必须是唯一的。
rev(revision)
Rev 表示签名的版本
1 | rev: 123; |
gid (group ID)
gid 关键字可用于为不同组的签名赋予另一个 id 值(与 sid 类似)。Suricata 默认使用 gid 1。在大多数情况下,无需更改默认 gid 值。更改 gid 值不会产生任何技术影响,只会在警报数据中注明该值。
fast.log 文件中警报条目中的 gid 值示例。在 [1:123:1] 部分中,第一个 1 是 gid(123 是 sid,1 是 rev)。
classtype
classtype 关键字提供有关规则和警报分类的信息。它由短标签,长名称和优先级组成。可以用于说明一条规则是信息规则还是关于 CVE 的规则
1 | config classification: web-application-attack,Web Application Attack,1 |
reference
1 | reference:type,reference |
example:
1 | reference:url,www.info.com |
priority
优先级关键字带有一个强制数值,范围从 1 到 255。常用值为 1 至 4。最高优先级为 1,优先级较高的签名将首先被检查。通常签名的优先级由类类型定义决定。可以通过在签名中定义优先级关键字来覆盖类类型定义。
1 | priority: 1; |
metadata
元数据关键字允许在签名中添加额外的非功能信息。虽然格式是自由的,但建议坚持使用kv结构
1 | metadata: key value; |
target
关键字允许规则编写者指定警报的哪一方是攻击目标。如果指定,警报事件就会增强,以包含源和目标的信息。
1 | target:[src_ip|dest_ip] |
如果值为 src_ip,则生成事件中的源 IP(JSON 中的 src_ip 字段)就是攻击目标。如果 target 设置为 dest_ip,则目标为生成事件中的目标 IP。
基本使用
1 | # 查看可用网卡 |
1 | # 验证可运行模式 |

其中disabled是不支持使用
可运行模式
PCAP_DEV :简单兼容性好,性能一般,低流量
PCAP_FILE : 离线处理,用于分析pcap/pcapng文件
- suricata -r traffic.pcap -c suricata.yaml
AF_PACKET_DEV : 生产常用,性能好,配置简单,稳定,ids常用
AF_XDP_DEV : 基于eBPF / XDP,对内核和带宽要求高,配置复杂。延迟低,吞吐高
NFQ / IPFW : ips常用,需要iptables配合,pf/ipfw
线程
- single:单线程,简单,性能低
- workers:几乎不共享锁,CPU利用率最高,延迟最低
- autofp:流固定,同一个“连接(流)”的包,永远给同一个检测线程。适合pcap,NFQ,复杂规则集等
1 | #测试配置文件 |
1 | #更新规则库 |

IDS模式
ids模式监听网卡
1 | sudo suricata -c /path/to/suricata.yaml -i <网卡名> |
查看实时日志
1 | tail -f /var/log/suricata/fast.log |
启动示例
1 | # single 模式 |
IPS模式
配置iptables转发流量
1
sudo iptables -I FORWARD -j NFQUEUE --queue-num 0
启动Suricata处理队列
1
sudo suricata -c suricata.yaml -q 0 --runmode=workers
在线部署,可实时阻断威胁
规则中需使用 drop 动作:1
2#规则示例:阻断SSH暴力破解
drop tcp any any -> any 22 (msg:"SSH Brute Force"; sid:10001;)需定期测试避免误杀合法流量
离线分析
分析pacp文件
1 | sudo suricata -r traffic.pcap -c suricata.yaml -l ./logs |
输出
- eve.json:结构化事件日志
- fast.log:告警摘要
- stats.log:性能统计
规则管理
自定义规则
默认文件位置:/etc/suricata/rules/local.rules
并非是固定的,具体由suricata.yaml的rule-files字段决定

icmp协议检测
1 | alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001;) |
HTTP主机检测
1 | alert tcp any any -> any 80 (msg:"HTTP Access: Baidu"; content:"Host|3A| www.baidu.com"; sid:1000002;) |
其他
主要文件和目录
1 | 目录: |
简单使用,启动
1 | suricata -c /etc/suricata/suricata.yaml -i eth0 |

由于笔者是使用orbstack拉取的ubuntu,虚拟内核不完整支持 AF_PACKET fanout,所以无法使用 AF_PACKET 的 fanout(多队列/多线程分流)能力,导致报错,程序会自动退回到不使用 fanout 的方式。不影响suricata正常使用。
注意!
更新/修改规则文件(如 local.rules、suricata.rules)后,规则是不会自动加载的,需要重启suricata
1 | sudo systemctl restart suricata |
在suricata 8.0以后,如果你启用了 Unix socket, 则可以 热加载规则:
1 | sudo suricata -c /etc/suricata/suricata.yaml -i eth0 --unix-socket |
注意!
- 只重新加载规则
- 改
suricata.yaml仍然要重启
