使用 iptables 限制高负载服务器端口的传入连接总数

使用 iptables 限制高负载服务器端口的传入连接总数

我有一个在某个端口上监听的服务器程序,我想限制该端口的传入 TCP 连接总数。

我尝试了以下规则:

-A INPUT -p tcp --syn --match multiport --dports 443,4443 -m connlimit --connlimit-above 15000 --connlimit-saddr --connlimit-mask 0 -j DROP

但会导致“ksoftirqd”的 CPU 占用率过高,数据包响应延迟过高。服务器的正常流量是总共有大约 14000 ~ 15000 个连接来自 9000 ~ 11000 个不同的源 IP。还有其他解决方案吗?

操作系统:Red Hat Enterprise Linux Server 版本 7.5。iptables
:v1.4.21

答案1

您遇到性能问题并不奇怪,因为您现在要求系统花费大量时间计算连接数以确定连接数是否超过任意数量,并且系统必须在每次新请求时执行此操作。 (出于某种原因,您似乎正在建立许多短暂的连接。如果可以,请尽量避免这种情况。)

最终,如果您想保持这种性能水平,您应该在服务器前面放置一个单独的防火墙,它可以执行所有必要的连接跟踪,并让您的服务器专注于为其应用程序提供服务。不过,这会带来一点延迟,因此,如果您的应用程序对延迟非常敏感,那么您可能根本没有任何好的解决方案。(除了让短暂的连接更长。)

相关内容