5.15 入侵检测系统——Snort 与 Suricata 实战
预计阅读时间:13 分钟
📖 目录
本教程面向 Linux 系统管理员与安全工程师,系统讲解网络入侵检测/防御系统(IDS/IPS)的核心概念,并通过 Snort 与 Suricata 两大开源工具的实战部署,帮助读者快速搭建企业级网络安全监控体系。
学习目标
学完本章后,你将能够:
- 理解 IDS 与 IPS 的旁路/串联部署模式,以及签名检测与异常检测的原理差异
- 安装配置 Snort 3,编写检测 ICMP ping、SSH 暴力破解的自定义规则
- 部署 Suricata,并通过 workers 多线程模式与 CPU 亲和性调优吞吐量
- 掌握 Snort/Suricata 规则结构、动作与常用选项(SID、content、HOME_NET)
- 将 Suricata EVE JSON 日志接入 Elasticsearch,用 Kibana 可视化攻击事件
- 通过 Sigma 规则与 MITRE ATT&CK 框架对齐,提升检测覆盖范围
前置知识
- 5.1:Linux 安全加固 Linux 安全加固——攻击面与安全基线认知
- 5.5:防火墙实战 防火墙实战——iptables/netfilter 流量处理机制
- 4.8:集中式日志管理 集中式日志管理——ELK 日志采集与可视化基础
- sec_web01 Web 安全-1:WAF:ModSecurity配置——Web 攻击特征与规则防护思路
一、IDS/IPS 基础概念
1.1 什么是 IDS 与 IPS
| 对比项 | IDS(入侵检测系统) | IPS(入侵防御系统) |
|---|---|---|
| 部署位置 | 旁路监听(TAP/SPAN) | 串联部署(Inline) |
| 工作模式 | 被动检测,告警通知 | 主动阻断,实时拦截 |
| 对流量影响 | 不影响网络延迟 | 引入微小延迟 |
| 典型场景 | 流量审计、事后取证 | 实时防御、高危阻断 |
| 误报代价 | 低(仅告警) | 高(误拦正常业务) |
1.2 检测引擎原理
Snort 与 Suricata 均采用签名检测(Signature-based)和异常检测(Anomaly-based)双引擎模型:
- 签名检测:将流量与已知攻击特征库逐条匹配,准确率高,但无法识别零日攻击
- 异常检测:建立正常流量基线,偏离基线的行为触发告警,可发现未知威胁
- 协议分析:深度解析 TCP/IP 协议栈,识别协议违规与畸形数据包
二、Snort 安装与配置
2.1 安装 Snort
以 Debian/Ubuntu 为例,通过 apt 安装 Snort 3:
# 更新软件源并安装 Snort(注意:Debian/Ubuntu 的 apt 仓库提供的是 Snort 2.9.x,
# 如需 Snort 3 请参考下文源码编译方式)
sudo apt update
sudo apt install -y snort
# 验证安装版本
snort --version
安装过程中会提示配置网络接口和地址段,按实际情况填写。若需要编译安装 Snort 3,可参考以下步骤:
# 安装编译依赖
sudo apt install -y build-essential cmake libpcap-dev libpcre3-dev \
libyaml-dev libjansson-dev libcap-ng-dev libmagic-dev liblzma-dev \
libhyperscan-dev libluajit-5.1-dev pkg-config
# 下载并编译 Snort 3
git clone https://github.com/snort3/snort3.git
cd snort3
./configure_cmake.sh --prefix=/usr/local
cd build
make -j$(nproc)
sudo make install
2.2 核心配置文件
Snort 3 的主配置文件位于 /etc/snort/snort.conf(包管理器安装)或自定义路径。关键配置项:
# 网络定义变量
ipvar HOME_NET 192.168.1.0/24
ipvar EXTERNAL_NET !HOME_NET
# 规则路径
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
# 动态库路径
dynamicpreprocessor directory /usr/lib/snort_dynamicpreprocessor
dynamicengine /usr/lib/snort_dynamicengine/libsf_engine.so
2.3 编写自定义规则
Snort 规则文件存放在 /etc/snort/rules/local.rules,以下为常用检测规则示例:
# 检测 ICMP ping 请求
alert icmp any any -> $HOME_NET any (msg:"ICMP Ping Request"; \
sid:1000001; rev:1; classtype:icmp-event;)
# 检测 SSH 暴力破解(同一源 IP 5 分钟内失败 10 次)
alert tcp any any -> $HOME_NET 22 (msg:"SSH Brute Force Detected"; \
flags:S; threshold:type threshold, track by_src, count 10, seconds 300; \
sid:1000002; rev:2; classtype:attempted-dos;)
# 检测 Nmap SYN 扫描
alert tcp any any -> $HOME_NET any (msg:"Nmap SYN Scan Detected"; \
flags:S,12; threshold:type both, track by_src, count 20, seconds 60; \
sid:1000003; rev:1; classtype:network-scan;)
# 被动匹配已知恶意软件 HTTP 下载(pass 规则示例)
pass tcp any 80 -> $HOME_NET any (msg:"Whitelist Internal HTTP"; \
sid:1000010; rev:1;)
snort -T 测试配置是否正确。
2.4 运行与测试
# 测试配置文件语法
snort -T -c /etc/snort/snort.conf
# 以 IDS 模式运行(旁路监听)
snort -c /etc/snort/snort.conf -i eth0 -A alert_fast
# 以 IPS 模式运行(需 NFQUEUE 支持)
sudo iptables -I FORWARD -j NFQUEUE --queue-num 0
snort -c /etc/snort/snort.conf -i eth0 -Q --daq nfq -A alert_fast
三、Suricata 安装与多线程
3.1 安装 Suricata
# Debian/Ubuntu 安装
sudo apt update
sudo apt install -y suricata
# 验证安装
suricata --build-info | head -20
3.2 多线程架构优势
Suricata 原生支持多线程,相比 Snort 2.x 的单线程模型有显著性能提升:
| 特性 | Snort 2.x | Suricata |
|---|---|---|
| 线程模型 | 单线程 | 多线程(自动/手动配置) |
| 流量处理 | 串行处理 | 并行处理 |
| 10Gbps 吞吐 | 需要多实例 | 单实例可处理 |
| 协议解析 | 基础支持 | 深度解析(TLS/HTTP/2) |
| JSON 输出 | 需要插件 | 原生支持 EVE JSON |
Suricata 的多线程模式通过 /etc/suricata/suricata.yaml 配置:
# 线程配置示例
threading:
set_cpu_affinity: yes
cpu_affinity:
- management-cpu-set:
cpu: [0]
- worker-cpu-set:
cpu: [1, 2, 3]
mode: "exclusive"
threads: 3
priority: 1
# 运行模式
runmode: workers # workers 模式下每个线程处理完整数据包
3.3 规则管理
Suricata 使用 suricata-update 工具自动管理规则集:
# 更新规则库
sudo suricata-update
# 查看已启用的规则来源
sudo suricata-update list-sources
# 启用 ET Open 规则
sudo suricata-update enable-source et/open
# 手动添加自定义规则目录
echo "/etc/suricata/custom-rules" | sudo tee -a /etc/suricata/update.yaml
# 重新生成规则文件
sudo suricata-update
四、Snort/Suricata 规则语法详解
4.1 规则结构
IDS 规则由规则头和规则选项两部分组成:
# 完整规则格式
action protocol src_ip src_port -> dst_ip dst_port (options;)
# 示例:检测 SQL 注入攻击
alert http $HOME_NET any -> $EXTERNAL_NET any ( \
msg:"SQL Injection Attempt Detected"; \
content:"select"; nocase; \
content:"from"; nocase; \
http_uri; \
sid:2000001; rev:1; \
classtype:web-application-attack; \
reference:cve,2023-1234; \
)
4.2 三种核心动作(Action)
| 动作 | 说明 | 适用模式 | 影响 |
|---|---|---|---|
alert | 触发告警并记录日志 | IDS / IPS | 记录匹配流量 |
pass | 放行匹配流量,跳过后续检测 | IDS / IPS | 不记录,降低误报 |
drop | 丢弃匹配数据包 | 仅 IPS | 阻断流量 |
reject | 丢弃并发送 RST/ICMP 拒绝 | 仅 IPS | 通知发送方 |
sdrop | 静默丢弃(无日志) | 仅 IPS | 阻断但不记录 |
# alert 规则示例
alert tcp any any -> $HOME_NET 80 (msg:"Suspicious HTTP Request"; \
content:"GET /admin"; nocase; sid:1000100; rev:1;)
# pass 规则示例(白名单内部管理流量)
pass ip 10.0.0.0/8 any -> $HOME_NET any (msg:"Internal Admin Traffic"; \
sid:1000101; rev:1;)
# drop 规则示例(IPS 模式阻断恶意 IP)
drop ip 192.0.2.0/24 any -> any any (msg:"Block Malicious Subnet"; \
sid:1000102; rev:1;)
4.3 常用规则选项
# 内容匹配与偏移量
content:"/etc/passwd"; depth:20; offset:0;
# 正则匹配(PCRE)
pcre:"/\/etc\/(passwd|shadow)/i";
# 流量状态跟踪
flow:to_server,established;
# HTTP 深度检测
http.method:"POST";
http.uri; content:"/login";
http.client_body; content:"username=";
# 阈值控制(防误报)
threshold:type limit, track by_src, count 1, seconds 60;
五、与 ELK 和 Sigma 集成
5.1 输出到 Elasticsearch
Suricata 原生支持 EVE JSON 输出,可直接对接 ELK Stack:
# /etc/suricata/suricata.yaml 中 EVE 输出配置
outputs:
- eve-log:
enabled: yes
filetype: regular
filename: eve.json
types:
- alert
- http
- dns
- tls
- files
- flow
- netflow
Logstash 配置用于接收 EVE 日志并写入 Elasticsearch:
# /etc/logstash/conf.d/suricata.conf
input {
file {
path => "/var/log/suricata/eve.json"
codec => json
type => "suricata"
}
}
filter {
if [type] == "suricata" {
geoip {
source => "src_ip"
target => "geoip"
}
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "suricata-%{+YYYY.MM.dd}"
}
}
5.2 Kibana 可视化
导入 Suricata 仪表板模板后,可实现:
- 全球攻击地理分布图
- Top 10 恶意 IP 源排名
- 告警趋势时间线
- 协议类型分布饼图
- 高危规则命中热力图
5.3 Sigma 规则集成
Sigma 是通用的检测规则格式,可在不同 SIEM 间迁移。将 Snort/Suricata 规则转换为 Sigma 格式:
# Sigma 规则示例:检测 SSH 暴力破解
title: SSH Brute Force Attempt
id: a]1234567-89ab-cdef-0123-456789abcdef
status: experimental
description: Detects multiple SSH authentication failures
references:
- https://attack.mitre.org/techniques/T1110/
logsource:
category: authentication
service: ssh
detection:
selection:
event_type: alert
alert.signature_id: 1000002
condition: selection
level: high
tags:
- attack.credential_access
- attack.t1110
使用 sigma-cli 工具将 Sigma 规则转换为 Elasticsearch 查询:
# 安装 sigma-cli
pip install sigma-cli pySigma-backend-elasticsearch
# 转换规则
sigma convert -t elasticsearch -p lucene ssh_brute_force.yml > ssh_alerts.toml
IDS/IPS 部署架构参考
# 典型企业部署架构
互联网
│
▼
┌─────────────┐
│ 边缘防火墙 │ ← 第一道防线(状态检测 + ACL)
└──────┬──────┘
│
┌────▼────┐
│ IPS 串联│ ← 第二道防线(实时阻断已知攻击)
│Suricata │
└────┬────┘
│
┌────▼────┐
│ 交换机 │ ← SPAN/TAP 镜像流量
└────┬────┘
│
┌────▼────┐
│ IDS 旁路 │ ← 第三道防线(全流量审计 + 取证)
│ Snort │
└────┬────┘
│
┌──▼──┐
│服务器│ ← 应用层防护(WAF/ModSecurity)
└─────┘
Snort/Suricata 规则性能优化
| 优化手段 | 效果 | 适用场景 |
|---|---|---|
| 减少 content 匹配长度 | 降低内存占用 | 规则数量大时 |
| 使用 fast_pattern | 加速首次匹配 | 长字符串匹配 |
| 禁用不相关协议检测 | 减少协议解析开销 | 明确不需要的协议 |
| 使用 Hyperscan 替代 pcre | 正则匹配速度提升 10x | 大量正则规则 |
| 分组处理流量 | 减少锁竞争 | 多核环境 |
# 查看规则加载统计
suricata -c /etc/suricata/suricata.yaml --list-keywords | grep -c "fast_pattern"
# 禁用不需要的协议检测(减少 CPU 开销)
# 在 suricata.yaml 中
app-layer:
protocols:
modbus:
enabled: false # 不需要工业协议检测
dnp3:
enabled: false
六、Snort 与 Suricata 对比选型
| 维度 | Snort | Suricata |
|---|---|---|
| 开发语言 | C | C |
| 线程模型 | 单线程(3.x 支持多线程但需配置) | 原生多线程 |
| 规则兼容 | Snort 规则 | 兼容 Snort 2.x 规则 + 自有扩展 |
| 高吞吐场景 | 需多实例部署 | 单实例可处理 10Gbps+ |
| 社区生态 | 成熟,规则库丰富 | 活跃,OISF 驱动 |
| 适用场景 | 中小网络、学习入门 | 大型网络、高性能需求 |
常见错误
- Snort/Suricata 启动后无告警输出:检查网卡绑定是否正确(
-i eth0参数)、规则文件是否已加载(snort -T测试配置)、HOME_NET 变量是否与实际网段匹配。 - 规则加载失败或语法报错:自定义规则 SID 必须大于 1000000,避免与官方规则冲突;编写规则后务必运行
snort -T或suricata -T验证语法。 - Suricata 高 CPU 占用但吞吐量不足:确认运行模式是否为
workers(而非single);检查线程亲和性配置(cpu_affinity),确保 worker 线程绑定到独立 CPU 核心。 - EVE JSON 日志为空或缺失:检查
/etc/suricata/suricata.yaml中eve-log配置是否启用、输出目录是否存在写入权限、Logstash 采集路径是否一致。 - IPS 模式阻断正常流量:IPS 的
drop规则误报代价高,上线前应在 IDS 模式下充分观察告警并调优规则;建议先用alert动作验证,确认无误后再改为drop。
最佳实践
- IDS 与 IPS 分阶段部署:先以 IDS 旁路模式上线,观察告警日志调优规则,确认误报率可控后再切换为 IPS 串联模式主动阻断。
- 规则库定期更新:使用
suricata-update自动拉取最新 ET Open 规则;Snort 用户定期执行pull-rules获取官方规则更新,保持检测能力覆盖最新威胁。 - 签名检测 + 异常检测双引擎并用:签名检测覆盖已知攻击特征,异常检测作为零日攻击的补充防线;两者结合才能构建纵深防御。
- 日志接入 SIEM 统一分析:将 Suricata EVE JSON 通过 Logstash 接入 Elasticsearch,配合 Kibana 仪表板实现攻击可视化;高危告警自动触发告警通知。
- 白名单精细化管理:对内部管理流量、已知安全扫描器等场景使用
pass规则白名单,避免误报干扰;白名单规则应注明原因并定期审计。
故障排查案例:Suricata EVE JSON 日志为空
现象:Suricata 运行正常,suricatasc -c stats 显示有流量被处理,但 /var/log/suricata/eve.json 文件为空。
排查:检查 /etc/suricata/suricata.yaml 中 eve-log 配置,发现 enabled: yes 已设置;检查输出目录权限:ls -la /var/log/suricata/ 发现 eve.json 所有者为 root,但 Suricata 进程以 suricata 用户运行。
根因:eve-log 输出目录的写入权限不足,Suricata 无法写入日志文件但未报错(静默失败)。
修复:① 执行 chown -R suricata:suricata /var/log/suricata/;② 在 suricata.yaml 中指定 filename: /var/log/suricata/eve.json 的绝对路径;③ 重启 Suricata 后验证日志输出。
Snort 3 vs Suricata 性能对比
| 指标 | Snort 3 | Suricata | 测试条件 |
|---|---|---|---|
| 1Gbps 线速吞吐 | 单实例可处理 | 单实例可处理 | 标准规则集(~30K 条) |
| 10Gbps 吞吐 | 需 3-5 实例负载均衡 | 单实例 workers 模式可处理 | Intel Xeon 8 核 / 32GB |
| CPU 占用(1Gbps) | ~30% | ~15% | workers 模式,4 worker 线程 |
| 内存占用 | ~500MB | ~800MB | 完整规则集加载后 |
| 规则加载时间 | ~10s | ~5s | 30,000 条规则 |
# 使用 tcpreplay 测试性能
# 回放 pcap 文件并统计告警数量
suricata -c /etc/suricata/suricata.yaml -i eth0 --runmode workers
# 另一终端
tcpreplay -i eth0 --pps=10000 test-traffic.pcap
# 查看告警统计
tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert") | .alert.signature'
练习题
- 在虚拟机中安装 Snort 3,编写自定义规则检测 ICMP ping 和 SSH 暴力破解,使用
hping3和hydra模拟攻击并验证告警输出。 - 部署 Suricata 并配置 EVE JSON 输出到 Elasticsearch + Kibana,在 Kibana 中创建攻击地理分布图和 Top 10 恶意 IP 排名仪表板。
- 对比 Snort 与 Suricata 在不同流量负载下的性能表现:使用
tcpreplay回放 pcap 测试文件,记录两者的 CPU 占用、内存使用和告警延迟差异。
学习检查点
学完本章后,请检验自己是否掌握以下内容:
| 检查项 | 自测问题 | 验证方法 |
|---|---|---|
| 概念理解 | 能用自己的话解释 IDS 与 IPS 的区别及 Snort/Suricata 工作模式 | 尝试向他人讲解 |
| 命令操作 | 能不查文档完成 Snort/Suricata 安装和规则编写 | 在终端实际执行 |
| 原理掌握 | 能说出网络入侵检测的流量分析和特征匹配原理 | 画出流程图 |
| 故障排查 | 能独立排查 IDS 误报率过高或漏报的问题 | 模拟故障并修复 |
| 最佳实践 | 能说明为什么需要定期更新 IDS 规则库 | 对比不同方案 |
本章总结
IDS 以旁路模式监听流量、IPS 以串联模式实时阻断,二者共享规则引擎与检测逻辑,上线时应先以 IDS 观察调优、再切换为 IPS。Snort 轻量易上手,Suricata 借助多线程与深度协议解析更适合高流量场景;将 EVE JSON 接入 ELK 并用 Sigma 规则标准化,才能形成可持续运营的检测体系。