mod_evasive 对轻量级 cc 攻击有效,但需正确配置与验证:通过日志确认拦截、合理设置双阈值、配合防火墙或反向代理增强防护,面对分布式、混淆或 http/2 攻击则失效。

mod_evasive 不是万能盾,但对轻量级 CC 攻击(单 IP 每秒 10–50 次请求、无复杂绕过手段)确实能快速起效。它靠实时内存哈希表做毫秒级判断,不依赖外部存储,开箱即用,适合中小站点应急防护。
怎么确认 mod_evasive 已正确加载并生效
Apache 启动时不会报错,但模块未启用或配置错位会导致完全静默失效。最直接的验证方式是主动触发再查日志:- 先确保模块已启用:
sudo a2enmod evasive(Ubuntu/Debian)或检查/etc/httpd/conf.d/mod_evasive.conf是否被 Apache 加载(CentOS/RHEL) - 修改配置后必须重启服务:
sudo systemctl restart apache2或sudo systemctl restart httpd - 手动模拟攻击:用
ab -n 100 -c 30 @#@#@#@#@#@#@#@#@#@0发起 30 并发请求 - 立即检查拦截日志:
tail -n 20 /var/log/apache2/mod_evasive.log(Ubuntu)或/var/log/httpd/mod_evasive.log(CentOS),应看到类似[client 127.0.0.1] Blacklisted for exceeding request limits的记录
若日志为空,常见原因有:DOSBlockingPeriod 设为 0、<ifmodule mod_evasive20.c></ifmodule> 块被注释、日志目录权限不对(Apache 用户需有写入权)、或配置文件未被 Include 进主配置。
关键参数怎么调才不误伤又不放水
mod_evasive 的核心是两组“窗口+阈值”组合,不是越严越好:
DOSPageCount和DOSPageInterval控制单页面访问频率
例如设为DOSPageCount 3+DOSPageInterval 1:同一 IP 在 1 秒内访问 /login.php 超过 3 次即封,适合防爆破;但静态资源页(如 /favicon.ico)可能被连带触发,建议配合白名单或单独排除-
DOSSiteCount和DOSSiteInterval控制整站总请求数
推荐从DOSSiteCount 50+DOSSiteInterval 1起步,对应每秒 50 请求。真实用户极少超过此值,但要注意:- 搜索引擎爬虫(Googlebot/Bingbot)常并发抓取,务必加
DOSWhitelist - 前端 SPA 应用可能在首屏加载时发出 10+ 个资源请求(JS/CSS/API),需预留余量
- 若站点含大量 AJAX 轮询,应延长
DOSSiteInterval到 2–5 秒,改用累计计数而非瞬时峰值
- 搜索引擎爬虫(Googlebot/Bingbot)常并发抓取,务必加
DOSBlockingPeriod 建议设为 300–600 秒(5–10 分钟)。太短(如 60 秒)会让攻击者反复试探;太长(如 3600 秒)易误伤临时网络抖动用户。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
为什么封禁后还是能继续访问
这是最常被忽略的点:mod_evasive 默认只返回 403,并不主动操作防火墙或连接层。攻击者只要换个 User-Agent 或稍降频率,就能绕过。
- 它的封禁是“应用层软封”:Apache 收到请求后查哈希表,命中则直接拒绝响应,但 TCP 连接仍可建立
- 若攻击者用短连接(
Connection: close)高频重连,mod_evasive只能靠DOSHashTableSize(默认 3097)撑住内存压力,超出后旧条目被踢出,导致漏判 - 真正有效的补救只有两种:
- 配合
DOSBlockingExec调用系统命令,例如:DOSBlockingExec "iptables -I INPUT -s %s -j DROP"(注意 %s 是占位符,代表被封 IP) - 在反向代理层(如 Nginx)前置限流,用
limit_req做第一道硬闸,mod_evasive作第二道细粒度拦截
- 配合
另外,若 Apache 前置了 CDN 或负载均衡,%s 拿到的是 CDN 回源 IP(如 100.64.x.x),不是真实攻击者 IP —— 此时必须配置 RemoteIPHeader X-Forwarded-For 并启用 mod_remoteip,否则所有封禁都无效。
哪些场景下 mod\_evasive 会彻底失效
它本质是个轻量状态检测器,遇到以下情况基本不起作用:- 攻击流量来自数百个不同 IP(僵尸网络分布式发起),单 IP 均未超限
- 攻击请求夹杂正常 User-Agent、带合法 Cookie、甚至模拟登录态,绕过基础特征识别
- 目标页面本身响应极慢(如 PHP 查询卡顿 3 秒),
mod_evasive只统计“请求到达频次”,不感知后端耗时,资源早已被拖垮 - 启用了 HTTP/2 多路复用,单 TCP 连接内并发多个请求,
mod_evasive仍按请求计数,但连接数远低于阈值
此时必须升级防御栈:加 mod_security 做规则匹配、上云 WAF、或切到基于行为分析的商业防护服务。别指望一个 2000 行 C 代码的模块扛住现代 CC 工具链。










