apache需借助mod_evasive实现ip级速率限制,推荐安装后配置dospagecount、dossitecount等参数,并配合mod_remoteip获取真实ip,再通过fail2ban联动强化系统级封禁。

Apache本身不直接提供IP级连接速率限制功能,但可通过mod_evasive或结合mod_ratelimit+mod_remoteip(配合反向代理)实现。更推荐且稳定的方式是使用mod_evasive——它专为防CC、暴力请求和IP频次攻击设计,轻量、生效快、配置直观。
安装并启用mod_evasive模块
大多数Linux发行版需手动编译或通过包管理器安装:
- Ubuntu/Debian:
sudo apt install libapache2-mod-evasive,安装后自动启用 - CentOS/RHEL 8+:
sudo dnf install mod_evasive,然后运行sudo systemctl reload httpd - 源码编译(通用):下载
mod_evasive源码,用apxs -cia mod_evasive24.c编译安装
确认已加载:httpd -M | grep evasive 或 apache2ctl -M | grep evasive 应输出evasive24_module (shared)。
关键参数配置(/etc/apache2/mods-enabled/evasive.conf 或 httpd.conf)
在Apache主配置或虚拟主机内添加如下段落(注意路径权限需让Apache可写/var/log/apache2/evasive/):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<ifmodule mod_evasive24.c>
DOSHashTableSize 3097
DOSPageCount 2 # 同一IP 1秒内访问同一页面超2次即触发
DOSSiteCount 50 # 同一IP 1秒内总请求数超50次即触发
DOSPageInterval 1 # 页面计数时间窗口(秒)
DOSSiteInterval 1 # 站点计数时间窗口(秒)
DOSBlockingPeriod 600 # 封禁时长(秒),即10分钟
DOSEmailNotify admin@example.com # 触发时发邮件(需系统配置sendmail)
DOSLogDir "/var/log/apache2/evasive"
</ifmodule>
⚠️ 注意:DOSPageCount和DOSSiteCount是核心阈值,生产环境建议从较宽松值起步(如5/100),再根据日志观察调整;DOSBlockingPeriod不宜过短(低于60秒易被绕过),也不宜过长(影响误封恢复)。
验证与调试技巧
启用后并非立即“隐形生效”,需主动验证+监控日志:
- 查看拦截日志:
tail -f /var/log/apache2/evasive/*,正常会看到类似[Sat May 02 01:08:22.123456 2026] [evasive24:error] [pid 12345] [client 192.168.1.100] Client denied by server configuration - 模拟攻击测试(本地):
for i in {1..60}; do curl -s -o /dev/null http://yoursite.com/; done,应触发封禁 - 解封被误封IP:
rm -f /var/log/apache2/evasive/ip_*(按IP哈希命名),或等待DOSBlockingPeriod自动过期 - 若使用CDN或Nginx反代,务必配置
mod_remoteip,否则mod_evasive只会识别到CDN节点IP,失去意义
补充建议:与fail2ban联动增强防护
mod_evasive只做Apache层临时拦截,如需系统级IP封锁(如iptables),可搭配fail2ban:
- 创建
/etc/fail2ban/filter.d/apache-evasive.conf,匹配evasive日志关键词 - 在
jail.local中启用该filter,设置bantime = 3600、maxretry = 1 - 这样被
mod_evasive记录的IP,将由fail2ban自动加入系统防火墙,防御更彻底
不复杂但容易忽略的是真实客户端IP获取和阈值渐进调优——上线前务必用真实流量压测,避免误伤搜索爬虫或API正常调用。










