如何使用Apache mod_evasive防止暴力破解攻击?

来源:3D模型作者:小师妹头衔:草根站长
导读:本期聚焦于小师妹创作的《如何使用Apache mod_evasive防止暴力破解攻击?》,敬请观看详情。mod_evasive 在 Apache 请求处理链的前端工作,它不分析登录密码是否正确,而是为每个来源 IP 维护一份请求计数表。一旦某个 IP 在设定时间窗内对同一 URL 或全站的请求数超过阈值,模块立即返回 403 并可将该 IP 临时封锁。这种基于频率的拦截方式对 HTTP 暴力破解、撞库、目录扫描和基础 CC 攻击都有明显效果。部署时需要在 httpd.conf 或虚拟主机中加载模块并配置 DOSHashTableSize、DOSPageCount、DOSSiteCount、DOSPageInterval 等参数。实际环境还须重点解决反向代理后的真实 IP 识别、白名单误伤、日志通知以及和 fail2ban 的联动,否则容易把代理服务器或办公网出口一并封禁。本文将围绕安装、参数调优、登录接口细化配置以及测试验证展开。

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

如何使用Apache mod_evasive防止暴力破解攻击?

不过 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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0923/60942.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。