能在 CentOS 上部署自定义规则目录,启用威胁情报源,并用 -T 校验整套规则集。
上一课的设计已经定稿:官方规则集由 suricata-update 拉取聚合,自定义与试验规则分层隔离,威胁情报源以 IP/域名黑名单形式接入,集成后还要回归测试防误报。现在把这张设计图落成可运行的配置。这一节只完成一个目标:自定义规则目录被加载,威胁情报源被启用,整套规则集通过 -T 校验。执行顺序三步:部署自定义规则文件,用 suricata-update 合并情报源,用测试模式校验最终规则集。
先记住两个位置。发行版安装的 Suricata,配置文件位于 /etc/suricata/suricata.yaml。suricata-update 会把规则安装到 /var/lib/suricata/rules,配置默认只引用其中的 suricata.rules 一个文件。后续所有步骤都围绕这两处展开。
"纳入配置"的意思很具体:suricata.yaml 的规则文件列表里必须出现你的自定义文件,否则 Suricata 根本不会读它。
操作边界先讲清楚:本节只改本机配置,只跑本地校验和离线回放,不向任何外部目标发送探测流量。
确认环境与规则基线
- 1
查看版本与构建信息,确认安装可用。若命令不存在,说明 Suricata 未安装或不在 PATH 中。
bashsudo suricata --build-info - 2
查看服务状态。服务应处于运行状态,或至少已被启用。
bashsudo systemctl status suricata - 3
若服务未运行,启动它。
bashsudo systemctl start suricata - 4
列出默认规则目录,确认 suricata.rules 存在。再用 wc 记录它的行数,作为稍后核对加载数量的基线。
bashls -l /var/lib/suricata/rules wc -l /var/lib/suricata/rules/suricata.rules
你应该看到
四条命令正常返回:版本信息可读,服务处于运行或已启用状态,/var/lib/suricata/rules 下存在 suricata.rules,并已记录基线行数。
部署自定义规则并纳入配置
- 1
在默认规则目录下创建自定义规则文件 local.rules(文件名可自定)。写入一条之前写过的告警规则,包含 msg 与唯一 sid。参考格式:alert tcp any any -> any any (msg:"local test rule"; content:"example"; sid:99000001; rev:1;)。文件放这里,是为了与 suricata-update 的输出共用同一套路径。
bashsudo vim /var/lib/suricata/rules/local.rules - 2
打开 suricata.yaml,找到列出规则文件路径的配置节——它默认引用 /var/lib/suricata/rules 下的 suricata.rules——在列表后追加对 local.rules 的引用,保存退出。
bashsudo vim /etc/suricata/suricata.yaml - 3
立刻用测试模式做一次快速校验,让语法错误在合并大规则集之前暴露。若报错,先解决再继续。
bashsudo suricata -T -c /etc/suricata/suricata.yaml
你应该看到
测试模式无错误退出,没有路径或语法报错;local.rules 中的自定义规则已被读取。
写规则后立刻 -T,抓自己的语法错误。再跑 suricata-update,它抓取并合并情报源,写入 /var/lib/suricata/rules/suricata.rules。最后再跑一次 -T:这次校验的是线上将真正加载的最终规则集。顺序反过来,你会校验到旧文件;合并后若漏了 local.rules 的引用,自定义规则会被静默忽略。
用 suricata-update 合并威胁情报源
- 1
运行 suricata-update。默认模式抓取 ET Open 规则集,这是威胁情报源在 Suricata 侧的落地方式。
bashsudo suricata-update - 2
确认更新结果:规则被安装到 /var/lib/suricata/rules,合并为唯一的 suricata.rules 文件。
bashls -l /var/lib/suricata/rules/suricata.rules - 3
重启服务,让新的规则集生效。
bashsudo systemctl restart suricata - 4
查看启动日志,确认引擎正常启动。日志最后一行与类似内容结尾:所有处理线程与管理线程初始化完成、引擎已启动。
bashsudo tail /var/log/suricata/suricata.log - 5
(可选)另开一个终端跟踪统计输出,确认引擎在持续处理数据。
bashsudo tail -f /var/log/suricata/stats.log
你应该看到
suricata-update 报告更新完成;/var/lib/suricata/rules/suricata.rules 已更新;重启后日志末尾显示引擎已启动。
用 -T 校验整套规则集并核对加载
- 1
对整套规则集运行测试模式。此刻规则集包含合并后的 suricata.rules 与你的 local.rules,校验的是最终形态。
bashsudo suricata -T -c /etc/suricata/suricata.yaml - 2
检查输出有无错误。若报文件路径问题,对照日志逐条核对 suricata.yaml 中的每个路径,修正后再跑。
- 3
核对规则加载数量:与基线行数比较,确认启用威胁情报源后数量增长,且自定义规则被计入。若数量没变化,先检查 local.rules 是否真的进了规则文件列表。
- 4
(可选)离线验证自定义规则:先确认 fast.log 输出已在 suricata.yaml 中启用,再回放本地 PCAP。
bashsudo suricata -r /path/to/test.pcap - 5
打开 fast.log(与 suricata.log 同目录),确认自定义规则的 sid 出现在告警中。
你应该看到
-T 无错误退出;规则加载数量与基线对比符合预期(启用源后增长、自定义规则计入);可选回放后 fast.log 出现自定义规则的告警。
fast.log 需要先在 suricata.yaml 中启用输出,离线回放时才会写入告警。若回放后没看到告警文件,按顺序排查:fast.log 输出开启了吗,规则被加载了吗,流量真的匹配了吗。
遇到问题:-T 或服务启动时报错,提示找不到规则文件。典型表现:日志显示 suricata.yaml 中指定的文件不在预期位置。
可能原因
- suricata.yaml 中引用的规则文件路径与实际文件位置不一致。
- 自定义规则文件已创建,但没写进 suricata.yaml 的规则文件列表。
- 文件权限不足,Suricata 运行用户读不到规则文件。
排查步骤
- 对照日志逐条核对 suricata.yaml 中的每个路径:把文件放到日志所指位置,或修正配置里的引用。
- 确认 local.rules 已加入规则文件列表,再重新运行 -T。
- 检查规则文件属主与权限,确保运行用户可读。
- 需要 fast.log 时,先在 suricata.yaml 中启用 fast.log 输出。
本节全部操作都在本机完成:改配置、跑 -T 校验、离线回放 PCAP。不要用新写的规则去探测未授权目标,也不要把测试流量指向外部网络。威胁情报源的启用只涉及拉取与加载规则文件,本身不产生对外探测流量;规则验证一律使用本地 PCAP 或授权靶场流量。
自检:用 -T 校验整套规则集时,命令是什么?期望结果是什么?如何确认自定义规则被加载?
命令是 sudo suricata -T -c /etc/suricata/suricata.yaml。期望无错误退出,规则文件全部被读取。确认方法:把 local.rules 写入 suricata.yaml 的规则文件列表,再用 suricata-update 把威胁情报源合并进 /var/lib/suricata/rules/suricata.rules;-T 与启动日志给出的加载计数应包含自定义规则,数量与基线对比符合预期。