nftables内核原生计数器可实时统计业务端口包量和字节数,无需日志或额外服务;需为关键端口显式命名计数器(如http-in-count),按协议+方向+用途规范命名,支持快速查询、脚本导出及与log/限速联动。

直接在规则里加 counter,再配合命名和定期查询,就能实时看到业务端口的包量和字节数——不依赖日志、不启动额外服务,内核原生支持。
给关键端口单独配命名计数器
命名是复用和定位的前提。比如监控 Web 流量,别用匿名 counter,而是显式创建并引用:
nft add counter inet filter http-in-countnft add rule inet filter input tcp dport 80 counter name http-in-countnft add rule inet filter input tcp dport 443 counter name https-in-count
每条业务端口规则绑定独立计数器,避免混在一起难以区分。名称建议带协议+方向+用途,例如 api-v1-https-in 或 mysql-3306-in。
快速查看实时流量数据
执行以下任一命令即可获取当前统计:
-
nft list chain inet filter input:显示所有 INPUT 链规则,含packets XXX bytes YYY字段 -
nft list counter inet filter http-in-count:只看指定计数器,干净无干扰 -
watch -n1 'nft list counter inet filter http-in-count':每秒刷新,适合盯屏观察突增
数值是原子更新的,不会因并发漏记;单位为原始包数和字节数,可直接用于计算 QPS 或带宽(例如 10 秒内 bytes 增加 2MB,即平均 200KB/s)。
导出数据供脚本或监控系统使用
想把计数结果喂给 Prometheus 或写入日志,可用 shell 提取关键字段:
- 提取 HTTP 入向包数:
nft list counter inet filter http-in-count | awk '/packets/ {print $2}' - 提取字节数并转 MB:
nft list counter inet filter http-in-count | awk '/bytes/ {printf "%.2f\n", $2/1024/1024}' - 组合成一行 CSV:
echo "$(date +%s),$(nft list counter inet filter http-in-count | awk '/packets/{p=$2}/bytes/{b=$2} END{print p","b}')"
配合 cron 每分钟采集一次,就能生成小时级流量趋势。注意:nftables 不自带时间戳,需脚本自行添加。
与 log 或限速联动做闭环响应
计数器本身只统计,但能和其他动作共存于同一条规则,实现“看见即响应”:
- 记录 + 放行:
nft add rule inet filter input tcp dport 80 counter log prefix "HTTP-IN: " accept - 超阈值告警(配合外部脚本):
nft add rule inet filter input ip saddr 203.0.113.0/24 counter name api-scan-try,再用定时任务检查api-scan-try的 packets 是否 5 分钟超 100,触发邮件或封 IP - 和 quota 结合做硬限流:
nft add rule inet filter input tcp dport 3000 counter quota over 100 mbytes drop
注意 verdict 类动作(如 drop、accept)放在 counter 后面,否则后续动作不执行;log 可前置或后置,不影响计数。











