0

为了设置上下文,我们有一个遗留服务器,它为来自大量客户端的连接提供服务。连接是 tcp 并使用二进制协议。最近随着客户端的增加,服务器似乎无法处理所有进入的连接,尤其是在服务器重新启动时。在这种情况下,服务器会进入一些不一致的状态,并在 CLOSE_WAIT 中丢失连接。

如果客户端连接请求交错,服务器最终会承担负载。我们通过在 docker 中模拟客户端来验证这一点。

由于服务器没有内置速率限制,我决定尝试 iptables 看看是否可以使用 iptables 中的速率限制功能来错开传入的连接请求。连接可以来自相同的 ip 或不同的 ip。

速率限制不应影响任何已建立的连接,而只会影响较新的连接(3 次握手)。由于客户端具有重试逻辑,因此它们最终会重新连接。因此,不想通过 ip 进行速率限制,因为即使来自同一源 ip 的所有连接最终都应该在不干扰已建立连接的情况下连接。

这是我正在使用的 iptables 规则。这是正确的方法吗?

   iptables -A INPUT -i eth0 -p tcp --dport 9000 -m state --state NEW,ESTABLISHED -m recent --set -j ACCEPT

   iptables -A INPUT -i eth0 -p tcp --dport 9000 -m state --state NEW -m recent --update --seconds 600 --hitcount 11 -j REJECT --reject-with tcp-reset

我对 iptables 不熟悉,目前在 Ubuntu 14.04 上使用 ufw 包装器。上述想法来自此链接https://www.cyberciti.biz/tips/howto-limit-linux-syn-attacks.html

目的是防止 SYN 泛滥但最终变慢并允许所有客户端建立连接。

4

1 回答 1

0

经过长时间的反复试验后才发现这一点。解决方案是使用 iptables 限制模块对任何新传入连接的连接进行速率限制。

最终在 /etc/ufw/before.rules 中添加了以下链

-A ufw-before-input -p tcp --dport 9000 -m state --state RELATED,ESTABLISHED -j ACCEPT -A ufw-before-input -p tcp --dport 9000 -m state --state NEW -m limit --limit 4/min --limit-burst 4 -j ACCEPT -A ufw-before-input -p tcp --dport 9000 -j DROP

参考

于 2018-01-10T18:45:31.160 回答