- 网络安全
【免费下载链接】suricata
Suricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.
本文是一份面向初学者的 Suricata 实战快速入门指南,以 Ubuntu 官方 PPA 安装为主线,覆盖从抓包网卡识别、suricata.yaml核心配置(HOME_NET与af-packet)、suricata-update规则更新,到systemd服务运行、日志查看以及用一条 ET Open 测试规则完整验证 IDS 告警链路的全过程。读者学完后,将能在 10 分钟内搭建起一套可运行、可验证的 Suricata 入侵检测环境,并掌握fast.log、stats.log、eve.json三类日志的解读方法,为后续深入学习 Suricata 安装、EVE JSON 输出 等专题打下基础。
一、准备工作与安装
快速入门指南假定你运行的是较新的 Ubuntu 发行版,因为官方维护的 PPA(Personal Package Archive)可以保证安装到最新稳定版 Suricata。安装步骤如下:
sudo apt-get install software-properties-common sudo add-apt-repository ppa:oisf/suricata-stable sudo apt update sudo apt install suricata jq- 前两条命令先安装
software-properties-common(提供add-apt-repository工具),再添加 OISF 维护的oisf/suricata-stablePPA 源; sudo apt update刷新软件源索引,使系统识别到 PPA 中的 Suricata 包;- 安装 Suricata 时推荐一并安装
jq,因为后面验证 EVE JSON 输出时,jq能方便地筛选和格式化 JSON 字段。
如果你使用其他发行版、需要从源码编译,或想指定自定义编译选项,请参考仓库中完整的 安装指南,本指南只覆盖最基础的 PPA 路径。
安装后的版本与状态检查
安装完成后,用下面两条命令确认引擎版本、编译选项和系统服务状态:
sudo suricata --build-info sudo systemctl status suricata--build-info会输出 Suricata 的版本号、编译时启用的特性(如是否带 Rust、HTP、lua 支持)、抓包模式等构建信息;systemctl status suricata则显示服务是否正在运行、启动时间以及最近日志。
二、基础配置:识别网卡并编辑 suricata.yaml
2.1 确定监控接口与 IP
先通过ip addr找到 Suricata 需要监控的网卡接口名及其 IP 地址:
$ ip addr 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff inet 10.0.0.23/24 brd 10.23.0.255 scope global noprefixroute enp1s0本例中接口名为enp1s0,IP 为10.0.0.23/24,后面配置HOME_NET和af-packet时都要用到。
2.2 打开主配置文件
sudo vim /etc/suricata/suricata.yaml注意:
suricata.yaml的位置取决于安装方式。通过发行版软件包(如上面的 PPA)安装时位于/etc/suricata/suricata.yaml;从源码编译安装时则位于configure指定的 prefix 下,默认 prefix 为/usr/local,即/usr/local/etc/suricata/suricata.yaml。仓库根目录下的 suricata.yaml.in 是这套配置的模板源文件,可供对照查看全部可配置项。
2.3 配置 HOME_NET 变量
HOME_NET表示"受保护的内网",应包含被监控网卡的 IP 以及实际在用的所有本地网段。仓库模板中的默认值已经涵盖了 RFC 1918 私网地址段:
vars: address-groups: HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]" #HOME_NET: "[192.168.0.0/16]" #HOME_NET: "[10.0.0.0/8]" #HOME_NET: "[172.16.0.0/12]" #HOME_NET: "any" EXTERNAL_NET: "!$HOME_NET"本例中10.0.0.23已被10.0.0.0/8覆盖,因此无需改动;如果内网没有用到其他网段,可以把默认值里多余的部分删掉,只保留实际网段。EXTERNAL_NET默认取!$HOME_NET,即"除内网以外的一切",这也是规则中最常用的外网定义方式。模板中还顺带定义了HTTP_SERVERS、SMTP_SERVERS、SQL_SERVERS、DNS_SERVERS、TELNET_SERVERS、DC_SERVERS、DNP3_SERVER等服务器变量,均默认引用$HOME_NET(见 suricata.yaml.in)。
2.4 配置 af-packet 抓包接口
接口名enp1s0必须与af-packet小节中的interface一致。一个适合 IDS 基础场景的抓包配置如下:
af-packet: - interface: enp1s0 cluster-id: 99 cluster-type: cluster_flow defrag: yes tpacket-v3: yes这是基础 IDS runmode 下官方推荐的近期最佳配置。仓库模板 suricata.yaml.in 对该节给出了更详细的注释说明,值得逐项理解:
threads:接收线程数,auto表示按 CPU 核数自动决定;cluster-id: 99:默认集群 ID,AF_PACKET 基于流(flow)做负载均衡;cluster-type: cluster_flow:同一流的所有包被发送到同一个 socket,是大多数机器上的推荐模式。可选值还包括cluster_cpu(按内核 CPU 分发)、cluster_qm(按网卡 RSS 队列分发,需 Linux 3.14+)、cluster_ebpf(eBPF 文件负载均衡,见 ebpf-xdp 文档)。cluster_rollover已废弃,使用时会自动替换为cluster_flow;defrag: yes:某些分片场景下无法计算 hash,开启后内核会在投递前完成必要的重组,这对cluster_flow模式的 IDS 场景是官方推荐项;tpacket-v3: yes:使用 tpacket_v3 抓包模式,非复制模式下默认开启;注意不要在 IPS 或 TAP 模式下使用它,会引入严重延迟;- 此外还可配置
mmap-locked(锁定内存映射防交换)、ring-size、block-size、block-timeout、use-emergency-flush(繁忙系统丢包恢复)、buffer-size、disable-promisc、checksum-checks、bpf-filter等高级项。
从源码层面看,src/runmode-af-packet.c 中的解析逻辑印证了上述行为:未指定cluster-type时默认采用cluster_flow,cluster_rollover会被警告并替换为cluster_flow,同时只有cluster_flow会配合启用内核 defrag。这也解释了为什么示例配置要把cluster-type: cluster_flow和defrag: yes组合使用。
三、安装并更新规则(Signatures)
Suricata 依靠签名(Signature,即规则 rule)来触发告警,因此必须安装并持续更新规则库。suricata-update工具负责规则的获取、更新与管理。运行默认模式即可抓取 ET Open 规则集:
sudo suricata-update执行后规则被安装到/var/lib/suricata/rules,这也是配置中的默认规则目录,Suricata 实际加载其中的suricata.rules单文件。规则目录的对应配置在 suricata.yaml.in 的rule-files/default-rule-path小节中体现,后续可通过suricata-update的配置文件管理自定义规则源与更新频率。
四、启动 Suricata 并确认运行状态
4.1 重启服务
规则就绪后重启 Suricata 服务:
sudo systemctl restart suricata4.2 检查引擎日志
查看主日志确认引擎正常启动:
sudo tail /var/log/suricata/suricata.log日志最后一行应类似:
<Notice> - all 4 packet processing threads, 4 management threads initialized, engine started.实际线程数取决于系统 CPU 和配置。suricata.log的路径与格式由 suricata.yaml.in 附近的logging小节控制。
4.3 查看统计日志
sudo tail -f /var/log/suricata/stats.log默认每 8 秒刷新一次,展示当前状态下的累计值,例如已处理多少包、解码了哪类流量。刷新周期来自 suricata.yaml.in 顶部的全局stats配置:
stats: enabled: yes interval: 8对应输出模块在 suricata.yaml.in 定义:
- stats: enabled: yes filename: stats.log append: yes # append to file (yes) or overwrite it (no) totals: yes # stats for all threads merged together threads: no # per thread stats #null-values: yes # print counters that have value 0. Default: nointerval控制统计写入频率(秒),totals: yes表示输出所有线程合并后的总计数,需要逐线程明细时可将threads改为yes。
五、用测试规则验证告警(Alerting)
验证 IDS 功能最直接的方式是触发一条专门用于测试的规则。ET Open 规则集中 ID 为2100498的签名就是为此设计的:
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 流量生效,只要报文负载中包含uid=0(root)字样即触发告警,其语法与逻辑细节在规则编写章节有专门讲解。触发前先实时跟踪fast.log:
sudo tail -f /var/log/suricata/fast.log curl http://testmynids.org/uid/index.html浏览器/curl 返回的内容里就包含uid=0(root),因此会触发告警,日志中应立即出现类似输出:
[1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 217.160.0.187:80 -> 10.0.0.23:41618该行包含告警 ID(1:2100498:7,格式为 generator:sid:rev)、消息、分类、优先级、协议以及源/目的地址端口,时间戳和本机 IP 会随实际环境变化。fast.log是类似 Snort 的逐行告警日志,由 suricata.yaml.in 中的outputs段默认启用:
outputs: - fast: enabled: yes filename: fast.log append: yes六、进阶输出:用 jq 解析 EVE JSON
EVE(Extensible Event Format)是 Suricata 更高级的结构化 JSON 输出,所有事件(告警、统计、流量元数据等)都以 JSON 行格式写入eve.json,详细说明见 EVE JSON 输出文档。前面安装的jq在此派上用场。
查看告警事件(含更丰富的元数据):
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'查看内核抓包数统计:
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")'第一条只显示event_type为alert的事件,每个告警都带时间戳、五元组、规则元数据(sid、rev、分类、优先级)等字段;第二条从统计事件中精确提取capture.kernel_packets内核抓包计数;第三条输出所有统计字段。EVE 输出默认启用,配置位于 suricata.yaml.in:
- eve-log: enabled: yes filetype: regular #regular|syslog|unix_dgram|unix_stream|redis filename: eve.jsonfiletype还支持syslog、unix_dgram、unix_stream、redis等多种投递方式,高流量场景可开启threaded多线程输出(文件会附加标识符,如eve.9.json),并按需配置 Redis 发布/订阅(mode: channel|publish)、列表(mode: list|lpush)或流(mode: xadd|stream)模式(见 suricata.yaml.in)。
七、小结与后续学习路径
至此,你已经走完了 Suricata 的完整入门闭环:通过 PPA 安装引擎与jq→ 用ip addr识别接口并配置HOME_NET与af-packet→ 用suricata-update安装 ET Open 规则 → 重启服务并通过suricata.log、stats.log确认运行 → 用测试签名触发告警并分别在fast.log与eve.json中验证。接下来可以根据实际需求深入以下专题:
- 完整的安装与编译指南:源码编译、自定义 prefix、非 Ubuntu 系统;
- suricata.yaml 全量配置说明:全部参数与默认值;
- EVE JSON 输出详解:各事件类型字段说明;
- AF_PACKET 抓包与高性能调优:RSS、多队列、
cluster_cpu/cluster_qm等生产级调优; - eBPF/XDP 抓包:
cluster_ebpf负载均衡与旁路(bypass); - Linux 下 IPS inline 模式部署:从 IDS 升级到 IPS;
- 规则编写与检测引擎章节:深入理解签名语法、
content修饰符与性能优化。
- 网络安全
【免费下载链接】suricata
Suricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.
相关推荐
Suricata AF_PACKET 抓包接口完全指南:硬件时间戳与 Linux 内核抓包配置详解
Suricata AF_PACKET 抓包接口完全指南:硬件时间戳与 Linux 内核抓包配置详解 导读 本文围绕 Suricata 官方文档 AF_PACKE
网络安全Suricata 在 Ubuntu 上的安装部署指南:从 OISF PPA 到 IDS 实战运行
Suricata 在 Ubuntu 上的安装部署指南:从 OISF PPA 到 IDS 实战运行 本文围绕 Suricata 官方为 Ubuntu 维护的 su
网络安全基于 Helm Chart 在 Kubernetes 上部署 Elastalert:从安装、配置到告警规则管理实战指南
基于 Helm Chart 在 Kubernetes 上部署 Elastalert:从安装、配置到告警规则管理实战指南 Elastalert 是 Yelp 开源
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考