离线回放 PCAP 用测试模式触发首条告警

约 30 分钟

能在 CentOS 上用 suricata -T 校验规则,并用 -r 回放本地 PCAP 在 fast.log 中看到首条告警。

上一课,你学会了把规则头拆成动作、协议、源地址、源端口、方向、目的地址、目的端口七段,并写出了语法正确的规则头。但规则此刻还只是写在文件里的一行字,Suricata 并不知道它的存在。要让这条规则真正生效,需要走完三步:校验、回放、核对。

校验,用测试模式确认规则语法无误,Suricata 愿意加载。回放,把录好的 PCAP 当作现场流量重新过一遍,看规则是否命中。核对,打开 fast.log,找到属于这条规则的告警行。

全程在 CentOS 命令行完成,只用本地 PCAP 与回环流量。

核心概念

测试模式:上线前先自检

类比:寄信前先让校对者通读草稿。格式错、地址缺,都被拦下,不会真的寄出去。

技术定义:测试模式让 Suricata 加载配置文件与规则文件,逐条检查规则语法后退出,不进入持续检测。命令是 suricata -T -c suricata.yaml -S 规则文件:-c 指向配置文件,-S 指向规则文件。输出里没有语法错误,说明规则被接受,可以进入回放。

核心概念

离线回放:对着录像复盘

类比:比赛前看录像。不必重赛一场,把录好的比赛放一遍,就能逐回合研究。

技术定义:离线回放让 Suricata 直接读取 PCAP 文件,像处理实时流量一样逐包匹配规则并写日志。官方论坛给出的用法是 suricata -r path-to-pcap。回放只读文件、不发数据包,适合拿真实抓包验证规则。配合 -S 指定规则文件,就能用自己的规则验证。

核心概念

fast.log:一行一条告警

类比:值班日志。每发生一件事,登记一行:时间、对象、原因。翻日志就能快速回顾发生了什么。

技术定义:fast.log 是 Suricata 的纯文本告警日志,规则每命中一次写一行,行里带有规则消息与签名 ID(sid)。论坛的验证流程正是回放后打开 fast.log 确认是否识别出威胁。fast.log 需要先在 suricata.yaml 中启用输出,否则不会生成。

校验、回放、核对首条告警

  1. 1

    建实验目录,写入规则文件。这条是官方快速入门用于测试 IDS 功能的签名,原样复制即可;它会对任何载荷中含该内容的 IP 流量告警。选项细节后续课程展开。

    bash
    mkdir -p /root/suricata-lab
    cat > /root/suricata-lab/local-test.rules <<'EOF'
    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;)
    EOF
  2. 2

    确认配置文件路径。拿不准安装方式时先看构建信息;打包安装用 /etc/suricata/suricata.yaml,源码安装用 /usr/local/etc/suricata/suricata.yaml。

    bash
    suricata --build-info
  3. 3

    用测试模式校验规则。把 -c 指向实际配置文件,-S 指向刚写的规则文件。

    bash
    sudo suricata -T -c /etc/suricata/suricata.yaml -S /root/suricata-lab/local-test.rules
  4. 4

    读输出。没有 error、规则加载成功,进入回放;有报错先看排查块,修正路径后重试。

  5. 5

    新开一个终端,在回环接口抓包,写入 test.pcap。

    bash
    sudo tcpdump -i lo -w /root/suricata-lab/test.pcap
  6. 6

    回到原终端,向 127.0.0.1 的 discard 端口发送匹配串。普通括号就是规则要匹配的字节。

    bash
    echo 'uid=0(root)' | nc -u 127.0.0.1 9
  7. 7

    回抓包终端,确认 tcpdump 有捕获计数后按 Ctrl+C 结束。已有授权环境抓的 PCAP 也可以代替,前提是其中包含规则匹配的内容。

  8. 8

    离线回放 PCAP。默认读取安装时找到的 suricata.yaml。

    bash
    sudo suricata -r /root/suricata-lab/test.pcap -S /root/suricata-lab/local-test.rules
  9. 9

    核对 fast.log 末尾。

    bash
    sudo tail -n 20 /var/log/suricata/fast.log
  10. 10

    找到包含 2100498 的行,这就是这条规则触发的告警。再回放一次 PCAP,fast.log 会多追加一行。

你应该看到

suricata -T 输出无语法错误、规则加载成功;回放后 /var/log/suricata/fast.log 中出现包含 sid 2100498 的告警行。若 fast.log 为空,说明 PCAP 载荷中没有匹配内容,重新生成后再回放。

遇到问题:运行 suricata -T 或 suricata -r 时报错,提示文件找不到或路径不正确,规则未加载。

可能原因

  • 命令行里 -c 或 -S 指向的文件不存在、路径拼错。
  • suricata.yaml 中引用的文件不在预期位置。官方论坛建议:根据日志提示,逐一核对 suricata.yaml 里的每个路径。
  • 把源码安装的路径当成打包安装路径,或反之;两者默认位置不同。

排查步骤

  1. 读报错日志,记下它提示的每个路径。
  2. 逐个检查这些路径与文件是否存在,修正 suricata.yaml 或命令行参数。
  3. 用 suricata --build-info 确认安装方式与版本。
  4. 确认 -S 指向的规则文件名与大小写完全一致。
  5. 重新运行 -T,直到无语法错误。

遇到问题:回放正常结束,但 fast.log 不存在或为空。

可能原因

  • suricata.yaml 未启用 fast.log 输出。官方论坛提醒:别忘了在 suricata.yaml 设置中启用 fast.log 输出。
  • PCAP 载荷里没有规则要匹配的内容,规则没有命中。
  • 日志目录没有写入权限,回放没有真正落盘。

排查步骤

  1. 检查 suricata.yaml 中 fast.log 输出是否启用,启用后重新回放。
  2. 看 tcpdump 的捕获计数确认抓到了包;重发一次载荷再回放。
  3. 查看 /var/log/suricata/suricata.log,确认回放过程无报错。
  4. 用 sudo tail -n 20 /var/log/suricata/fast.log 查看文件末尾。
自检:你写完一条新规则。按顺序,先用哪条命令校验语法?再用哪条命令回放?最后从哪里确认规则命中?

先用 suricata -T -c <配置文件> -S <规则文件> 校验,无 error 即通过;再用 suricata -r <PCAP> -S <规则文件> 离线回放;最后打开日志目录下的 fast.log,找到包含该规则 sid 的告警行。