如何设置 nftables 的最大连接限制?

Pet*_*erM 5 linux connlimit nftables

我希望限制 Linux 服务器上运行的给定服务的并发连接数。我的理解是这可以通过iptables使用connlimit模块来完成。例如,如果我想限制与 SSH 服务器的并发连接(并假设默认策略是拒绝),那么这应该允许 10 个并发连接,第 11 个被拒绝(从内存中写入):

iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-upto 10 -j ACCEPT

问题是在我正在构建的新服务器上,我想使用nftables. 虽然我可以connlimit在手册页中找到提到的内容,但它只是简单地说明了consider native interface. Refer to Meters。在搜索了有关 Meters 的信息后,虽然它对于速率限制看起来很棒,但我找不到任何表明我可以做相当于connlimit.

那么,假设我想使用nftables,如何创建一个仅匹配 X 个并发连接的规则?

A.B*_*A.B 2

从 Linux 内核 4.18 开始,添加一个新的扩展nft_connlimit ,提供了一个表达式。ct count

对于这种情况,等效规则(从头开始)将是:

nft flush ruleset
nft add table ip filter
nft add chain ip filter input '{ type filter hook input priority 0; }'
nft add rule ip filter input tcp dport 22 ct count 10 counter accept
# nft add rule ip filter input tcp dport 22 counter reject with tcp reset
Run Code Online (Sandbox Code Playgroud)

一些备注:

  • 与往常一样,counter它是可选的,用于获取计数器nft list ruleset以了解规则触发的次数。

  • 将上述所有出现的替换ipip6将会获得 IPv6 的等效内容。现在更有趣的是使用conntrackinet来获取IPv4 和 IPv6 SSH 连接的组合计数,因为它们是由 conntrack 一起统计的。

  • 必须避免使用 4.19.0 和 4.19.9 之间的内核,因为使用此功能可能会导致主机崩溃。(即将推出)内核 4.20 和内核 4.19.10 包含多个与 conncount、修复崩溃和错误计数相关的补丁。内核 4.18.x 的状态未知。


更新:限制每个网络而不是仅每个 IP,相当于 iptables'--connlimit-mask

重新阅读netfilter-devel 邮件列表中初始补丁中的稀缺文档ct count并不限于单独使用(或仅限于上面的示例)。它可以在meter表达式/列表中用于任何更复杂的用法。

如果想要拒绝对端口 2222(某些进程正在侦听)的连接,且每个随机 /24 网络源 IP 的连接计数超过 3 个,则应使用此规则(从 nft 0.9.0 / 内核 4.19.10 开始):

nft add rule ip filter input tcp dport 2222 meter test-2222-count-meter '{ ip saddr & 255.255.255.0 ct count over 3 }' counter reject with tcp reset
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为的仪表列表test-2222-count-meter,该列表将动态添加相关的“地图”数据(对于每个匹配连接的不同 /24 网络)。我不确定过时的数据(即 /24 网络不再有任何连接)是否通过垃圾收集被删除。

可以列出仪表的内容(它不会显示达到的计数,只显示看到新网络时动态添加的“地图”)。10.0.3.1例如,在10.0.3.6610.0.4.5和 的一些连接之后172.31.4.5

# nft list meter ip filter test-2222-count-meter
table ip filter {
    meter test-2222-count-meter {
        type ipv4_addr
        size 65535
        elements = { 10.0.3.0 : ct count over 3 , 10.0.4.0 : ct count over 3 , 172.31.4.0 : ct count over 3  }
    }
}
Run Code Online (Sandbox Code Playgroud)