我希望限制与在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并发连接匹配的规则?
发布于 2018-11-13 23:54:49
从Linux4.18内核开始,有一个新的扩展nft_连接极限是已添加,它提供了一个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
几点意见:
counter
是可选的,用于获取一个带有nft list ruleset
的计数器,以了解该规则触发了多少次。ip
的发生替换为ip6
,将得到IPv6的等效值。现在,更有趣的是使用inet
来获得IPv4和IPv6 SSH连接的合并计数,因为它们是通过连接路径来计算的。更新:限制每个网络,而不仅仅是每个IP,相当于iptables的--connlimit-mask
重新阅读来自网络过滤器-开发邮件列表中初始修补程序的稀缺文档时,ct count
并不局限于单独使用(或者仅限于上面的示例)。它可以在meter
表达式/列表中用于任何更复杂的用法。
如果要拒绝连接到端口2222 (其中某个进程正在侦听),每个随机的/24网络源IP在3个连接计数以上,则应使用此规则(NFT0.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
这将创建一个名为计量器的test-2222-count-meter
列表,该列表将动态添加相关的“映射”数据(对于匹配连接的每个不同的/24网络)。我不确定陈旧的数据(即不再有任何连接的/24网络)是否会通过垃圾收集被删除。
该计价器的内容可以列出(它不会显示达到的计数,只有动态添加的“地图”时,看到新的网络)。例如,在与10.0.3.1
、10.0.3.66
、10.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 }
}
}
https://serverfault.com/questions/934092
复制相似问题