【网络实战】ELB挂载WAF后获取客户端真实IP:X-Forwarded-For透传的工程化解法
在标准的云上安全防护架构中,流量通常呈现 客户端 -> WAF -> 七层ELB -> ECS后端服务 的链路。经过多层反向代理后,原始TCP连接的Source IP会被网络中间件的内网IP所取代。如果直接读取 socket 的远端IP,风控系统和访问日志将全部失效。
标准的工程解法是:依赖 X-Forwarded-For 请求头进行链路追踪,并在终端网关层重写变量。
1. 开启云产品七层透传
在华为云WAF与ELB控制台中,无需额外配置,标准七层 HTTP/HTTPS 监听器默认会将客户端真实 IP 自动追加到 HTTP Header 的 X-Forwarded-For 字段中。
2. 激活 Nginx http_realip_module 模块
登录后端 ECS 实例,在 Nginx 的全局 http {} 块或具体 server {} 块中,显式声明受信任的云厂商回源网段,并指示 Nginx 从请求头中提取真实 IP:
http {
# 声明华为云ELB/WAF的底层回源VPC网段(视实际组网VPC网段而定)
set_real_ip_from 192.168.0.0/16;
set_real_ip_from 100.125.0.0/16; # 常见云厂商预留网段
# 指定从哪个Header中提取真实IP
real_ip_header X-Forwarded-For;
# 开启递归解析:剔除受信任IP后,提取最右侧的真实外部IP
real_ip_recursive on;
}
3. 重构访问日志格式(Log Format)
完成 RealIP 变量重写后,Nginx 内置的 $remote_addr 变量会被自动替换为客户端真实 IP。无需在日志中直接打印极易被伪造的 $http_x_forwarded_for,直接使用默认变量即可获得纯净数据:
# 定义新的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log main;
执行 nginx -t 检查语法后,使用 nginx -s reload 重载配置即可生效。
总结:
通过网络中间件自动追加 Header 与终端 Nginx RealIP 模块的配合,我们在不改动任何后端微服务代码的前提下,在网关层彻底抹平了复杂云原生网络拓扑带来的 IP 屏蔽问题。这种基础设施层的解析前置,是保障下游风控限流、地理位置画像等依赖来源IP业务准确性的关键。
- 点赞
- 收藏
- 关注作者
评论(0)