Slowloris是一种针对Apache等线程或进程模型Web服务器的应用层拒绝服务攻击方式。与发动海量流量的洪水攻击不同,Slowloris仅使用极少的带宽,通过极慢的速度向服务器发送HTTP请求,并持续保持连接不关闭,从而耗尽服务器可用的连接槽或工作进程。理解其原理是构建防御体系的第一步。

慢速攻击的底层原理与Apache的脆弱点
Apache在默认使用prefork或worker多进程/多线程模型时,每一个客户端连接都会占用一个独立的子进程或线程。Slowloris攻击工具在建立TCP连接后,以极低频率(例如每隔很久才发送几个字节)发送不完整的HTTP请求头,使Apache认为请求尚未发送完毕,于是为该连接保留进程资源并持续等待。由于Apache默认对请求完成时间没有严格限制,这些半开连接可以维持数小时。
当此类连接数量超过Apache配置的并发上限(如MaxClients或MaxRequestWorkers)时,服务器便无法接受新的正常连接,形成拒绝服务。因为这种流量在单个连接上看似正常的TCP和HTTP交互,传统基于流量阈值的网络防火墙很难将其与真实用户区分开。只有从应用层协议完整性和时间维度进行约束,才能准确识别并切断恶意连接。
除了经典的Slowloris头部慢发,还存在慢速POST正文发送、慢速读取响应等变体。它们共同特征是“以时间换资源”,用极少带宽拖死服务端连接池。因此防御设计必须围绕超时控制、并发隔离和前置过滤三个方向展开,而不是简单扩容带宽。
利用Apache内置模块实施超时与并发限制
Apache自带mod_reqtimeout模块,专门用于限制请求头与请求正文的接收时间。通过设定最小数据到达速率和整体超时,可以强制断开那些故意放慢速度的连接。在配置文件中加载该模块后,可使用RequestReadTimeout指令定义规则,例如要求请求头在20秒内至少按每秒100字节的速度到达,否则断开。
示例配置如下,展示了如何在Apache的虚拟主机或全局配置中启用请求超时防护:
# 启用mod_reqtimeout后,在配置中加入 <IfModule mod_reqtimeout.c> RequestReadTimeout header=20-40,minrate=100 RequestReadTimeout body=30,minrate=200 </IfModule>
上述规则中,header=20-40表示请求头最迟40秒收完,若前20秒速率低于100字节每秒则断开;body则限制正文接收。这种细粒度时间约束让Slowloris难以维持长期占用。另外,使用mod_evasive这类第三方模块也能基于单IP连接数和请求频率进行临时封禁,作为补充手段。
除了超时,还应合理设置KeepAliveTimeout与MaxKeepAliveRequests,避免长连接被滥用。将KeepAlive关闭或设为较短时间(如5秒),可减少空闲连接停留。同时注意调整MaxRequestWorkers,使其与系统资源匹配,并结合mod_status页面监控当前连接状态,发现大量处于“读请求”状态的连接即可判定遭受慢速攻击。
架构层防御:反向代理与负载均衡的缓冲作用
单纯依赖Apache自身限制仍可能在大并发慢速攻击下性能受损,更稳健的方案是在Apache前增加反向代理层(如Nginx、HAProxy)。这些代理默认采用异步事件模型,能以极低资源维持大量连接,并将完整请求转发给后端Apache,从而屏蔽慢速特性。即使攻击者慢发,代理层也可先收完请求再一次性交给Apache处理。
以Nginx作为前端为例,其client_body_timeout和client_header_timeout能快速丢弃慢速连接,且单进程可支撑数万并发。配置片段如下:
server {
listen 80;
client_header_timeout 10s;
client_body_timeout 10s;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
}
}
在该结构中,Nginx承担了连接缓冲与超时清理职责,后端Apache仅处理已完整的请求,极大降低了被Slowloris拖垮的风险。若配合云厂商的WAF或DDoS防护产品,还能在边缘节点过滤异常低密度流量。从系统架构看,将“慢连接”消化在轻量代理层,是相比调优Apache更根本的解决思路。
企业环境中还可借助iptables或专业硬件防火墙做单IP并发数限制,例如限制每个源IP最多80个连接,迫使攻击者使用更多IP从而增加成本。多种手段叠加,才能构建面对Slowloris这类低速率攻击的有效防线。