为了设置上下文,我们有一个遗留服务器,它为来自大量客户端的连接提供服务。连接是 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 泛滥但最终变慢并允许所有客户端建立连接。