【问题标题】:iptables rate limiting connection requestiptables 限速连接请求
【发布时间】:2018-05-26 07:50:34
【问题描述】:

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

【问题讨论】:

    标签: tcp ubuntu-14.04 iptables rate-limiting ufw


    【解决方案1】:

    经过长时间的反复试验后才发现这一点。解决方案是使用 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

    参考文献

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2018-11-05
      • 2015-12-18
      相关资源
      最近更新 更多