我正在尝试找出是否有一种简单的方法可以使用 nft 动态构建 Saddr 列表并计算每个数据包/字节的数量。我不想对流量施加任何限制 - 只需测量它即可。
我知道如何构建动态集并向其中添加发现的 Saddrs。但我找不到任何语法可以让我为每个 Saddr 添加一个计数器。
我知道如何向将 Saddrs 添加到集合中的规则添加计数器。 (虽然不是我想要的)
我知道如何为名为 Saddr 的个人创建和使用显式计数器。
我知道我可以使用我已经拥有的知识来创建一个动态集 - 检查它,然后为每个 Saddr 创建单独的规则,但似乎必须有更好的方法来做到这一点。
我看到很多连接限制代码的示例,这些示例在列出时表明计数可用,但没有一个似乎可以直接适用(并且没有一个似乎通过我的机器上的 nft 语法检查)。
我在树莓派 4 ( raspbian buster )、内核版本 5.4.51 和 nftables v0.9.0 (Fearless Fosdick) 中运行它
我是一个完全的 nft 初学者。
答案1
添加了有关将计数器与集合一起使用的多项改进nftables版本后0.9.0。
0.9.1src:将有状态表达式集成到集合和映射中:
以下示例展示了如何从数据包路径填充一组 使用目标 IP 地址,每个条目都有一个计数器。
[...]计数器是一个有状态对象。
0.9.4src:支持恢复元素计数器:
这个补丁可以让你恢复动态集中的计数器:
0.9.4src:支持集合定义中的计数器:
该补丁允许您为集合中的每个元素打开计数器。
您的预期用途需要 0.9.1。如果您想将这些计数器保存并恢复到之前的值(例如:在重新启动期间),则应使用 0.9.4。 0.9.4 还允许在预填充集合时简化语法,其中每个元素都应该有一个计数器。
所以对于一个非常基本示例计数全部传入源地址,遵循这些链接中的示例并保留旧type
语法而不是typeof
,可以使用(至少nftables0.9.1):
table ip accounting
delete table ip accounting
table ip accounting {
set inputcounters {
type ipv4_addr # with 0.9.4 could be replaced with: typeof ip saddr
# counter # optional, requires 0.9.4
flags dynamic # appeared in 0.9.1
# timeout 7d # consider using a timeout, possibly shorter, to avoid overflowing the set
size 65535 # or a bigger size
}
chain input {
type filter hook input priority 0; policy accept;
add @inputcounters { ip saddr counter } # 0.9.1 mandatory. Add new element *with counter* if not already present
ip saddr @inputcounters # match element so increment its counter
}
}
可能会有优化。 Maybect state new
会被缓存,并且比尝试在集合中添加重复地址(导致无操作)更快。 ETC。
Debian 的buster-backports 目前提供nftables0.9.6。
您可以尝试直接使用它(尽管要注意弗兰肯Debian)或者更好地从 debian 格式的源重新编译,如果直接来自 Debian 可能会更容易破坏者向后移植因为它们已经适合巴斯特目标。例如,通过遵循并改编 Debian 中的示例简单向后移植创建。
可能涉及多个步骤(例如:首先“向后移植”libnftnl之前需要源码nftables),当然这会触发许多开发包的安装(最好在容器或其他系统上执行此操作),但这超出了本答案的范围。