要设置上下文,我们有一台旧服务器,可以为来自大量客户端的连接提供服务。连接是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泛洪,但最终会减慢并允许所有客户端建立连接。
答案 0 :(得分: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
参考