Apache 的 mod_evasive 模块最初是为缓解 DoS 与 DDoS 攻击设计的,但它的频率统计机制同样适用于阻止 HTTP 暴力破解。暴力破解请求无论密码是否正确,都会在短时间内产生大量访问,尤其是针对登录页、XML-RPC 接口或 API 端点。mod_evasive 运行在 Apache 请求处理链的早期阶段,为每个来源 IP 建立一个独立计数器,记录该 IP 对单个 URL 的访问次数和对全站的总请求数。当单位时间内的请求量超过阈值时,模块会直接返回 403 Forbidden,并可以选择在一段时间内屏蔽该 IP,后端应用不会收到这些恶意请求。相比在应用代码里做登录失败次数限制,mod_evasive 的优势是拦截发生在 Web 服务器层,消耗更少资源,也能同时覆盖多个虚拟主机和静态资源。

不过 mod_evasive 本身并不解析用户名和密码,也没有业务层面的账号锁定能力。它只能根据请求频率进行判断,因此适合作为第一道防线,而不是唯一防线。如果攻击者控制了大量僵尸网络 IP,或者通过代理隐藏真实来源,仍然需要结合验证码、登录失败锁定和 WAF 规则一起使用。下面从安装、参数配置、登录接口策略以及测试联动的角度展开说明。
安装与启用 mod_evasive
Debian 或 Ubuntu 系统通常可以直接通过 apt 安装 mod_evasive。安装完成后使用 a2enmod 启用模块,再重启 Apache 即可。由于模块以动态共享对象的方式存在,不会影响其他 Apache 功能。
sudo apt update sudo apt install libapache2-mod-evasive sudo a2enmod evasive sudo systemctl restart apache2
RHEL、CentOS 或 Rocky Linux 的默认源不一定包含该模块,可以通过 EPEL 安装,或者使用 Apache 扩展工具 apxs 进行源码编译。源码编译前需要确认系统已经安装 httpd-devel 和 gcc 等编译工具,否则 apxs 无法生成模块文件。
wget https://github.com/jzdziarski/mod_evasive/archive/refs/heads/master.zip unzip master.zip cd mod_evasive-master sudo apxs -i -a -c mod_evasive24.c sudo systemctl restart httpd
安装完成后可以用 apachectl -M | grep evasive 检查模块是否已经加载。如果命令没有输出,说明 Apache 尚未识别模块,需要检查 LoadModule 行是否存在于主配置中。Apache 2.4 环境下通常会出现 evasive24_module 或 evasive20_module,具体取决于编译方式。确认模块加载成功后,才能在配置文件中使用相关指令。
核心配置参数与频率策略
mod_evasive 的配置通常放在 /etc/apache2/mods-available/evasive.conf 或者 httpd.conf 的 <IfModule> 容器中。每个参数控制不同的判断维度,需要根据站点真实访问量合理设置。常用的参数包括哈希表大小、页面计数、全站计数、封锁时长、白名单和通知地址等。
DOSHashTableSize:哈希表大小。数值越大,模块可追踪的 IP 数量越多,但会占用更多内存。中小型站点一般设置为 3097 或 4096。DOSPageCount:同一 IP 在指定时间窗口内访问相同 URI 的最大次数。DOSSiteCount:同一 IP 在指定时间窗口内访问全站所有资源的总请求数上限。DOSPageInterval:页面访问次数的统计周期,单位为秒。DOSSiteInterval:全站请求次数的统计周期,单位为秒。DOSBlockingPeriod:触发拦截后临时封锁该 IP 的秒数。DOSEmailNotify:拦截发生时发送邮件通知的地址。DOSLogDir:存放模块日志和临时封锁文件的目录,Apache 运行用户需要具备写权限。DOSWhiteList:白名单地址,支持单个 IP 和通配符。
下面是一段适合中等规模站点的配置示例。它限制同一 IP 在 10 秒内访问同一 URL 最多 5 次,或者 1 秒内全站请求最多 100 次,触发后封锁 60 秒。
<IfModule mod_evasive24.c>
DOSHashTableSize 4096
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 10
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSEmailNotify admin@ipipp.com
DOSLogDir /var/log/mod_evasive
DOSWhiteList 127.0.0.1
DOSWhiteList 192.168.10.*
</IfModule>
配置完成后需要执行 apachectl configtest 检查语法,确认无误后再重载或重启 Apache。如果站点首页会一次加载大量 CSS、JavaScript 和图片,全站请求阈值不宜设置过低,否则正常浏览器打开页面时也可能被判定为异常流量。建议先观察一段时间的 access log,统计普通用户的最大请求频率,再根据峰值的 1.5 到 2 倍设置阈值。
针对暴力破解的细粒度配置
全局配置适合拦截大范围扫描,但登录接口通常需要更严格的限制。Apache 允许在 Location 或 Directory 上下文中覆盖 mod_evasive 的参数,只对特定路径使用更小的计数阈值。比如 WordPress 登录页、后台入口或自定义的 /login.php,都可以单独收紧限制。
<Location /login.php>
DOSPageCount 3
DOSPageInterval 10
</Location>
<Location /wp-login.php>
DOSPageCount 2
DOSPageInterval 5
</Location>
这样设置后,正常用户短时间内输错一两次密码不会立即被封锁,但自动化脚本连续尝试时很快就收到 403。对于 API 登录端点,例如 /api/auth/,也可以采用类似策略。需要注意的是,部分前端应用会通过 AJAX 多次访问同一个接口,设置过低可能影响正常业务,这时可以适当放宽页面阈值,或者只限制 POST 请求。Apache 的 Location 容器目前不能直接按请求方法区分,但可以结合 Limit 或后端规则进一步细化。
如果 Apache 运行在 Nginx 等反向代理后面,默认情况下 mod_evasive 看到的客户端 IP 永远是代理服务器的地址,例如 127.0.0.1。这样所有请求都会被算在同一个来源上,真实攻击者反而不会被单独拦截。解决方案是启用 mod_remoteip,让 Apache 从 X-Forwarded-For 头中还原真实 IP。
RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1
启用 mod_remoteip 后,必须确保只信任真正的前置代理地址。如果 X-Forwarded-For 可以被外部伪造,攻击者就能通过修改请求头绕过封禁。配置白名单也很重要,办公网出口、内部监控节点和某些搜索引擎爬虫的请求频率可能明显高于普通用户,应使用 DOSWhiteList 提前放行。
测试、误伤控制与 fail2ban 联动
部署完成后必须验证拦截是否真实生效。可以使用 curl 循环模拟高频访问,但建议只对测试路径进行,不要直接对生产登录入口做破坏性压测。下面的命令会连续请求 /login.php,并输出每个请求的 HTTP 状态码。
for i in $(seq 1 20); do
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/login.php
sleep 0.2
done
正常情况下,前几次请求可能返回 200 或 302,一旦触发阈值,后续输出会变成 403。也可以使用 ab 进行简单压测,例如 ab -n 20 -c 5 http://127.0.0.1/login.php,观察失败响应数量。验证后需要关注误伤情况。如果大量用户通过校园网、公司 NAT 或运营商共享出口访问,一个出口 IP 后面可能同时存在几十个用户,阈值设置过低会导致集体无法访问。通过 DOSLogDir 中的日志可以分析哪些 IP 被封锁,再结合业务特征调整计数周期和封锁时长。一般登录页面将 DOSPageCount 设为 5 到 10 次、DOSBlockingPeriod 设为 30 到 120 秒比较合理。
mod_evasive 只提供临时 403,攻击者更换代理 IP 后可以继续尝试。如果希望实现更长周期的封禁,可以配合 fail2ban 扫描 Apache 日志,在出现大量 403 后调用防火墙封锁来源 IP。也可以使用 DOSSystemCommand 在 mod_evasive 触发时执行外部脚本。
DOSSystemCommand "sudo /usr/local/bin/ban_ip.sh %s"
外部脚本可以读取传入的 IP 参数并写入 iptables。使用这种方式时必须注意安全,Apache 运行用户对脚本应只有执行权限,不能随意修改脚本内容。邮件通知同样要控制频率,否则遇到大流量攻击时可能刷爆邮箱。mod_evasive 明显降低了暴力破解到达后端应用的概率,但它不能替代账号锁定、验证码和 WAF 规则。合理配置参数、解决代理透传和误伤问题后,它对普通站点的性能影响通常可以忽略不计。
Apache mod_evasive暴力破解防暴力破解修改时间:2026-09-23 15:00:51