如何通过AWS应用负载均衡器转发真实客户端IP并解决拦截失效问题?
解决ALB后端mod_evasive封禁真实IP无效的问题
核心调整:让mod_evasive基于X-Forwarded-For检测请求
mod_evasive默认以请求的源IP(也就是ALB的IP)作为统计和封禁依据,这就是你封禁客户端真实IP后请求仍能到达EC2的原因。你需要修改配置,让它优先读取X-Forwarded-For头中的真实客户端IP:
- 找到mod_evasive的配置文件(通常为
/etc/httpd/conf.d/mod_evasive.conf或/etc/apache2/mods-available/evasive.conf) - 添加或修改以下关键配置:
DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 10 # 启用X-Forwarded-For作为客户端IP来源 DOSUseXForwardedFor On - 重启Apache服务:
systemctl restart httpd(CentOS/RHEL)或systemctl restart apache2(Ubuntu/Debian)
这个配置会让mod_evasive以X-Forwarded-For头的第一个IP作为客户端真实IP,以此统计请求频率并执行封禁。
补充方案:在ALB层用AWS WAF前置拦截
如果mod_evasive的调整仍达不到预期效果,建议在ALB前端配置AWS WAF:
- 基于
X-Forwarded-For创建IP匹配规则,直接拦截被mod_evasive封禁的IP - 设置速率限制规则,提前在ALB层过滤高频请求,减轻EC2的防护压力
- 可通过自动化脚本将mod_evasive的封禁列表同步到WAF的IP集,实现联动拦截
备选方案:用fail2ban配合日志补位防护
如果mod_evasive的DOSUseXForwardedFor配置因版本等问题无法生效,可借助fail2ban实现:
- 修改Apache日志格式,添加
%{X-Forwarded-For}i确保日志记录真实客户端IP - 配置fail2ban过滤规则,从日志中提取真实IP,通过Apache的
deny规则或mod_security实现拦截(注意:不能封禁ALB IP,需针对真实IP做应用层拦截)
关键注意事项
- AWS ALB默认会自动添加
X-Forwarded-For头,无需额外配置,但要防止头伪造:在Apache中配置仅信任ALB的私有IP段,避免恶意客户端篡改该头# 示例:信任VPC内ALB的私有IP段,根据你的VPC配置调整 SetEnvIf X-Forwarded-For "^(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.)" trusted_proxy RequestHeader set X-Forwarded-For "%{X-Forwarded-For}i" env=trusted_proxy
内容的提问来源于stack exchange,提问作者Rehan CH
相关产品推荐
相关产品推荐

