Suricata本身不具拦截能力,需配合iptables/nftables与NFQUEUE实现IPS阻断;必须编译时启用--enable-nfqueue、配置suricata.yaml中mode: ips及nfq输入模块,并设置对应队列号的iptables规则。

Suricata 本身不直接阻断流量,必须配合 nfqueue + iptables(或 nftables)才能实现全网卡实时 IPS 阻断。规则加载和阻断生效是两个独立环节,漏掉任一环节都会导致“有告警无拦截”。
确认 Suricata 编译时启用了 NFQ 支持
这是最容易被跳过的前提。如果安装的是系统包(如 apt install suricata 或 yum install suricata),默认通常**不带 NFQ 支持**——它只支持 IDS 模式。
- 运行
suricata --build-info,检查输出中是否包含NFQ字样;若没有,说明当前二进制不支持 IPS - 源码编译必须显式加
--enable-nfqueue参数,例如:./configure --enable-nfqueue --prefix=/usr - 依赖库缺失会导致 configure 静默禁用 NFQ,务必提前装齐:
libnetfilter_queue-devel、libnfnetlink-devel(CentOS/RHEL)或libnetfilter-queue-dev(Debian/Ubuntu)
配置 af-packet 和 nfq 双模式并存
Suricata 的 af-packet 用于高效抓包,nfq 才是拦截通路。不能只配一个。
- 在
/etc/suricata/suricata.yaml中,确保af-packet接口已启用(如interface: eth0),且mode: ips已设 - 关键:启用
nfq输入模块,取消注释并配置:inputs: - nfq: mode: repeat repeat-mark: 1 repeat-mask: 1 -
repeat-mark/mask是防止封禁后流量二次入队的关键,否则可能死循环或丢包
iptables 规则必须精准匹配 NFQ 队列 ID
Suricata 默认监听 NFQ 队列 0,但如果你用 -q 1 启动,iptables 就必须指向队列 1,否则完全不通信。
- 最简可用命令(假设 Suricata 监听队列 0):
iptables -I FORWARD -j NFQUEUE --queue-num 0 - 仅对特定方向生效更安全,比如只拦入站攻击:
iptables -I INPUT -j NFQUEUE --queue-num 0 - 若用
nftables,等效写法:nft add rule inet filter forward queue num 0 - 注意:规则链必须是
INPUT/FORWARD/OUTPUT,不能是自定义链;且需在其他 DROP 规则之前插入
规则库加载失败的三个典型表现
即使 Suricata 启动成功,规则没生效也拦不住任何东西。常见症状和验证方式如下:
- 日志里反复出现
Rule file not found或No rules loaded→ 检查rule-files:路径是否拼错,文件权限是否为 Suricata 进程可读(如suricata用户) - 启动时提示
0 signatures processed→ 多半是规则语法错误,用suricata -T -c /etc/suricata/suricata.yaml测试配置+规则加载 - 有告警但无拦截 → 先确认
nfq模块是否在suricata.yaml中启用;再用iptables -t mangle -L -n -v看对应 NFQUEUE 规则是否有包计数
真正难调的不是单点配置,而是整个路径闭环:网卡收包 → af-packet 解析 → 规则匹配命中 → nfq 入队 → iptables 把包送进队列 → Suricata 处理并返回 verdict → 内核执行 DROP。任意一环断开,就只剩日志里安静的告警。

















