Apache防御慢速DoS攻击须启用并激进调优mod_reqtimeout:header=10s内收完、body=15s内≥1000B/s;phpMyAdmin路径需单独配置LimitRequestBody(登录页1MB、导入页32MB);关闭KeepAlive或设KeepAliveTimeout=2;mod_evasive对慢速攻击无效且易误杀。

Apache 的 mod_reqtimeout 必须启用并调优
慢速 DoS(如 Slowloris、R-U-Dead-Yet)不靠流量洪泛,而是用极低速率发送 HTTP 头或 body,长期占住 Apache 的 worker 连接,耗尽并发数。默认 Apache 对请求头/体的接收超时宽松(甚至无限制),这正是攻击入口。
启用 mod_reqtimeout 是基础动作,但仅启用不够——它的默认值(如 RequestReadTimeout header=20-40,MinRate=500)在 phpMyAdmin 场景下仍偏宽松:
-
header=20-40允许头部分 40 秒才发完,攻击者可每 39 秒发一个字节维持连接 -
MinRate=500只要求每秒至少 500 字节,而 phpMyAdmin 登录 POST 通常几 KB,慢速发完全合法 - phpMyAdmin 的登录页、SQL 执行页是高频慢速攻击目标,需更激进限制
建议配置(写入 /etc/apache2/mods-enabled/reqtimeout.conf 或虚拟主机内):
RequestReadTimeout header=10,MinRate=500 RequestReadTimeout body=15,MinRate=1000
含义:头必须 10 秒内收完;body 在 15 秒内必须以 ≥1000B/s 持续接收。低于此速率直接断连。
立即学习“PHP免费学习笔记(深入)”;
phpMyAdmin 路径需单独加 LimitRequestBody
攻击者常向 /phpmyadmin/index.php 或 /phpmyadmin/import.php 发送超大、分片缓慢的 POST body(如伪造的 SQL 导入文件),绕过全局限制。Apache 默认不限制单请求 body 大小,LimitRequestBody 能堵住这个口。
不要只在全局 httpd.conf 设一个值——phpMyAdmin 的合理上传上限远低于普通 PHP 应用(比如导出 SQL 最大 64MB,但导入不应允许 1GB 垃圾数据):
- 对登录页:
LimitRequestBody 1048576(1MB,够传用户名密码+token) - 对导入页:
LimitRequestBody 33554432(32MB,比默认 64MB 更严,防恶意分片) - 对其他 POST 接口(如
tbl_replace.php):LimitRequestBody 4194304(4MB)
写法示例(放在 <Directory /usr/share/phpmyadmin> 块内):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<Location "/phpmyadmin/index.php">
LimitRequestBody 1048576
</Location>
<Location "/phpmyadmin/import.php">
LimitRequestBody 33554432
</Location>
禁用 KeepAlive 或大幅缩短 KeepAliveTimeout
Slowloris 类攻击依赖长连接复用。Apache 默认开启 KeepAlive On 且 KeepAliveTimeout 5,意味着一个 TCP 连接可被反复用于多个请求,攻击者只需维持一个连接就能持续消耗资源。
phpMyAdmin 是状态化管理工具,用户操作有明确起止(登录→查表→导出→退出),极少需要长连接。直接关闭更安全:
- 全局关闭:
KeepAlive Off(最简单有效) - 若必须开(如共用 Apache 托管其他应用),则限定:
KeepAliveTimeout 2+MaxKeepAliveRequests 10 - 切勿在 phpMyAdmin 目录里用
<Directory>单独开 KeepAlive——它会覆盖全局策略
改完必须 systemctl restart apache2,reload 不生效。
别忽略 mod_evasive 的误报风险
mod_evasive 能拦截 IP 级别的请求洪泛,但它对慢速 DoS 无效——它靠统计“单位时间请求数”,而 Slowloris 每分钟只发几个包,根本触发不了阈值。
更麻烦的是:它容易误杀真实用户。phpMyAdmin 的批量操作(如导出大表、执行多语句)可能在短时间内产生密集请求,被当成攻击封禁 IP。一旦配置了 DOSPageCount 2(默认值),用户点两下“执行”就进黑名单。
如果你坚持要用:
- 务必提高阈值:
DOSPageCount 10、DOSSiteCount 50 - 排除 phpMyAdmin 路径:
DOSSiteExclude "127\.0\.0\.1"(本地开发)或DOSSiteExclude "/phpmyadmin"(生产环境慎用) - 日志级别调高:
DOSEmailNotify admin@example.com,先观察再行动
真正防慢速攻击,mod_reqtimeout 和 LimitRequestBody 是唯二靠谱手段。其他模块要么无效,要么引入新问题。


















