nftables 的 stateful 机制本身不定义“非法包”,需结合 conntrack 状态(如 invalid、new/established)与 counter 规则手动识别;invalid 包最接近非法,但可能由异常导致;通过对比 new 与 established 计数比值可发现扫描或暴力破解;需持久化配置并脚本监控告警。

直接用 nftables 的 stateful(有状态)机制配合 counter,并不能自动识别“非法包”——它本身不定义什么是非法,只负责按规则匹配和计数。所谓“非法”,必须由你明确定义:比如未建立连接的 TCP SYN 包被放行后又没完成三次握手、来自黑名单 IP 的 ICMP 请求、或目的端口未开放却持续发包等。真正起作用的是“规则逻辑 + counter + conntrack 状态判断”的组合。
先理解 stateful 和 counter 的分工
nftables 的 stateful 能力依赖内核 conntrack 模块,可识别数据包所属连接的状态:
– established:已建立的双向通信(如 HTTP 响应、SSH 后续包)
– related:关联连接(如 FTP 数据通道、ICMP 错误报文)
– new:新连接发起(如首次 TCP SYN、UDP 首包)
– invalid:无法归类到任何连接,或校验失败、分片异常、TCP 标志位矛盾(如 SYN+FIN)——这才是最接近“非法包”的内建状态
而 counter 是独立动作,仅记录匹配该规则的数据包数量,不改变逻辑,但为后续分析提供量化依据。
用 counter 标记并统计 invalid 包
这是最直接追踪潜在非法流量的方式:
- 在 filter 表的 input 链开头添加规则,专门捕获并计数 invalid 状态包:
- 执行后,可用以下命令实时查看计数:
输出中会显示类似 counter name invalid_pkts packets 42 bytes 3576 的行,说明已有 42 个 invalid 包被拦截。
- 注意:invalid 不等于攻击,可能是网络设备异常、NAT 失步、或内核 conntrack 表溢出导致的状态丢失。但持续增长需警惕。
结合 new/established 追踪可疑新建连接
很多扫描和暴力破解行为表现为大量 new 连接尝试,但极少进入 established:
- 给所有 new 包加 counter(放在 established 规则之前):
- 再单独给 established 包也加 counter:
- 过一段时间对比两个计数器:
– 若 new_conn_attempt 远大于 established_conn(比如 1000:5),说明大量连接尝试失败,极可能是端口扫描或 SSH 暴力破解;
– 可配合日志(如log prefix "SCAN:" level debug)进一步确认源 IP。
让 counter 支持长期追踪与告警
默认 counter 只存在内存中,重启或 flush 会清零。要持续追踪需:
- 将规则写入配置文件(如
/etc/nftables.conf),确保开机加载; - 用脚本定时采集 counter 值,例如每分钟执行:
nft list chain ip filter input -a | grep 'counter name' | awk '{print $4, $6}'
输出形如 invalid_pkts 127,存入日志或推送到监控系统; - 当 invalid_pkts 每分钟增长 >50,或 new_conn_attempt/established_conn 比值连续 5 分钟 >200,触发邮件或 Telegram 告警。

















