nftables 计数器记录/存储在哪里,它们持续多久?

ouc*_*cil 5 networking traffic logging accounting nftables

我正在尝试使用规则上的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
Run Code Online (Sandbox Code Playgroud)

我正在使用stateful objects(命名计数器)分别对来自 IPv4 和 IPv6 地址的所有流量求和,命名为os-traffic-4os-traffic-6。然后我可以使用命令行来获取这些统计信息nft list counter stats os-traffic-6

我的问题是:

  1. 这些统计信息存储在哪里,我在任何地方的日志中都没有看到它们,并且在任何文档中都找不到参考?

  2. 这些统计数据在机器重新启动后会持续存在还是计数器会重置?

  3. 如果它们确实重置,我如何在启动时恢复它们?我相信在使用时可以包含计数器值,add rule... packets 1234 bytes 123456但是如何为命名计数器执行此操作以及... #1...我从哪里获取这些数字?

谢谢你的帮助!

And*_*mes 5

我相信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
Run Code Online (Sandbox Code Playgroud)
# /var/lib/nftables.state

add counter stats os-traffic-4
add counter stats os-traffic-6
Run Code Online (Sandbox Code Playgroud)
# /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
Run Code Online (Sandbox Code Playgroud)

编辑:应阻止该systemctl reload nftables.service命令以使自动计数器存储正常工作。因此,需要部署一个附加文件:

# /etc/systemd/system/nftables.service.d/block-systemctl-reload.conf

[Service]
ExecReload=
Run Code Online (Sandbox Code Playgroud)