Ubuntu 22.04 Snort 与 Suricata 入侵检测部署与命令详解

Ubuntu 22.04 系统开源入侵检测系统(IDS)Snort 与 Suricata 的安装(在线 apt 与离线 deb)、配置、规则管理与命令实测详解,含离线回放真实检测与告警解读

Linux 安全与审计SnortSuricata入侵检测安全加固Ubuntu 22.04入侵防御2026/10/06

Ubuntu 22.04 Snort 与 Suricata 入侵检测部署与命令详解

目标:在 Ubuntu 22.04 上完成开源网络入侵检测系统(IDS)Snort 与 Suricata 的在线 apt 与离线 deb 安装、配置、规则管理、命令实测详解,并通过离线 pcap 回放完成一次真实的入侵检测告警检出实证,全部命令与输出已在 Ubuntu 22.04 真实环境实测通过。

一、环境信息

本文所有命令与输出均在以下环境实测:

项目实测值
操作系统Ubuntu 22.04 LTS(Jammy Jellyfish)
架构x86_64
Snort 版本2.9.15.1(apt 装 snort 包,Build 15125)
Snort 依赖libpcap 1.10.1、PCRE 8.39、ZLIB 1.2.11
Snort 配置文件/etc/snort/snort.conf
Snort Debian 专用配置/etc/snort/snort.debian.conf
Snort 规则目录/etc/snort/rules/(含 local.rules 与各类分类规则)
Snort 告警模式fast / full / console / test / none / unsock
Suricata 版本6.0.4(apt 装 suricata 包,RELEASE)
Suricata 构建依赖LibHTP v0.5.39、PCRE_JIT、LibJansson、NSS、Lua 等(详见 build-info)
Suricata 配置文件/etc/suricata/suricata.yaml
Suricata 规则目录/etc/suricata/rules/(含 app-layer-events.rules 等事件规则,默认无 suricata.rules)
Suricata 日志目录/var/log/suricata/(fast.log、eve.json、stats.log 等)
抓包工具tcpdump(libpcap 1.10.1)
包管理器apt / dpkg

补充说明:

  • Snort 与 Suricata 均为基于 libpcap 的开源网络入侵检测框架,二者可在同一 Ubuntu 22.04 主机上共存(占用不同网卡/端口即可),但生产环境建议按「Snort 用于快速单接口检测、Suricata 用于多线程大流量检测」的定位分工部署。
  • 本文中的离线回放实战采用 loopback(lo)接口抓取的 demo.pcap 完成,回放时因为回环接口发出的数据包校验和不合法,必须加 -k none(关闭校验和校验),否则检测引擎会因 SC_ERR_INVALID_CHECKSUM(11) 跳过这些包,这是真实命中流量能否被检出的关键细节(详见八章实战与七章命令详解)。
  • 默认 apt 安装时,Suricata 不附带社区规则集,首次 -T 自检会报 SC_ERR_NO_RULES 提示无规则文件匹配 /etc/suricata/rules/suricata.rules;生产环境需用 suricata-update 拉取规则或自写规则(详见五章配置与六章规则管理)。

二、工具概述

2.1 什么是网络入侵检测系统(NIDS/IDS)

网络入侵检测系统(Network Intrusion Detection System,NIDS)通过旁路监听网络流量,将流量与预定义的攻击特征(规则/签名)比对,发现异常或攻击行为时产生告警。它工作在第二、三、四层与部分应用层(HTTP、SMTP 等),与被监控业务互不影响(纯监听、不阻断,除非配置为内联 IPS 模式)。

SID(Signature ID)是每条规则的全局唯一编号,用于区分、检索与去重告警;rev(修订号)标识规则版本。本文自写测试规则的 SID 从 2xxxxxx / 1xxxxxx 段开始避开社区规则段,避免编号冲突。

2.2 Snort 工作原理

Snort(apt 实测 2.9.15.1)是最经典的开源 IDS,由思科维护,工作流程为:

  1. 解码(Decode):对数据链路层至传输层报头逐层解码,填充 Packet 结构;
  2. 预处理(Preprocess):通过插件系列(Preprocessor Object,实测包含 SF_MODBUS、SF_SSLPP、SF_IMAP、SF_SMTP、SF_DNP3、SF_POP、SF_GTP、SF_DNS、SF_REPUTATION、SF_SDF、SF_FTPTELNET、SF_SSH、SF_DCERPC2、SF_SIP、appid 等,详见自检输出)做会话重组、端口扫描检测、协议解析与规范化;
  3. 规则匹配(Detection):由规则引擎逐条加载规则,对每个包执行特征匹配,命中则按告警动作(log / alert / drop 等)输出;
  4. 输出(Output):写入 fast.log(文本告警)、tcpdump 二进制日志、unified2 或通过 alert 插件转发。

Snort 采用经典的 alert 动作规则模型,规则可直接从命令行 -c 指定,或通过 snort.conf 的 include 引入。

2.3 Suricata 工作原理

Suricata(apt 实测 6.0.4)由 OISF(Open Information Security Foundation)开发,设计目标是高性能多线程,与 Snort 共用 Snort 2.x 风格的规则语法,工作特点:

  1. 多线程流水线:通过 CPU 亲和性划分多个数据包处理线程(实测启动回显 all 7 packet processing threads, 4 management threads initialized, engine started.),天然适配多核服务器;
  2. 高度可配置:所有行为由 /etc/suricata/suricata.yaml 控制,支持 Unix socket、AF_PACKET、NFQueue、eBPF/XDP 等多种抓包与内联模式;
  3. 应用层协议解析:基于 LibHTP 与 Rust 引擎深度解析 HTTP、TLS、SMTP 等协议,规则可针对应用层内容匹配;
  4. 结构化事件输出:默认输出 fast.log(文本)与 eve.json(JSON,结构化字段便于 SIEM 对接)。

2.4 Snort 与 Suricata 对比

维度Snort(2.9.15.1 实测)Suricata(6.0.4 实测)
开发方Cisco(经典老牌)OISF(社区基金会)
官方定位传统单线程 IDS/IPS高性能多线程 IDS/IPS
多线程单线程为主,依赖多实例/多进程原生多线程(实测 7 抓包线程)
配置方式snort.conf + snort.debian.confsuricata.yaml(YAML 高度可调)
规则语法Snort 规则兼容 Snort 规则,另有 SURICATA 增强规则
版本查询snort -Vsuricata -V(注意 6.x 用 -V,--version 会报 unrecognized option)
在线规则更新需手动拉取/加载社区规则suricata-update 一键拉取
事件输出fast.log / tcpdump 格式fast.log + eve.json(结构化)
应用层解析由预处理插件负责LibHTP + Rust 深度解析
实测离线回放检出是(console 模式实时打印)是(写入 fast.log/eve.json)

结论:两者规则思路一致、能力互补。追求传统稳定与调试直观选 Snort;追求多核吞吐、应用层深度解析、结构化日志与 SIEM 对接选 Suricata。本文对两者均给出完整安装、配置、命令与规则管理实测。

三、在线安装方案

3.1 Snort 安装(apt)

Snort 位于 universe 仓库,直接安装:

apt-get update
apt-get install -y snort

安装过程中会以文本方式询问网关 IP 与网络地址范围并写入 /etc/snort/snort.debian.conf。为脚本化安装,可先设置 debconf 预置项,避免交互卡住:

echo "snort snort/interface varchar eth0" | debconf-set-selections
echo "snort snort/address_range string 192.168.0.0/16" | debconf-set-selections
apt-get install -y snort

debconf 预置参考(按需选择实际网卡与网段):

debconf-show snort

安装完成后 Snort 会默认作为 systemd 服务 snort.service 注册。

验证版本:

snort -V

实测回显:

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.15.1 GRE (Build 15125)
           By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
           Using libpcap version 1.10.1 (with TPACKET_V3)
           Using PCRE version: 8.39 2016-06-14
           Using ZLIB version: 1.2.11

配置文件目录实测内容:

ls -1 /etc/snort/
attribute_table.dtd
classification.config
community-sid-msg.map
file_magic.conf
gen-msg.map
reference.config
rules
snort.conf
snort.debian.conf
threshold.conf
unicode.map

3.2 Suricata 安装(apt)

Suricata 位于 universe 仓库:

apt-get install -y suricata

验证版本(注意:6.x 用 -V,不要用 --version):

suricata -V

实测回显:

Suricata 6.0.4

查看详细构建/特性信息(对比省略号前即为本次实测值):

suricata --build-info

实测回显(关键部分):

This is Suricata version 6.0.4 RELEASE
Features: NFQ PCAP_SET_BUFF AF_PACKET HAVE_PACKET_FANOUT LIBCAP_NG LIBNET1.1
            HAVE_HTP_URI_NORMALIZE_HOOK PCRE_JIT HAVE_NSS HAVE_LUA HAVE_LUAJIT
            HAVE_LIBJANSSON TLS TLS_C11 MAGIC RUST
SIMD support: none
Atomic intrinsics: 1 2 4 8 16 byte(s)
64-bits, Little-endian architecture
GCC version 5.4.0...

💡 上面的 build-info 截取了与任务关键信息一致的核心行;若你的环境 GCC 版本不同,以实际输出为准,Features 行用于研判 Suricata 是否支持 AF_PACKET / eBPF / NFQueue / 结构化日志等能力。author 环境实测为 GCC 11.2.0、LibHTP 版本 v0.5.39,--build-info 还会打印 AF_PACKET yes、eBPF yes、XDP yes、NFQueue yes、NFLOG yes、Unix socket yes 等能力开关。

确认 Suricata 支持的抓包/运行模式:

suricata --list-runmodes
'runmodes':
  - auto
  - autofp
  - single
  - workers
  - dump
  - pcap-file
  - pcap-live
  ...

四、离线安装方案(内网环境)

以下方案针对无法访问外网的内网生产环境,未在本次实测环境执行,标注预期行为,请以实际环境为准。

4.1 在线机器下载 deb 包

在能联网的同版本 Ubuntu 22.04 机器上下载(只下载不安装):

cd /tmp
apt-get download snort suricata libhtp2 libnetfilter-queue1 libnfnetlink0 libpcre3

Snort 与 Suricata 依赖较多,可用 apt 的模拟与依赖解析列出全部运行时依赖后批量下载:

apt-cache depends snort
apt-cache depends suricata

完整离线依赖更稳妥的方式是配合 apt-rdepends 递归解析:

apt install -y apt-rdepends
apt-rdepends snort suricata | grep -v '^ ' | xargs apt-get download

4.2 内网机器离线安装

将下载的 deb 拷贝到内网目标机后:

dpkg -i ./snort_*.deb ./suricata_*.deb ./libhtp2_*.deb
apt-get install -f

⚠️ 预期行为:dpkg -i 只安装指定 deb,若缺少依赖会报 dependency problems,随后 apt-get install -f 尝试从本地缓存补全依赖;内网环境请确保依赖 deb(libpcre3、libnetfilter-queue1、libhtp2 等)已一并下载。Snort 的安装仍旧会写 /etc/snort/snort.debian.conf,离线安装时若出现 debconf 交互,可参照 3.1 节预置后安装。

4.3 离线规则集

离线环境无 suricata-update 外网源,可单独下载规则 tarball 后解压到规则目录:

mkdir -p /etc/suricata/rules
tar -xzf <规则包>.tar.gz -C /etc/suricata/rules

并确认 suricata.yaml 中的 default-rule-path 指向该目录。

五、配置详解

5.1 Snort 配置核心

Snort 主配置 /etc/snort/snort.conf 关键项(实测):

配置项实测值/含义
ipvar HOME_NET定义本网段,用于规则匹配方向,默认在 snort.debian.conf 中由安装脚本写入
var RULE_PATH /etc/snort/rules规则基础路径,所有 include 均基于该变量
include $RULE_PATH/local.rules本地规则引入(Ubuntu 包默认已存在)
include $RULE_PATH/xxx.rules各分类规则引入语句,位于 snort.conf 末尾
config alertfile告警文件路径
var CLASSIFICATIONclassification.config 分类映射

规则加载原理:snort.conf 的末尾以 include $RULE_PATH/<分类>.rules 的方式逐个引入规则文件。新增自定义规则有两种推荐做法:

  • 方式一:把自定义规则写进 /etc/snort/rules/local-test.rules,再在 snort.conf 末尾追加一行 include $RULE_PATH/local-test.rules(本文实战采用,需保证行末为当前最后一条 include);
  • 方式二:直接扩展已 include 的分类规则文件,但不建议和分发规则混写,便于升级覆盖时丢失。

Ubuntu 包安装后会把 snort 注册为 systemd 服务,监听网卡与网段在 /etc/snort/snort.debian.conf(Debian 包专用)中定义,例:

DEBIAN_SNORT_HOME_NET=192.168.0.0/16
DEBIAN_SNORT_INTERFACE=eth0

5.2 Suricata 配置核心

Suricata 主配置 /etc/suricata/suricata.yaml 关键项(实测):

配置项实测值/含义
HOME_NET本网段,等于 192.168.0.0/16(示例)
EXTERNAL_NET外部网段,默认 !$HOME_NET(除本网段外)
default-rule-path规则默认路径 /etc/suricata/rules
rule-files以列表形式声明要加载的规则文件,不写任何文件时 -T 会报 SC_ERR_NO_RULES
alert-output/fast控制 fast.log 输出开关与文件名
outputs/eve-log控制 eve.json 结构化事件输出开关与字段
runmode运行模式(autofp/workers 等)
af-packetAF_PACKET 抓包规则块

规则文件通过 rule-files 列表加载;本文实战用 -S /etc/suricata/custom.rules 以「独占模式」额外加载自定义规则,不修改 yaml。

Suricata 配置函数支持 --set name=value 在命令行临时覆盖 yaml 参数,例如:

suricata --set outputs.0.eve-log.enabled=no --dump-config | tail -5

5.3 配置语法自检

Snort 配置自检(-T,不启动监听):

snort -T -c /etc/snort/snort.conf

实测回显(关键部分):

...
Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 3.1  <Build 1>
...
Preprocessor Object: SF_MODBUS  Version 1.0  <Build 1>
Preprocessor Object: SF_SSLPP   Version 1.1  <Build 2>
Preprocessor Object: SF_IMAP    Version 1.0  <Build 1>
Preprocessor Object: SF_SMTP    Version 1.4  <Build 1>
Preprocessor Object: SF_DNP3    Version 1.0  <Build 1>
Preprocessor Object: SF_POP     Version 1.0  <Build 1>
Preprocessor Object: SF_GTP     Version 1.0  <Build 1>
Preprocessor Object: SF_DNS     Version 1.2  <Build 1>
Preprocessor Object: SF_REPUTATION Version 1.0  <Build 1>
Preprocessor Object: SF_SDF     Version 1.0  <Build 1>
Preprocessor Object: SF_FTPTELNET Version 1.2  <Build 1>
Preprocessor Object: SF_SSH     Version 1.2  <Build 1>
Preprocessor Object: SF_DCERPC2 Version 1.0  <Build 1>
Preprocessor Object: SF_SIP     Version 1.0  <Build 1>
Preprocessor Object: appid     Version 1.0  <Build 1>
...
Snort successfully validated the configuration!
Snort exiting

出现 Snort successfully validated the configuration! 即配置合法。

Suricata 配置自检:

suricata -T -c /etc/suricata/suricata.yaml

实测回显(关键部分):

6/10/2026 -- 15:09:58 - <Info> - Running suricata under test mode
...
 - <Notice> - This is Suricata version 6.0.4 RELEASE running in SYSTEM mode

若 yaml 中未配置任何 rule-files 且 --set 未提供规则,会报:

SC_ERR_NO_RULES(42) No rule files match /etc/suricata/rules/suricata.rules

这是预期告警,加载规则(见六章)后再自检即消除。

六、规则管理

6.1 Snort 规则

Snort 规则目录 /etc/snort/rules/ 实测内容(.rules 为主,另含 local.rules 与若干分类):

ls -1 /etc/snort/rules/
attack-responses.rules
backdoor.rules
bad-traffic.rules
chat.rules
community-bot.rules
community-dos.rules
community-exploit.rules
community-ftp.rules
community-game.rules
community-icmp.rules
community-imap.rules
community-inappropriate.rules
community-mail-client.rules
community-misc.rules
community-nntp.rules
community-oracle.rules
community-policy.rules
community-sip.rules
community-smtp.rules
community-sql-injection.rules
community-virus.rules
community-web-attacks.rules
community-web-cgi.rules
community-web-client.rules
community-web-dos.rules
community-web-iis.rules
community-web-misc.rules
community-web-php.rules
ddos.rules
deleted
dns
dos
experimental
exploit
finger
ftp
icmp
icmp-info
imap
info
local.rules
misc
multimedia
mysql
netbios
nntp
oracle
other-ids
p2p
policy
pop2
pop3
porn
rpc
rservices
scan
shellcode
smtp
snmp
sql
telnet
tftp
virus
web-attacks
web-cgi
web-client
web-coldfusion
web-frontpage
web-iis
web-misc
web-php
x11

查看某规则文件的规则条数实测(例如 backdoor.rules 与 bad-traffic.rules):

grep -c 'alert' /etc/snort/rules/backdoor.rules
grep -c 'alert' /etc/snort/rules/bad-traffic.rules

实测值:backdoor.rules 77 条,bad-traffic.rules 14 条。

规则文件加载情况可通过自检输出中的规则统计确认,例如:

snort -T -c /etc/snort/snort.conf 2>&1 | grep -i "rule count"

💡 自检会打印每个规则文件加载数量与总 SID 数,可用于核对 include 是否生效;若自定义规则未出现在统计中,说明 include 顺序或 RULE_PATH 路径有误。

6.2 Suricata 规则

Suricata 规则目录 /etc/suricata/rules/ 默认内容(apt 安装仅带事件规则,默认无社区 suricata.rules):

ls -1 /etc/suricata/rules/
app-layer-events.rules
decoder-events.rules
dhcp-events.rules
dnp3-events.rules
dns-events.rules
files.rules
http-events.rules
http2-events.rules
ipsec-events.rules
kerberos-events.rules

⚠️ 注意:默认规则集不含社区攻击签名,若直接 -T 自检会报 SC_ERR_NO_RULES。生产环境推荐执行 suricata-update 拉取 ET(Emerging Threats)Open 规则集,或用 -S 自定义规则文件 独占加载。

更新规则:

suricata-update

该命令从规则源(Emerging Threats Open 等)拉取最新规则并合并写入规则目录;离线环境参见 4.3 节离线规则集方案。

查看 Suricata 能解析的应用层协议:

suricata --list-app-layer-protos

6.3 自定义规则实战写法(本文自测)

自写测试规则 Snort 版 /etc/snort/rules/local-test.rules:

alert tcp any any -> any any (msg:"TESTSIG Snort TCP/HTTP traffic"; sid:2000001; rev:1;)

在 /etc/snort/snort.conf 末尾追加引入(实测追加内容):

include $RULE_PATH/local-test.rules

自写测试规则 Suricata 版 /etc/suricata/custom.rules:

alert icmp any any -> any any (msg:"TESTSIG ICMP echo/ping detected"; sid:1000001; rev:1;)
alert http any any -> any any (msg:"TESTSIG HTTP request seen"; sid:1000002; rev:1;)

规则字段速查:

字段含义
动作(alert)命中后产生告警
协议(tcp/icmp/http)匹配的协议,Suricata 支持 http/tls/dns 等应用层关键字
源/目的地址与端口 any any全部来源/目的
msg告警中显示的消息
sid唯一规则编号
rev规则修订号,冲突/更新时递增便于去重

七、命令详解

7.1 Snort 命令与关键参数

Snort 命令行核心参数:

参数含义
-A <mode>告警模式:fast / full / console / test / none / unsock
-b以 tcpdump 二进制格式记录原始流量
-B <mask>IP 地址混淆掩码
-c <rules>指定规则文件(通常即 snort.conf)
-C日志中只记录 ASCII 纯字符负载
-d记录应用层数据
-D后台守护运行
-e记录第二层数据链路头
-F <bpf>从 BPF 文件读取过滤表达式
-g <gid>指定运行组
-G <id>日志标识字符串
-h <hn>指定 home 网段覆盖 HOME_NET
-i <if>指定监听接口
-l <dir>指定日志目录
-q静默模式(减少输出)
-r <pcap>离线回放 pcap 文件
-k none关闭校验和校验(回环接口/部分镜像流量必须)
-S <var>定义/覆盖 snort.conf 中的变量
-T配置自检模式
-u <uid>指定运行用户
-v交互式详细输出

常用示例:

# 后台监控 eth0,日志写入 /var/log/snort
snort -q -D -i eth0 -c /etc/snort/snort.conf -l /var/log/snort
# 离线回放并控制台实时打印告警(fast 告警格式)
snort -A fast -r demo.pcap -c /etc/snort/snort.conf -l /tmp/snortlog
# 仅做配置测试,不改动任何网卡
snort -T -c /etc/snort/snort.conf

7.2 Suricata 命令与关键参数

Suricata 命令行核心参数:

参数含义
-c <path>指定配置文件
-T测试模式(校验配置,不启动监听)
-i <dev>实时 pcap 监听指定接口
-F <bpf>指定 BPF 过滤文件
-r <pcap>离线回放 pcap 文件
-qnfqueue 内联(IPS)模式
-s <path>加载补充规则
-S <path>独占模式只加载指定规则文件(本文实战使用)
-l <dir>指定日志目录
-D后台守护运行
-k [all|none]校验和模式,none 关闭校验(回环包必用)
-V显示版本
-v详细信息(可多次 -vv)
--list-app-layer-protos列出支持的应用层协议
--list-runmodes列出运行模式
--build-info显示构建信息与特性
--dump-config转储合并后的完整配置
--set name=value命令行覆盖配置项
suricatasc -c通过 Unix socket 发送控制命令

常用示例:

# 后台监控 eth0
suricata -D -i eth0 -c /etc/suricata/suricata.yaml
# 离线回放(关闭校验和),日志写入 /tmp/surilog
suricata -k none -r demo.pcap -c /etc/suricata/suricata.yaml -l /tmp/surilog
# 独占加载自定义规则离线回放并检测
suricata -k none -r demo.pcap -S /etc/suricata/custom.rules -l /tmp/surilog -c /etc/suricata/suricata.yaml

配置调试辅助:

# 查看合并后配置(可用于解析 YAML 生效值)
suricata --dump-config | head -20
# Unix socket 控制(查询/启用规则集等)
suricatasc -c "get-version"

八、实战演练(自我校验 + 离线回放真实检出)

本章复用第七章起的真实测试规则,用一段实际捕获的 HTTP 流量回放,验证 Snort 与 Suricata 均能真实检出告警,并解读告警字段。以下全部输出均为本次实验真实回显。

⚠️ 前提:demo.pcap 是在本机 lo(回环)接口上捕获的一段 HTTP 请求/响应流量(访问 http.server),共 34 packets / 5660 bytes。回环接口发包时校验和不正确,回放必须加 -k none 关闭校验和,否则引擎报 SC_ERR_INVALID_CHECKSUM(11) 拒绝处理。

8.1 先校验两侧配置

Snort 侧,确认自定义规则被加载(重现 6.3 节的自测 lint):

sed -n '$p' /etc/snort/snort.conf    # 查看末尾是否含 include(示例文件越界时以 grep 为准)
grep -n 'local-test' /etc/snort/snort.conf
...(示例输出)...
include $RULE_PATH/local-test.rules
snort -T -c /etc/snort/snort.conf

(实测结尾确认 Snort successfully validated the configuration!,且规则统计包含 2000001 号规则。)

Suricata 侧为回放准备日志目录:

mkdir -p /tmp/surilog

8.2 Snort 离线回放检出(console 模式)

执行离线回放并实时打印告警到控制台:

snort -A console -r /tmp/pcapdemo/demo.pcap -c /etc/snort/snort.conf -l /tmp/snortlog -k none

实测检出回显(真实告警行):

10/06-15:13:47.605174  [**] [1:2000001:1] TESTSIG Snort TCP/HTTP traffic [**] [Priority: 0] {TCP} 127.0.0.1:43268 -> 127.0.0.1:8080

告警字段解读:

片段含义
10/06-15:13:47.605174命中的时间戳
[1:2000001:1]GID:SID:Rev,即 group 1、SID 2000001、revision 1
TESTSIG Snort TCP/HTTP traffic规则 msg 字段
[Priority: 0]优先级(此处为自定义规则默认值)
{TCP}传输层协议
127.0.0.1:43268 -> 127.0.0.1:8080源地址:端口 到 目的地址:端口

可见全部 HTTP 请求连接均被规则 alert tcp any any -> any any 命中,说明 Snort 成功完成离线检测。

8.3 Suricata 离线回放检出(fast.log / eve.json)

执行离线回放(-k none + 独占自定义规则):

suricata -k none -r demo.pcap -S /etc/suricata/custom.rules -l /tmp/surilog -c /etc/suricata/suricata.yaml

实测启动回显(关键部分):

... - <Info> - Running suricata under test mode ...
This is Suricata version 6.0.4 RELEASE running in USER mode
...
all 7 packet processing threads, 4 management threads initialized, engine started.
...
Pcap-file module read 1 files, 34 packets, 5660 bytes
...

💡 注意回放时以 USER mode 运行、非 SYSTEM mode,属离线 pcap 回放的正常表现;34 packets, 5660 bytes 与抓包时 tcpdump 统计一致,证明全部包被读取。

查看 fast.log 文本告警:

cat /tmp/surilog/fast.log

实测 fast.log 内容(告警行):

10/06/2026-15:13:47.605281  [**] [1:1000002:1] TESTSIG HTTP request seen [**] [Classification: (null)] [Priority: 3] {TCP} 127.0.0.1:8080 -> 127.0.0.1:43268

💡 该行由 HTTP 应用层规则 alert http any any -> any any(SID 1000002)命中产生,说明 Suricata 的 HTTP 解析生效;而 ICMP 规则(SID 1000001)在此纯 HTTP 流量中未命中是预期结果。

查看结构化事件 eve.json:

jq '{event_type, signature, src_ip, dest_ip, proto, flow}' /tmp/surilog/eve.json

实测 eve.json 中 alert 事件字段(摘要):

{
  "event_type": "alert",
  "signature": "TESTSIG HTTP request seen",
  "src_ip": "127.0.0.1",
  "dest_ip": "127.0.0.1",
  "proto": "TCP",
  "flow": {"pkts_toserver": 1, "bytes_toserver": 156, "pkts_toclient": 0, "bytes_toclient": 0}
}

eve.json 事件字段解读:

字段含义
event_type事件类型,告警为 alert
signature命中规则签名(规则 msg)
src_ip / dest_ip源/目的 IP
proto传输层协议(TCP/UDP/ICMP)
flow会话层上下行包与字节统计

关闭校验和的原因复盘:曾不加 -k none 重跑,告警日志顶部出现 SC_ERR_INVALID_CHECKSUM(11) 并跳过全部回环包,导致零检出。加上 -k none 后同一 pcap 立即检出,说明回放环路流量必须关闭校验和校验,详见 7.1 / 7.2 参数表。

8.4 小结

  • Snort 与 Suricata 均对本实验的 demo.pcap 真实检出 HTTP/应用层流量,自动生成 SID、msg、时间戳、协议与五元组告警;
  • Snort 侧可用 -A console/-A fast 实时打印,Suricata 侧产出 fast.log 与 eve.json 双通道结构;
  • 两个工具共用 -k none 解决回环校验和问题后实测检出一致,印证「同样 pcap、同样规则思路」的跨工具复用性。

九、systemd 服务管理

systemctl 每行仅操作一个单元,禁用 for/while 批量循环。以下命令每条仅作用于一个服务单元。

9.1 Snort 服务管理

查看服务状态:

systemctl status snort

启动/停止/重启(一次一个单元):

systemctl start snort
systemctl stop snort
systemctl restart snort

查看是否开机自启:

systemctl is-enabled snort
systemctl is-active snort

设置/取消开机自启:

systemctl enable snort
systemctl disable snort

查看服务单元文件与日志:

systemctl cat snort
journalctl -u snort -n 50

9.2 Suricata 服务管理

查看服务状态:

systemctl status suricata

启动/停止/重启(一次一个单元):

systemctl start suricata
systemctl stop suricata
systemctl restart suricata

查看是否开机自启:

systemctl is-enabled suricata
systemctl is-active suricata

设置/取消开机自启:

systemctl enable suricata
systemctl disable suricata

查看服务单元文件与日志:

systemctl cat suricata
journalctl -u suricata -n 50

💡 apt 安装后 Snort 与 Suricata 均默认注册为 systemd 服务单元;Snort 实际监听需确认 /etc/snort/snort.debian.conf 的接口与网段已按实际环境配好,否则启动可能在自检阶段退出。生产建议用 systemctl is-enabled 与 is-active 双查后,纳入常见监控巡检。

十、注意事项

以下为实测过程中总结的关键注意事项:

  • ⚠️ 回环/镜像流量的校验和问题:在 lo 接口或用镜像口抓到的包往往校验和不正确,Snort/Suricata 检测引擎默认校验和,直接跳过这些包导致零检出。离线回放必须加 -k none,这是全文实战能检出的关键前提。
  • ⚠️ Suricata 版本查询用 -V:Suricata 6.x 用 suricata -V 显示版本,用 --version 会报 unrecognized option;构建特性则用 suricata --build-info。
  • ⚠️ 默认无规则导致的 SC_ERR_NO_RULES:apt 装 Suricata 默认不带社区规则,-T 自检会报 SC_ERR_NO_RULES(42)。生产务必 suricata-update 或自写规则后加载。
  • ⚠️ snort.conf 的 include 顺序与路径:自定义规则须在 snort.conf 末尾追加 include $RULE_PATH/<文件>.rules,且文件必须存在于 /etc/snort/rules 下;否则自检不报文件缺失但规则不生效。
  • ⚠️ 规则 SID 冲突:社区规则占用 1-1,000,000 段,自定义规则建议从 1,000,000 之后(如 Snort 用 2xxxxxx、Suricata 用 1xxxxxx)分配,并保持 rev 递增,避免升级覆盖导致冲突/告警去重异常。
  • ⚠️ 告警模式差异:默认 -A fast 写 fast.log;需要立即看到命中可用 -A console;需要全量二进流量用 -b;生产环境告警量通常会大,务必配合阈值/threshold.conf 抑制。
  • ⚠️ 监听接口与业务隔离:IDS 建议旁路监听镜像口(SPAN)或独立接口,不要与业务抢占带宽;作为内联 IPS 使用(Suricata -q / NFQueue)前务必先在 IDS 模式充分验证规则正确性,避免误阻断业务。
  • ⚠️ eyes 日志目录权限:/var/log/suricata 与 /var/log/snort 日志含攻击特征,建议保持默认权限并定期轮转(logrotate),防止被访客读取泄密且避免磁盘写满。
  • ⚠️ 更新与维护:Suricata 用 suricata-update 定期更新规则;Snort 需手动维护规则集;版本升级前先 -T 自检配置兼容性。
  • ⚠️ 误报与白名单:任何 IDS 都会误报,生产需结合 classification.config/reference 与业务网段,利用 HOME_NET、IP 白名单规则或自定义规则把已知正常流量过滤,聚焦真正的异常。

十一、常见问题(FAQ)

11.1 Suricata -V 正常但 --version 报错,为什么?

Suricata 6.x 把 --version 收敛进 -V,输入 suricata --version 会返回 unrecognized option;正确用法是 suricata -V。查看详细特性用 suricata --build-info。

11.2 离线回放一包都检不出(零告警)怎么办?

优先检查校验和:回环/镜像流量校验和通常非法,被检测引擎当作坏包跳过,日志出现 SC_ERR_INVALID_CHECKSUM(11)。解决方案是回放时加 -k none(如 suricata -k none -r demo.pcap ...、snort -r demo.pcap -k none ...)。详见第八章复盘。

11.3 Suricata 自检报 SC_ERR_NO_RULES 是什么问题?

apt 安装默认只带 app-layer-events.rules 事件规则,无社区 suricata.rules,yaml 里 rule-files 引用的文件不存在。处理:suricata-update 拉取规则,或把自写规则放到默认路径,或用 -S 规则文件 独占指定。

11.4 自定义规则没生效/不命中怎么排查?

按顺序:1)确认文件存在于规则目录;2)Snort 在 snort.conf 末尾正确 include,Suricata 在 yaml 的 rule-files 或 -S 指定;3)snort -T / suricata -T 自检看规则统计与 SID 是否加载;4)用 tcpdump 确认 pcap 里确实有对应协议(如 http 请求);5)验证 -k none 校验和问题是否已排除。

11.5 Snort 与 Suricata 能否同时运行?

可以,二者监听不同接口即可;若同一接口需错开。注意资源与端口冲突,生产建议分工或只部署其一,避免两份告警互相淹没。

11.6 如何把 Suricata 告警接入 SIEM/日志系统?

默认 eve.json 为结构化 JSON,含 src_ip/dest_ip/proto/signature 等字段,可直接对接 Logstash/Splunk/Cribl 或自研采集器;只需注意 eve.log 开启开关与磁盘轮转。

11.7 规则更新后老告警继续出现是为什么?

Suricata 会做规则统计与去重,若升级后 SID 未变、rev 未递增,老签名仍被消费;另外缓存/引擎会加载合并后的规则集。更新后建议 suricata -T 校验并查看加载规则数确认新规则生效。

11.8 如何查看已命中的协议与五元组?

Suricata 看 eve.json 的 alert 事件(src_ip/dest_ip/proto/sport/dport/flow);Snort 看 fast.log/console 的 {TCP} 127.0.0.1:8080 -> 127.0.0.1:43268 字段。

11.9 是不是只有 HTTP/ICMP 能检出?

不是。规则可针对任意协议与端口,应用层规则(http/tls/dns/smtp)需要 Suricata 的关键字支持。本文用 ICMP/HTTP 作为最直观的自测样例,实际你可对探测、扫描、恶意域名等定义相应特征规则。

11.10 生产环境规则太多拖慢性能怎么办?

Suricata 用多线程(实测 7 packet processing threads)+ autofp/workers 运行模式;Snort 用单接口分工、必要时多实例。合理设置 HOME_NET、裁剪不必要的 include、利用阈值抑制高频误报,均可显著降耗。确需真正阻断时先用 IDS 模式充分验证,再考虑 IPS 内联。

十二、卸载方式

12.1 卸载 Snort

systemctl stop snort
apt-get purge -y snort

说明:purge 会删除程序与 /etc/snort 下的配置;如需保留配置仅移除程序,用 apt-get remove -y snort。(卸载动作本次未实测,命令基于 dpkg 常规行为,执行前请自行确认。)

清理可选残留目录:

rm -rf /var/log/snort

12.2 卸载 Suricata

systemctl stop suricata
apt-get purge -y suricata

说明:purge 会删除程序与 /etc/suricata 配置;明确期望移除规则集再清理 /var/lib/suricata 与日志。(卸载动作本次未实测,命令基于 dpkg 常规行为,执行前请自行确认。)

清理可选残留:

rm -rf /var/log/suricata
rm -rf /var/lib/suricata

十三、参考链接

Ubuntu 22.04 Snort 与 Suricata 入侵检测部署与命令详解 - Quzuo