4. Snort运行模式与基础命令

Snort 的四种运行模式并不是四个互不相关的功能,而是同一条抓包—解码—检测流水线上不同“出口”的选择:嗅探模式把解码结果直接打印到终端,包记录模式把原始报文写入磁盘,IDS 模式在检测后产生告警但不阻断,IPS 模式则在检测命中后直接丢弃或替换报文。理解这条流水线,才能理解为什么同一份规则文件在不同模式下表现完全不同。

Snort 四种运行模式的数据流向与出口差异 网卡抓包 libpcap / DAQ 协议解码 Ether/IP/TCP 规则检测 snort.conf + rules 嗅探模式 -v / -d / -e 终端打印报文摘要 不落盘、不告警 用途:链路连通性验证 包记录模式 -l <目录> -b 写 pcap 文件 snort.log.时间戳 用途:取证与离线回放 IDS 模式 -c snort.conf -A alert_fast 命中规则 → 告警 报文仍被放行 用途:旁路监测 IPS 模式 -Q --daq afpacket 命中规则 → drop/reject 报文被丢弃 用途:串联阻断 关键差异: ① 是否加载规则:嗅探/包记录不加载规则;IDS/IPS 必须 -c 加载 snort.conf。 ② 是否影响转发:嗅探/包记录/IDS 只观察;IPS 位于转发路径上,可丢包。 ③ 输出去向:终端 / pcap 文件 / 告警文件或 syslog / 阻断动作 + 告警。

四种模式的命令行形态

嗅探模式是最轻量的形态,只做抓包和解码,不加载任何规则。常用参数是 -v(显示 TCP/UDP 头部摘要)、-d(显示应用层数据)、-e(显示以太网帧头)。例如在 eth0 上观察 20 个包:

snort -v -i eth0 -n 20
# 输出示例(示例数据,非实测)
# 10/12-09:31:02.114 192.168.10.23:51422 -> 10.0.0.8:80
# TCP TTL:64 TOS:0x0 ID:34112 IpLen:20 DgmLen:52 DF
# ******S* Seq:0x1A2B3C4D  Ack:0x0  Win:0x7210  TcpLen:32

包记录模式在嗅探的基础上增加 -l 指定输出目录,-b 表示以 tcpdump 二进制格式(pcap)写入,而不是文本。默认文件名形如 snort.log.1697093462,其中数字是 Unix 时间戳。若希望按大小切分,可加 -b 配合 config logfile_limit,或使用 -G 指定文件名后缀。记录下来的 pcap 可以用 -r 回放:

snort -l /var/log/snort -b -i eth0
snort -r /var/log/snort/snort.log.1697093462 -c /etc/snort/snort.conf

IDS 模式必须通过 -c 加载配置文件,否则 Snort 会以嗅探模式启动。告警输出方式由 -A 决定:alert_fast 每行一条告警,适合快速浏览;alert_full 附带报文头部和载荷;alert_json 输出 JSON,便于对接日志平台;console 直接打印到终端。告警文件默认位于 -l 指定目录下的 alert 文件。例如:

snort -c /etc/snort/snort.conf -i eth0 -A alert_fast -l /var/log/snort
# /var/log/snort/alert 示例
# [**] [1:1000001:0] ICMP test ping [**]
# [Classification: Potentially Bad Traffic] [Priority: 2]
# 10/12-09:35:11.882 192.168.10.23 -> 10.0.0.8
# ICMP TTL:64 TOS:0x0 ID:2211 IpLen:20 DgmLen:84 Type:8 Code:0

IPS 模式与 IDS 模式最大的区别在于抓包接口和动作执行。它使用 -Q 进入内联模式,并配合 DAQ 模块(如 --daq afpacket 或 --daq nfq)接管转发路径。此时规则中的 drop、reject、sdrop 动作才会真正生效;在 IDS 模式下这些动作会被降级为 alert。典型启动方式:

snort -Q --daq afpacket -i eth0:eth1 -c /etc/snort/snort.conf -A alert_fast

配置文件加载方式与优先级

Snort 2.x 的配置入口是 snort.conf,其中通过 include 引入规则文件、通过 var 定义 HOME_NET 与 EXTERNAL_NET 等变量、通过 preprocessor 启用流重组和端口扫描检测。Snort 3 则改为 Lua 格式的 snort.lua,规则通过 ips.rules 或 include 加载。无论哪个版本,命令行参数与配置文件的关系都遵循“命令行覆盖配置文件”的原则:-i 覆盖 config interface,-l 覆盖 config logdir,-A 覆盖 output alert_*。因此排查“规则没生效”时,第一步应确认是否真的用了 -c,第二步用 snort -c /etc/snort/snort.conf -T 做配置自检,观察是否报出规则语法错误或变量未定义。

判断当前处于哪种模式,可以看启动日志:出现 “Commencing packet processing” 且无规则加载信息,通常是嗅探或包记录;出现 “Loading rules” 与 “Rule application order” 则是 IDS/IPS;出现 “Inline Mode” 或 DAQ 为 afpacket/nfq 时即为 IPS。
IPS 模式下若规则动作写成 alert 而非 drop,流量不会被阻断,容易误判为“IPS 失效”。上线前应先用 -T 校验规则动作,再用测试流量验证 drop 是否生效。

模式选择速查

模式关键参数是否加载规则是否阻断典型输出
嗅探-v / -d / -e否否终端报文摘要
包记录-l -b否否pcap 文件
IDS-c -A -l是否alert 文件 / syslog
IPS-Q --daq -c是是阻断 + 告警

实际工程中,这四种模式常按“先嗅探确认链路、再包记录留证、然后 IDS 旁路观察、最后 IPS 串联阻断”的顺序推进。每一步都用 -T 或回放 pcap 验证规则命中情况,确认误报率可接受后再进入下一阶段,可以显著降低 IPS 上线后误阻断业务流量的风险。