首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用nftable设置最大连接限制?

如何使用nftable设置最大连接限制?
EN

Server Fault用户
提问于 2018-10-05 04:48:30
回答 1查看 5.4K关注 0票数 5

我希望限制与在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。搜索了大约米,虽然它看起来很棒的速率限制,我找不到任何建议,我可以做的等量的connlimit

因此,如果我想使用nftables,如何创建一个只与X并发连接匹配的规则?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2018-11-13 23:54:49

从Linux4.18内核开始,有一个新的扩展nft_连接极限已添加,它提供了一个ct count表达式。

在这种情况下,相应的规则(从头开始)将是:

代码语言:javascript
运行
复制
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

几点意见:

  • 与往常一样,counter是可选的,用于获取一个带有nft list ruleset的计数器,以了解该规则触发了多少次。
  • ip的发生替换为ip6,将得到IPv6的等效值。现在,更有趣的是使用inet来获得IPv4和IPv6 SSH连接的合并计数,因为它们是通过连接路径来计算的。
  • 必须避免4.19.0和4.19.9之间的内核,因为使用此特性可能会使主机崩溃。(即将到来的)内核4.20和内核4.19.10包括几个与连接计数、修复崩溃和错误计数相关的补丁。内核4.18.x状态未知。

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

重新阅读来自网络过滤器-开发邮件列表中初始修补程序的稀缺文档时,ct count并不局限于单独使用(或者仅限于上面的示例)。它可以在meter表达式/列表中用于任何更复杂的用法。

如果要拒绝连接到端口2222 (其中某个进程正在侦听),每个随机的/24网络源IP在3个连接计数以上,则应使用此规则(NFT0.9.0/内核4.19.10):

代码语言:javascript
运行
复制
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

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

该计价器的内容可以列出(它不会显示达到的计数,只有动态添加的“地图”时,看到新的网络)。例如,在与10.0.3.110.0.3.6610.0.4.5172.31.4.5建立了一些联系之后:

代码语言:javascript
运行
复制
# 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  }
    }
}
票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/934092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档