AWS WAF GeoIP规则仍放行封禁国家请求问题排查
AWS WAF地理拦截规则生效但Apache仍有非法IP请求的排查方向
问题描述
我配置了一条AWS WAF规则,仅允许来自美国(US)和加拿大(CA)的请求。规则采用NOT语句逻辑:若请求源IP不在指定国家代码列表中,则执行拦截操作。这条优先级为0的规则本应最先被评估,CloudWatch日志及请求样本显示规则确实拦截了非美加地区的请求,但Apache日志中仍存在来自其他国家IP的非法请求。规则JSON配置如下:
{ "Name": "GeoRule1", "Priority": 0, "Statement": { "NotStatement": { "Statement": { "GeoMatchStatement": { "CountryCodes": [ "CA", "US" ] } } } }, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "GeoRule1" } }
排查方向
一、规则与Web ACL配置验证
- 确认规则状态与默认动作:检查这条规则在Web ACL中是否处于启用状态;同时确认Web ACL的默认动作为「允许」——你的规则优先级最高,会先拦截非目标地区请求,剩余请求走默认允许逻辑,该配置逻辑合理,但需确保规则未被误禁用。
- 排查冲突规则:确认Web ACL中无其他同优先级规则(WAF不允许同优先级规则共存),且低优先级规则中没有
Allow语句意外覆盖拦截逻辑(虽优先级0会先执行,但仍需排除此类可能)。
二、WAF关联与流量路径问题
- 确认WAF绑定到正确入口:
- 若使用ALB:检查WAF是否关联到接收流量的目标负载均衡器,而非其他闲置资源;
- 若使用CloudFront:确认分发配置中已绑定目标Web ACL,且流量确实走CloudFront入口;
- 核心排查点:是否存在请求绕过WAF直接访问EC2的情况——比如EC2有公网IP,且安全组允许公网直接访问,这类请求不会经过WAF,自然会出现在Apache日志中。解决方式是修改EC2安全组,仅允许来自负载均衡/CloudFront的流量,禁止公网直接访问。
- XFF头配置验证:若流量经过代理/ALB,WAF默认依赖
X-Forwarded-For头获取真实客户端IP。若WAF的IP匹配设置错误(比如用了「Source IP」而非「X-Forwarded-For」),会导致WAF识别的是负载均衡的IP(大概率属于US/CA),从而放过真实客户端IP来自其他国家的请求。
操作步骤:进入Web ACL的「Settings」,确认「IP address to use for match conditions」设置为「X-Forwarded-For」(对应ALB/CloudFront场景)。
三、日志准确性验证
- 修正Apache日志的IP记录:若EC2在ALB/CloudFront后,Apache默认日志记录的是代理服务器IP,而非真实客户端IP。需修改Apache的日志格式,让它记录
X-Forwarded-For头中的真实IP,避免误判。示例配置:
重启Apache后,日志中第一个IP即为客户端真实IP,再核对该IP的归属地是否真的属于非美加地区。LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - 检查WAF日志采样率:
SampledRequestsEnabled开启后默认采样率为1%,可能有部分拦截请求未被采样到,导致CloudWatch日志不完整,但这不是核心原因,重点仍在流量路径和IP识别问题。
四、缓存与其他绕过场景
- CloudFront缓存命中绕过:若使用CloudFront,缓存命中的请求不会经过WAF规则评估,直接返回缓存内容。如果非法请求命中了缓存,会直接到达源站EC2并被Apache记录。解决方式是调整CloudFront缓存策略,或者配置WAF在缓存前评估请求(即设置「Cache behavior」的「WAF filtering」为「Before caching」)。
内容的提问来源于stack exchange,提问作者barneyAgumble
相关产品推荐
相关产品推荐

