mod_reqtimeout是apache内置模块,仅防御慢速http头部攻击,无法防御慢速post的body阶段攻击及连接复用类攻击;它基于时间与速率阈值丢弃非法传输,不校验连接合法性。

mod_reqtimeout 是什么,它能防什么不能防什么
mod_reqtimeout 是 Apache 自带的模块,作用是在请求头(headers)和请求体(body)传输过程中设置超时与速率下限。它**不能阻止恶意连接复用或慢速 POST 攻击中的 body 阶段持续发包**,但对“慢速 HTTP 头部攻击”(如发送一个 GET / 后,每隔 10 秒才补一个 User-Agent: 字符)有明确抑制效果。
关键点在于:它只管“传输过程”,不管“连接是否合法”;不依赖 IP 封禁或规则引擎,纯靠时间+速率阈值做丢弃。
启用并配置 ReqTimeout 指令的最小必要步骤
先确认模块已加载(Apache 2.4.10+ 默认编译进核心,但可能被注释):
LoadModule reqtimeout_module modules/mod_reqtimeout.so
然后在主配置、虚拟主机或目录上下文中添加:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ReqTimeout header=20-40 minrate=500
这行的实际含义是:
- 从客户端发起 TCP 连接开始,必须在 20 秒内完成整个请求头接收;若中途停顿,允许最多再等 40 秒(即总窗口 40 秒),但任意 2 秒内至少要收到 1000 字节(
minrate=500表示每秒 500 字节,2 秒就是 1000) -
header=20-40中的 20 是初始超时,40 是最大容忍总时长;超过 40 秒未收完头,直接断连并记入 error log(含client denied by server configuration类提示) - 不配
body=参数的话,请求体阶段不受限——这点常被忽略,导致误以为“全链路防护”
常见错误现象和调试方法
配完没效果?大概率是以下几种情况:
- 配置写在了
<directory></directory>块里,但ReqTimeout是服务器级指令,**不支持目录上下文**,只能放在httpd.conf、vhost或server config层 - 用了
minrate却没理解单位:它的单位是「字节/秒」,不是 KB/s;设成minrate=1实际要求每秒至少 1 字节——几乎没约束力 - 测试时用
curl -v手动发头,但默认会一次性发完;需用nc或专用工具(如slowhttptest -c 1 -g -o out -i 10 -r 1 -t GET -u http://x/)模拟慢速头部注入 - 日志里看不到拒绝记录?确保
ErrorLog级别不低于info,且注意该模块拒绝连接时写的是error_log,不是access_log
和 mod_evasive、mod_security 的协作边界
mod_reqtimeout 和其他防护模块不是替代关系,而是分层协作:
-
mod_evasive应对高频短连接(如每秒几十个新 IP 请求),靠计数器;而mod_reqtimeout应对单个连接拖很久,靠时间/速率 -
mod_security可拦截畸形头(如超长Cookie)、SQL 注入头字段,但它不处理“合法但极慢”的头部流式发送 - 三者可共存,但注意:如果
mod_reqtimeout已断连,请求根本不会走到mod_security的规则匹配阶段
真正容易被忽略的是:很多运维只配了 header=,却放任 body 阶段无限制。对于上传类接口,建议追加 body=30,500(30 秒内必须开始传 body,之后每秒至少 500 字节),否则攻击者可在头收完后,用极低速发 body 继续耗尽 worker。









