nftables的counter功能本身不直接生成热力图,但提供精确的规则级包/字节统计,是构建端口流量热力图最可靠的数据源;需为各业务端口显式命名计数器、在对应规则中引用,并用脚本定时采集、归一化速率、分档着色后可视化。

nftables 的 counter 功能本身不直接生成热力图,但它能提供实时、精确的每条规则级包/字节数统计——这是构建端口流量热力图最可靠的数据源。关键在于:用 counter 做轻量采集,再用外部脚本聚合、时间对齐、可视化输出。
给每个业务端口单独配带命名的计数器
不要依赖匿名 counter,必须显式命名,确保可识别、可复用、可批量提取:
- 为 HTTP(80)、HTTPS(443)、API(3000)、管理(22)等端口分别创建计数器:
nft add counter inet filter http-in nft add counter inet filter https-in nft add counter inet filter api-in nft add counter inet filter ssh-mgmt
- 在对应规则中引用(注意协议前置、链位置合理):
nft add rule inet filter input tcp dport 80 counter name http-in nft add rule inet filter input tcp dport 443 counter name https-in nft add rule inet filter input tcp dport 3000 counter name api-in nft add rule inet filter input ip saddr 203.0.113.45 tcp dport 22 counter name ssh-mgmt
这样每条业务端口的流入流量就被独立、原子地累计,互不干扰。
用脚本定时采集并结构化输出
counter 数据需主动拉取,推荐用 nft list chain 提取全部计数器字段,再解析:
- 每 5 秒执行一次采集(可用
watch -n5或 systemd timer):nft list chain inet filter input | awk '/counter name/ {print $3, $5, $7}' | while read name pkts bytes; do echo "$(date -Iseconds),${name},${pkts},${bytes}" done >> /var/log/nft-ports.log - 输出格式示例:
2026-05-22T08:05:10+00:00,http-in,12483,9821456
这种 CSV 结构可直接被 Grafana、Python pandas 或 Prometheus + node_exporter + custom exporter 消费。
映射到热力图维度的关键处理逻辑
热力图通常按「时间 × 端口」或「端口 × 流量强度」呈现,需两步转换:
- 归一化速率:把原始 bytes/pkts 转为 bps/pps(例如:用滑动窗口计算过去 60 秒增量 ÷ 60)
- 分档着色:定义阈值区间(如 0–100KB/s → 蓝,100–1MB/s → 黄,>1MB/s → 红),避免线性缩放失真
- 可选增强:叠加连接数(
ct count)、错误包比例(配合ip protocol icmp计数器)作为第二维度
不依赖日志、不修改内核、不引入代理的极简方案
整个流程完全基于 nftables 原生命令:
- counter 是内建机制,无额外开销,统计精度达包级
- 所有采集脚本运行在用户态,不影响防火墙策略执行
- 若已有 Prometheus,可用
nftables_exporter(社区轻量 exporter)自动抓取并暴露为指标,接入 Grafana 热力图面板只需配置heatmap类型图表 + 正确 label 过滤(如nft_counter_bytes{chain="input",counter=~"http-in|https-in|api-in"})
本质上,nftables counter 是“数据探针”,热力图是“仪表盘”。探针埋得准、采得稳,仪表盘自然清晰可信。

















