mod_evasive配置后无效主因是模块未加载或参数设置不当;需先用apachectl -M确认加载,再合理设置DOSPageCount(5–15)、DOSSiteCount等阈值,并注意其内存级封禁、无跨进程同步等局限性。

mod_evasive 配置后为什么请求没被拦截
直接启用 mod_evasive 但没效果,大概率是模块没真正加载或配置未生效。先确认是否已启用:
apachectl -M | grep evasive如果无输出,需在 Apache 配置中显式加载:
LoadModule evasive20_module modules/mod_evasive24.so(路径依实际编译位置而定,常见于
/usr/lib64/httpd/modules/ 或 /usr/lib/apache2/modules/)。Debian/Ubuntu 系统还可能需要执行 a2enmod evasive 并重启服务。
关键参数怎么设才防得住真实攻击又不误杀
mod_evasive 的核心逻辑是“单位时间+同一 IP+同一 URI”触发阈值,不是全局 QPS 限制。典型易错点:
-
DOSPageCount默认 2,指同一页面 1 秒内访问次数 —— 设太低会误杀正常刷新、JS 多请求场景;建议生产环境从 5–15 起步,配合DOSPageInterval(默认 1 秒)调整 -
DOSSiteCount控制全站总请求数(如设为 50),适合防扫描器遍历,但对单页高频请求无效 -
DOSSiteInterval必须与DOSSiteCount匹配使用,例如设为 2 秒,则 2 秒内超限即封;不要只改一个 -
DOSEmailNotify和DOSLogDir建议开启,便于定位误封 IP:日志默认写入/var/log/apache2/mod_evasive/,目录需 Apache 进程可写
被封 IP 怎么自动解封和手动干预
封禁是内存级临时行为,默认 10 秒后自动释放(由 DOSBlockingPeriod 控制),不写磁盘、不持久化。这意味着:
- 重启 Apache 会清空所有当前黑名单
- 无法通过修改配置文件“预置黑名单”,它不读取外部 IP 列表
- 想手动解封某 IP?删掉对应临时文件即可:
rm /var/log/apache2/mod_evasive/ip.*(文件名含被封 IP) - 若需长期封禁,必须配合
iptables或fail2ban:用DOSEmailNotify触发脚本,或轮询DOSLogDir解析日志入库
为什么高并发下 mod_evasive 反而失效或崩溃
mod_evasive 使用 Apache 进程内哈希表记录状态,无跨进程同步机制。在 prefork MPM 下各子进程独立计数,攻击者只要轮询不同 worker 就能绕过;在 event 或 worker MPM 下因线程共享内存更不稳定,甚至引发段错误。
真正压测时容易暴露的问题:
- 未设置
DOSSyncInterval(默认 0,即不同步),多进程模式下几乎形同虚设 - 内存泄漏风险:长时间运行后哈希表膨胀,尤其
DOSPageCount设得小、DOSBlockingPeriod设得长时更明显 - 替代方案更可靠:Nginx +
limit_req(支持共享内存字典)、或前置 Cloudflare Rate Limiting、再或者用fail2ban解析 access_log 做异步封禁
mod_evasive 是轻量应急工具,不是 WAF。它不解析 User-Agent、不识别 bot 特征、不支持正则匹配 URL,单纯靠计数。真要防 CC 攻击,得接受它只能拦住最粗糙的扫荡式请求——更细粒度的策略必须换层做。

















