apache不记录慢连接,slowloris攻击在access.log中几乎无日志,需结合ss命令查established连接数飙升、recv-q非零,以及error.log中reqtimeout模块的header/body超时日志来综合判定。

Apache 本身不直接记录“慢连接”行为,但访问日志(access.log)配合错误日志(error.log)和系统连接状态,能有效识别 Slowloris 类攻击的典型痕迹——不是看单次响应多慢,而是看大量连接长期处于 ESTABLISHED 状态却几乎不发数据。
从 access.log 中抓取可疑连接模式
Slowloris 攻击者会建立大量 TCP 连接,并只发送部分 HTTP 请求头(如只发 GET / HTTP/1.1 就停住),后续长时间不补全、不发 body、不关闭连接。这类请求在 access.log 中往往根本不会出现——因为 Apache 还没收到完整请求头,就卡在读取阶段,无法生成访问日志条目。
所以真正有用的线索是:access.log 中请求量没明显上涨,但服务器连接数飙升、响应变慢甚至拒服。此时要转向系统层验证:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
ss -s或netstat -ant | grep :80 | wc -l查看当前 ESTABLISHED 连接数。正常业务下一般几十到几百;若持续稳定在 MaxRequestWorkers 附近(如 150+),且多数连接已存在数十秒以上,高度可疑 - 执行
ss -tn state established '( dport = :80 or dport = :443 )' | head -20,观察 Recv-Q 是否普遍非零(如 1–20 字节),说明客户端只发了极少量数据后就挂起 - 对比
tail -f /var/log/apache2/access.log和watch -n1 'ss -s | grep established':若连接数快速上涨而 access.log 几乎无新增,基本可判定是慢速连接耗尽 worker
结合 error.log 确认超时机制是否生效
真正能佐证 Slowloris 被拦截的,是 error.log 中出现的模块级超时记录:
- 启用
mod_reqtimeout后,应看到类似[reqtimeout:info] [pid XXXX] AH01397: Request header read timeout或AH01398: Request body read timeout的日志 - 若完全没这类记录,说明超时配置未加载(检查
LoadModule reqtimeout_module)、未启用(MPM 不是 event/workers)、或被更高优先级配置覆盖 - 注意:原生
Timeout指令(默认 300 秒)不会触发日志,它只对早期 Apache 版本的读头阶段起作用,且不写 error.log,不能作为判断依据
用 curl 模拟攻击验证防护效果
不要依赖猜测,动手实测最可靠:
- 模拟慢速头:
curl -v --limit-rate 10 --max-time 60 http://your-site/(限速 10B/s,超时 60 秒)。若 10 秒内返回Connection reset by peer或 500,说明RequestReadTimeout header=10生效 - 模拟慢速 body:
yes "A" | head -c 1000000 | curl -v -X POST --data-binary @- --limit-rate 5 http://your-site/upload.php,观察是否在 10 秒内断连(对应body=10,minrate=500) - 成功拦截的表现:连接很快关闭,error.log 出现 reqtimeout 日志,
ss -s中 ESTAB 数无持续堆积
排除误判:区分真实慢请求与攻击
某些合法场景也会产生长连接,需交叉判断避免误杀:
- 大文件上传:客户端速率低但持续发送,Recv-Q 会缓慢增长而非长期卡在几字节;error.log 应见
body超时而非header超时 - 长轮询(Long Polling):客户端发完完整请求后等待响应,连接空闲但已通过 header 验证;keepalive_timeout 和 send_timeout 更相关,不应触发 reqtimeout
- 移动网络弱信号:偶发丢包导致延迟,但通常呈间歇性,且同一 IP 不会同时维持数十个连接
- 确认攻击源:用
ss -tn state established '( dport = :80 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head查看连接最多的 IP,若单 IP 占比超 20% 且无合理 User-Agent,大概率是攻击










