mod_reqtimeout是最轻量有效的慢速HTTP头部攻击防御方式,通过header=10-30,minrate=500等双阶段超时与速率兜底机制,在传输层主动断连异常连接,且必须全局或虚拟主机级配置,不可置于Directory块内。

直接用 mod_reqtimeout 拦住慢速请求头,是最有效、最轻量的防御方式。它不依赖规则匹配或IP封禁,而是从传输节奏上掐断异常连接,让攻击者无法靠“每10秒发一个字母”耗尽你的 worker 进程。
确认模块已启用并放在正确位置
该模块在 Apache 2.4.10+ 中默认编译进核心,但常被注释掉:
- 打开
httpd.conf或主配置文件,确保这行未被注释:LoadModule reqtimeout_module modules/mod_reqtimeout.so -
不能把
RequestReadTimeout写在<Directory>或<Location>块里——它只在服务器级、虚拟主机级或 .htaccess(需允许 Override)中生效 - 推荐配在
<VirtualHost>或全局 server config 区域
精准配置 header 超时参数
针对“只发 GET / 就停住,隔几十秒补一个 User-Agent 字符”的 Slow Headers 攻击,关键不是设一个固定超时,而是用双阶段窗口 + 速率兜底:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RequestReadTimeout header=10-30,minrate=500
含义:客户端必须在 10 秒内开始发请求头;整个头部接收过程最长容忍 30 秒;且任意连续 2 秒内至少要传入 1000 字节(500 字节/秒 × 2 秒) - 若攻击者每 15 秒才发一个换行符(\r\n),远低于速率下限,连接会在几秒内被主动断开,并记录到 error_log
- HTTPS 站点建议上调初始值(如
header=20-40),避免 TLS 握手延迟误判
别漏掉 body 阶段,否则防护不完整
只防 header 不防 body,等于关了前门却大开后窗。攻击者可绕过 header 限制,转而用 Content-Length: 1000000 后逐字节发 body:
- 补上 body 限制:
RequestReadTimeout body=10,minrate=500
表示每 10 秒内必须收到至少 500 字节请求体,否则断连 - 注意:不写
body=参数,该阶段就完全不受控——这是配置失效最常见的原因 - 对上传接口等合法慢传场景,可单独用
<Location "/upload">覆盖更宽松的值,避免误伤
验证是否真正生效
配完不测试 = 白配。常见“没效果”其实只是没测对:
- 别用
curl -v http://x测试——它默认一次性发完全部头部 - 用
slowhttptest模拟真实攻击:slowhttptest -c 1 -g -o out -i 15 -r 1 -t GET -u http://your-site/
(-i 15 表示每 15 秒发一个字符) - 检查
error_log,看到类似[reqtimeout:info] [pid xxx] client denied by server configuration才算成功拦截 - 确保
ErrorLogLevel至少为info,否则拒绝日志不会输出

















