nftables
我尝试使用规则中的名称来跟踪从一组特定 IP 地址(IPv4 和 IPv6)传输的总数据counter
。我的目标是能够在一个日历月内跟踪此总数,以便根据使用情况计费。
相关规则如下:
add table stats
add counter stats os-traffic-4
add counter stats os-traffic-6
add chain inet stats INPUT { type filter hook input priority 0; }
add rule ip stats INPUT ip saddr 192.168.123.123 counter name os-traffic-4
add rule ip stats INPUT ip saddr 192.168.123.234 counter name os-traffic-4
add rule ip stats INPUT ip saddr 192.168.123.345 counter name os-traffic-4
add rule ip6 stats INPUT ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234 counter name os-traffic-6
add rule ip6 stats INPUT ip6 saddr 1234:1234:1234:1234:1234:1234:1234:2345 counter name os-traffic-6
add rule ip6 stats INPUT ip6 saddr 1234:1234:1234:1234:1234:1234:1234:3456 counter name os-traffic-6
我使用(命名计数器)分别对来自 IPv4 和 IPv6 地址(名为和stateful objects
)的所有流量进行汇总。然后我可以使用命令行获取这些统计数据。os-traffic-4
os-traffic-6
nft list counter stats os-traffic-6
我的问题是:
这些统计数据存储在哪里,我在任何日志中都看不到它们,也没有在任何文档中找到参考?
这些统计数据在机器重启后还会保留吗?或者计数器会重置吗?
如果它们确实重置了,我该如何在启动时恢复它们?我相信在使用时可以包含计数器值,
add rule... packets 1234 bytes 123456
但我该如何为命名计数器执行此操作,还有……#1……我从哪里获得这些数字?
谢谢你的帮助!
答案1
我认为nftables
计数器仅存储在内核内存中,类似于表和规则。它们可能不会在重启后保留。
我建议永久记录计数器值如下:
- 在单独的文件中声明您的计数器并将其包含在主
nftables
配置文件中。 - 使用当前值更新计数器声明文件。
根据您使用的发行版,您可能有一个nftables.service
从配置文件加载规则的单元。如果是这样,您可以设计一个依赖于nftables.service
并将计数器值写入状态文件的服务。例如,在 Arch Linux 中,旨在nftables.service
从加载防火墙规则/etc/nftables.conf
,因此您可以定义这些配置文件:
# /etc/nftables.conf
add table stats
# Counter definitions go to '/var/lib/nftables.state'
include "/var/lib/nftables.state"
add chain inet stats INPUT { type filter hook input priority 0; }
add rule ip stats INPUT ip saddr 192.168.123.123 counter name os-traffic-4
add rule ip stats INPUT ip saddr 192.168.123.234 counter name os-traffic-4
add rule ip stats INPUT ip saddr 192.168.123.345 counter name os-traffic-4
add rule ip6 stats INPUT ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234 counter name os-traffic-6
add rule ip6 stats INPUT ip6 saddr 1234:1234:1234:1234:1234:1234:1234:2345 counter name os-traffic-6
add rule ip6 stats INPUT ip6 saddr 1234:1234:1234:1234:1234:1234:1234:3456 counter name os-traffic-6
# /var/lib/nftables.state
add counter stats os-traffic-4
add counter stats os-traffic-6
# /etc/systemd/system/nftables-persist-counters.service
[Unit]
BindsTo=nftables.service
After=nftables.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecStop=/bin/bash -c '/usr/bin/nft list counters > /var/lib/nftables.state'
[Install]
WantedBy=multi-user.target
编辑:必须阻止该systemctl reload nftables.service
命令才能使自动计数器存储正常工作。因此,需要部署附加文件:
# /etc/systemd/system/nftables.service.d/block-systemctl-reload.conf
[Service]
ExecReload=