Timeout仅约束请求头接收、请求体接收、响应发送三阶段的I/O阻塞时长,不控制Keep-Alive空闲时间或反向代理通信,现代Apache中已降为mod_reqtimeout的兜底值。

Timeout 指令在 Apache 中的实际作用范围
Timeout 并不控制 HTTP 请求整体生命周期,它只约束三个具体阶段的等待上限:接收请求头、接收请求体(如 POST 数据)、发送响应时的网络 I/O 阻塞。慢速连接攻击(如 Slowloris)正是利用这些阶段的长阻塞来耗尽服务器连接槽位。
- 它对 Keep-Alive 连接中的空闲等待时间无效(那是
KeepAliveTimeout控制的) - 它不影响反向代理后端通信(那是
ProxyTimeout或后端自身配置决定的) - 在启用了
mod_reqtimeout的现代 Apache(2.2.15+)中,Timeout已退居为兜底值,优先级低于更细粒度的请求超时设置
用 mod_reqtimeout 替代或补充 Timeout 防御慢速连接
mod_reqtimeout 是 Apache 官方推荐的慢速连接防护模块,比全局 Timeout 更精准、更安全。它允许分别限制请求头和请求体的接收节奏,而非简单粗暴地等满整个超时。
- 启用模块:
LoadModule reqtimeout_module modules/mod_reqtimeout.so
- 基础防护配置示例:
RequestReadTimeout header=20-40,minrate=500<br>RequestReadTimeout body=20,minrate=500
-
header=20-40,minrate=500表示:首 20 秒内必须收完请求头;若未完成,则后续每秒至少要收到 500 字节,否则中断连接 -
body=20,minrate=500表示:请求体传输必须在 20 秒内完成,且持续速率不低于 500 字节/秒 - 若未启用该模块,仅调大
Timeout(如设为 300)反而会加剧攻击效果——给慢速连接更多“合法”存活时间
Timeout 和 KeepAliveTimeout 的协同关系
Timeout 和 KeepAliveTimeout 控制的是完全不同的连接状态,但攻击者常组合利用二者漏洞。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
KeepAliveTimeout默认通常为 5 秒,它决定一个已关闭请求的连接在复用前能空闲多久 - 如果
Timeout设得过大(比如 300),而KeepAliveTimeout过小,攻击者可在每个连接上发一个极短请求,然后静默等待KeepAliveTimeout到期;连接关闭后立即重连,反复消耗MaxRequestWorkers - 更稳妥的做法是:保持
KeepAliveTimeout较低(2–5 秒),同时禁用KeepAlive(KeepAlive Off)用于面向公网的 API 或登录页等高风险入口,彻底切断连接复用路径
验证配置是否生效及常见失效原因
修改后必须重启 Apache(systemctl restart apache2 或 apachectl graceful),且需确认模块加载顺序与运行时状态。
- 检查模块是否启用:
apache2ctl -M | grep reqtimeout
(Debian/Ubuntu)或httpd -M | grep reqtimeout
(RHEL/CentOS) - 查看当前生效的
Timeout值:apache2ctl -V | grep -i timeout
(注意:这显示编译默认值,非运行时值) - 真实生效值需通过日志或测试确认:用
curl -v --limit-rate 100 --max-time 60 @#@#@#@#@#@#@#@#@#@0模拟低速请求,观察是否被及时断开 - 常见失效原因:
-
mod_reqtimeout未启用或配置被 .htaccess 覆盖 - 使用了第三方 MPM(如 event MPM)但未适配线程模型下的超时行为
- 反向代理(如 Nginx 前置)吞掉了原始连接,Apache 实际看到的是代理的快速连接
-
慢速连接防护的关键不在单个参数调大调小,而在于分层设防:用 mod_reqtimeout 管请求流入节奏,用 KeepAlive Off 切断复用链路,再配合系统级连接队列(net.core.somaxconn)和防火墙限速,才可能真正抬高攻击成本。










