按子网对每个客户端的 Apache 带宽进行限制

按子网对每个客户端的 Apache 带宽进行限制

我们的目标是限制每秒请求数和/或 HTTP 客户端的可用带宽,以阻止意外的 DoS 攻击。我们提供免费的科学数据和网络服务,但遗憾的是,有些用户的脚本表现不佳。

我知道有很多 Apache 模块允许您根据客户端 IP 地址进行限制,但问题是,有时我们会看到人们从他们的集群进行分布式抓取(今天这导致了平均负载 > 200 事件!)。

我真正想做的是限制每个 /24 子网,但无需指定哪个提前子网。

理想情况下,我还希望能够将其作为最大上限的比例来实现,因此,如果我们只看到来自一个子网的请求,它们就可以使用所有服务器的资源,但如果两个子网正在竞争,它们就可以各自使用一半。

是否可以通过以下方式实现:

  • 阿帕奇模组
  • 交通管制
  • 代理服务器
  • 还有别的吗?

谢谢!

编辑:还有几件事……如果需要在网络基础设施层面(例如路由器)做任何事情,那不在我们的职责范围内,而且会立即变成一件麻烦事。所以我希望找到一个只需要在服务器层面进行更改的解决方案。另外,如果我花了一些时间来挑选出获胜者,请不要生气,这对我来说是一个新话题,所以我想稍微阅读一下这些建议 :-)

答案1

如果你正在使用 HAProxy 或者可以使用它,请检查是否博客文章帮助</end_shameless_promotion_of_a_fellow_admin_and_company :)>

答案2

要非常小心。仅仅降低网络速度就意味着您将加剧任何 DOS 攻击 - 您需要在连接到达 Web 服务器之前对其进行限制。

考虑一下 - 磁盘是非常速度慢,并且一次只能处理一个请求。决定 Web 服务器性能的最重要因素之一是操作系统可以执行的 I/O 缓存量 - 而这受限于系统上的可用内存量。每当有请求进入时,都会安排一个 Apache 进程(或线程)来处理它。该进程将占用内存和 CPU,直到它需要编写响应并通过互联网将其发送到客户端为止。拒绝将此内存用于 I/O 缓存。一种最小化此影响的方法是使用合适的网络服务器前面的反向代理-例如作为单线程服务器的 squid。

假设您可以避免网络服务器堵塞的问题,那么您可能需要考虑在网络边界运行流量整形器。Linux 现在附带作为标准。

(/me 刚刚在谷歌上搜索“linux tc”并得到了一张身穿比基尼女孩的照片;)

在识别爬虫/真正的 DDOS 方面,答案要棘手得多。当然,据我所知,没有现成的解决方案可以可靠地用于 HTTP。然而,应该可以修改检测器失败2ban触发锁定或限制,您可以检测到异常模式。基本包可以将来自特定端点的大量请求解释为此类模式。

相关内容