mod_reqtimeout专防慢速HTTP头部攻击,如客户端分多次、间隔数秒发送请求头但始终不发双\r\n结束符;它通过header=参数限制头接收时限与速率,不防慢读、慢传体或空闲连接。

mod_reqtimeout 能防哪种慢速头部攻击
它只对 Slow headers 类攻击有效:比如客户端发完 GET / HTTP/1.1\r\n 后,每隔 5–10 秒才补一个 User-Agent: a 字符,中间用 \r\n 分隔但始终不发双 \r\n 结束头。这类行为会让 Apache 一直卡在“等请求头收全”状态,mod_reqtimeout 就是专门掐这个环节的。
它不防 Slow read(慢读响应)或 Slow body(慢传请求体)——前者靠 Timeout 或反向代理层控制,后者得单独配 body= 参数;也不防连接复用后的空闲等待,那是 KeepAliveTimeout 的事。
RequestReadTimeout header= 参数怎么设才真正起效
header=20-40,minrate=500 不是随便写的数字组合,每个值都对应明确行为:
-
20是初始超时:从 TCP 连接建立开始,必须在 20 秒内收到首个完整请求行(如GET / HTTP/1.1)和至少一个头字段;超时即断连 -
40是总窗口上限:从连接建立起,最多容忍 40 秒未收完全部请求头;哪怕中间有停顿,只要总时长超 40 秒,直接丢弃 -
minrate=500是速率兜底:任意连续 2 秒内,至少要收到 1000 字节(500 字节/秒 × 2 秒);设成minrate=1几乎无效,因为每秒 1 字节太宽松
常见错误是把配置写进 <Directory> 块里——RequestReadTimeout 是服务器级指令,只允许出现在主配置、<VirtualHost> 或全局 server context 中,否则静默失效。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
为什么配了还是被慢速头部打穿
多数“没效果”不是模块没加载,而是调试路径走偏了:
- 用
curl -v http://x/测试?不行。curl 默认一次性发完所有头,根本触发不了慢速逻辑。得用nc手动发,或工具如slowhttptest -c 1 -t GET -u http://x/ -i 10 -r 1(每秒发 1 字节) - 日志里看不到拒绝记录?检查
ErrorLog级别是否 ≥info,且确认看的是error_log文件,不是access_log;拒绝时典型日志是client denied by server configuration或request read timeout - HTTPS 站点响应更慢?初始超时建议提到
header=20-40,因为 TLS 握手本身就有延迟,10 秒可能不够
和 Timeout、KeepAliveTimeout 是什么关系
三者完全不重叠,也别指望用一个代替另一个:
-
Timeout是全局兜底值,只在没启mod_reqtimeout时才生效;一旦启用,它的优先级最低,仅覆盖那些没被RequestReadTimeout显式约束的边缘场景 -
KeepAliveTimeout控制的是“请求已处理完、连接还开着等复用”的空闲时间,和“请求头还没收完”是两码事;攻击者常故意让连接卡在头阶段,根本不会走到 KeepAlive 阶段 - 真正要防住 Slow headers,
RequestReadTimeout header=...是唯一精准手段;Timeout设太大反而帮倒忙——给慢速连接更多存活时间
最易被忽略的一点:mod_reqtimeout 不会自动加载,即使 Apache 2.4.10+ 自带,也得确认 httpd.conf 里有这行:LoadModule reqtimeout_module modules/mod_reqtimeout.so;缺了这句,后面所有配置都是废纸。

















