使用 nft 计算动态 Saddr 集上的字节数

使用 nft 计算动态 Saddr 集上的字节数

我正在尝试找出是否有一种简单的方法可以使用 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.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),当然这会触发许多开发包的安装(最好在容器或其他系统上执行此操作),但这超出了本答案的范围。

相关内容