Ubuntu 22.04 Snort 与 Suricata 入侵检测部署与命令详解
Ubuntu 22.04 系统开源入侵检测系统(IDS)Snort 与 Suricata 的安装(在线 apt 与离线 deb)、配置、规则管理与命令实测详解,含离线回放真实检测与告警解读
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,由思科维护,工作流程为:
- 解码(Decode):对数据链路层至传输层报头逐层解码,填充 Packet 结构;
- 预处理(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 等,详见自检输出)做会话重组、端口扫描检测、协议解析与规范化;
- 规则匹配(Detection):由规则引擎逐条加载规则,对每个包执行特征匹配,命中则按告警动作(log / alert / drop 等)输出;
- 输出(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 风格的规则语法,工作特点:
- 多线程流水线:通过 CPU 亲和性划分多个数据包处理线程(实测启动回显
all 7 packet processing threads, 4 management threads initialized, engine started.),天然适配多核服务器; - 高度可配置:所有行为由 /etc/suricata/suricata.yaml 控制,支持 Unix socket、AF_PACKET、NFQueue、eBPF/XDP 等多种抓包与内联模式;
- 应用层协议解析:基于 LibHTP 与 Rust 引擎深度解析 HTTP、TLS、SMTP 等协议,规则可针对应用层内容匹配;
- 结构化事件输出:默认输出 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.conf | suricata.yaml(YAML 高度可调) |
| 规则语法 | Snort 规则 | 兼容 Snort 规则,另有 SURICATA 增强规则 |
| 版本查询 | snort -V | suricata -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 CLASSIFICATION | classification.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-packet | AF_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 文件 |
-q | nfqueue 内联(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
十三、参考链接
- Snort 官方网站:https://www.snort.org
- Snort 规则文档:https://www.snort.org/documents
- Suricata 官方网站:https://suricata.io
- Suricata 规则语法文档:https://docs.suricata.io/en/latest/rules/
- Suricata 配置文档:https://docs.suricata.io/en/latest/quickstart.html
- Emerging Threats Open 规则:https://rules.emergingthreats.net/open/
- Ubuntu 22.04 Snort 包页:https://packages.ubuntu.com/jammy/snort
- Ubuntu 22.04 Suricata 包页:https://packages.ubuntu.com/jammy/suricata
- Ubuntu 22.04 官方文档:https://ubuntu.com/server/docs
- tcpdump/libpcap 手册:https://www.tcpdump.org