慢速 HTTP 是应用层拒绝服务 (DoS) 攻击,有可能摧毁资源有限的服务器。由于攻击的性质(慢速和低容量),它们很难被检测到,并且可以造成与高容量 DDoS 相同的损害。在这篇文章中,我将分享我对这些攻击的经验介绍正如 WiKi 中所解释的,慢速 HTTP 攻击依赖于这样一个事实,即 HTTP 协议在设计上要求服务器在处理请求之前完全接收请求。如果 HTTP 请求未完成,或者传输速率非常低,服务器会保持其资源忙于等待其余数据。如果服务器占用过多资源,则会造成拒绝服务。 [来源:https://github.com/shekyan/slowhttptest/wiki]
慢速 HTTP 攻击主要分为三种类型。
- 慢头(又名Slowloris)
这种攻击的工作原理是打开与 Web 服务器的大量连接,并通过减慢发送永无止境的标头来使它们保持活动状态。由于请求未完成,服务器不会关闭连接,并且最终会耗尽服务器上的所有资源,从而阻止合法请求。 - 缓慢的身体(又名 RU-Dead-Yet)
RU-Dead-Yet 的工作方式与 Slowloris 类似,但它不会发送永无止境的标头,而是发送永不结束的 POST 正文,从而迫使服务器保持连接打开。当服务器的所有资源都被占用时,无法为合法请求提供服务。 - 慢读
上述攻击通过发送慢速请求来利用 Web 服务器,然而,慢速读取利用是基于非常缓慢地读取来自服务器的响应。它的工作原理是通告一个非常小的客户端接收缓冲区大小,触发来自服务器的大响应,并花费几分钟来读取单个响应。当同时创建多个这样的连接时,它会消耗所有服务器资源并导致 DoS。在这篇文章中,没有比这次攻击的作者本人更好的解释了。Nginx 架构
Nginx 有一个主进程和一些辅助进程(包括工作进程)。主进程管理所有特权操作,而工作进程执行实际工作并处理连接。 Nginx 的架构与 Apache 的架构根本不同。 Apache 为每个新连接生成一个阻塞线程,而 Nginx 基于非阻塞事件驱动架构。
下图总结了流程:这种架构在一定程度上提供了对慢速 HTTP 攻击的先天预防,因为工作进程不会在 IO 上被阻塞。它可以继续为其他请求提供服务。但是,这不是完全证明,还取决于 Nginx 配置选项。
Nginx 提供的一些防止此类攻击的常见配置选项是:
1) limit_req – 限制来自一个 IP 的请求率
2) limit_conn – 限制来自一个 IP 的连接数
3) client_body_timeout – 关闭与慢体的连接
4) client_header_timeout – 关闭带有慢头的连接
5)send_timeout——如果客户端在这段时间内没有收到任何消息,则连接关闭。
结论
如果处理不当,慢速 HTTP 攻击可能与容量 DDoS 攻击一样严重。此外,Nginx 配置中有很多活动部分,我们需要在进行随机复制/粘贴更改之前正确理解它们。
我还通过拒绝非常低的客户端接收缓冲区窗口大小来解决此问题,但我尚未探索该路径。
参考
1) 慢速HTTP测试
2)你准备好慢读了吗
3)Nginx内部
4) Nginx 参考
5) Nginx DDOS 缓解