限制从一个 IP 地址在一分钟帧内下载网页内容(使用 iptables)

限制从一个 IP 地址在一分钟帧内下载网页内容(使用 iptables)

我们可以在 iptables 上应用哪条规则来限制下载流量,例如我们需要限制客户,以便他在一分钟内只能从一个 ip 地址下载 400 KB?如果他下载更多,那么封锁他的IP 5分钟?不是 apache/nginx,而是 iptabes。我想对那些试图在一分钟帧内获得 > 400kb 的人关闭网络连接。

答案1

这个答案假设这是一个XY问题,而您真正想要的是某种方法来限制每个用户的服务器资源使用,以防止 DoS 攻击。

首先,有更好的选择,不涉及仅使用 iptables,即:

  1. 使用您正在使用的任何服务器软件中内置的速率限制。大多数主要的网络服务器都支持这个内置模块或作为标准模块。这也是对单个系统上特定服务的访问进行速率限制的规范方法。与使用 iptalbes 相比,这具有三大优势:
    • 它不会阻止任何人,但也不允许他们超出带宽上限(前提是您限制每个源 IP 的连接数)。
    • 它不会让您的防火墙因应用程序级策略而混乱。
    • 通常很容易设置。对于 NGinx,它实际上是一行(如果包含每个源的连接限制,则为五行)。对于 Apache,它是两行(不包括加载模块的行)。
  2. 使用一些反向代理软件(在某些情况下甚至可以直接在您的应用程序服务器上运行)来提供速率限制。 Squid 是这种方法的最佳示例之一,但大多数反向代理选项都对其提供某种支持。如果您有多个后端系统,这是规范的方法。
  3. 调整 TCP 窗口缩放参数。这是可靠的,如果正确完成,不会破坏您的客户端,并且一旦稳定就不需要任何动态调整。然而,设置起来并不简单,聪明的客户端可以解决这个问题以提高性能。这可以通过任何服务器软件进行一些工作来完成,但也仅限于每个连接的速率限制。
  4. 使用网络设备队列规则与 iptables 的连接标记相结合来执行真正的每个连接速率限制。设置起来极其复杂,但有两个明显的优点,即它 100% 与协议无关(您可以将它用于任何东西),并且它提供极其确定的行为(这简化了测试)。

如果出于某种原因您绝对只能使用 iptables,那么您有以下三个常规选项:

  1. limit单独使用火柴。这将允许您限制每单位时间的数据包数量。通过对链路的 MTU 进行一些简单的数学计算,您可以轻松得出所请求带宽的上限。例如,要在 MTU 为 1500(以太网标准)的链路上获得每分钟 400 KB 的速度,您需要考虑每秒 4 个数据包的限制,或每分钟 267 个数据包的限制(两者都不准确,但它们都是) 1%以内)。但是,您必须添加一条规则每个客户端 IP,因为与规则匹配的所有内容都会共享限制。
  2. 在稍微复杂的设置中,您可以使用hashlimit匹配来代替,这将允许更好的处理,但受到与上面相同的每个客户端规则的限制。
  3. 如果你绝对想要反应速率限制(这是一个非常糟糕的主意,在某种程度上我在这里绝对不能强调足够,它将在很多层面上打破用户的期望,并且本身很难调试,并且使调试其他问题变得更加困难更困难),然后看看rateest比赛和目标。目标收集数据,然后您可以将其与比赛进行匹配。反过来,它可以使用 LOG 目标来触发用户空间帮助程序的操作,该程序可以阻止 IP。

相关内容