nftables计数器是内建轻量级监控机制,需显式添加counter并命名复用;创建后绑定规则,通过nft list查看实时包/字节统计,支持与log、drop等共存实现监控响应闭环。

nftables 的计数器功能不是附加插件,而是内建的轻量级监控机制——它不依赖日志系统或外部工具,只要在规则中显式添加 counter,就能实时累计匹配该规则的数据包数量和字节数。关键在于:计数器本身不改变规则行为,只做记录;要查看数据,需主动查询;且一个计数器可被多条规则复用,避免重复定义。
创建并绑定计数器到具体规则
计数器必须先创建,再在规则中引用。命名要清晰,便于后续识别用途:
- 创建名为
ssh-in-count的计数器:nft add counter inet filter ssh-in-count - 在 INPUT 链中添加规则,匹配来自特定 IP 的 SSH 流量,并调用该计数器:
nft add rule inet filter input ip saddr 203.0.113.45 tcp dport 22 counter name ssh-in-count - 注意:
counter name是显式引用方式;若省略name,nftables 会自动分配匿名计数器,但无法跨规则复用或精准定位
实时查看与解析计数结果
执行 nft list chain inet filter input 即可看到每条带计数器的规则后附带 packets XXX bytes YYY 字段。例如输出中出现:
表示已有 42 个数据包、共 3192 字节匹配该规则。这个数值是原子更新的,不会因并发导致跳变或丢失统计。
- 如需持续观察变化,可用
watch -n1 'nft list chain inet filter input' - 若只想看计数器本身(不含规则),运行:
nft list counter inet filter ssh-in-count
结合其他动作实现“监控+响应”闭环
计数器可与 log、drop、reject 等语句共存于同一条规则,顺序执行(注意 verdict 类语句如 drop 会终结规则):
- 记录并放行:
nft add rule inet filter input tcp dport 80 counter log prefix "HTTP-Allow: " accept - 超限后丢弃(需配合 quota,但计数器可先用于调试阈值):
nft add rule inet filter input ip saddr 192.0.2.0/24 counter name scan-try
之后再加一条基于scan-try统计值的限流规则(如用quota或脚本定期检查)
批量规则统一计数与分类统计
当有多个相似策略(如不同端口的管理服务),可为每类创建专属计数器,便于横向对比:
- 为 DNS 和 NTP 分别建计数器:
nft add counter inet filter dns-countnft add counter inet filter ntp-count - 分别绑定:
nft add rule inet filter input udp dport 53 counter name dns-countnft add rule inet filter input udp dport 123 counter name ntp-count - 后续用
nft list counters inet filter一次性列出所有计数器状态,快速判断哪类流量突增










