openresty反代到雷池waf后waf无法获取真实ip怎么办都是127.0.0.1(雷池waf个人版不支持,弃用)

71 次阅读

本文最后更新于 2026年5月18日。

这是反向代理中非常经典的“套娃”问题。因为雷池(WAF)接收到的是来自 OpenResty 的连接,所以它默认看到的 Remote_Addr 就是 OpenResty 所在的服务器 IP(即 127.0.0.1)。

要解决这个问题,你需要完成 “发送方传递”“接收方解析” 两个步骤:


第一步:在 OpenResty 中传递真实 IP

你需要修改 OpenResty 的 location 块,在转发给雷池时,手动将客户端的真实 IP 塞进 HTTP 头部。

Nginx

location / {
    proxy_pass http://127.0.0.1:8000; # 假设雷池监听 8000

    # 1. 传递真实 IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # 2. 传递协议(如果是 HTTPS)
    proxy_set_header X-Forwarded-Proto $scheme;
}

第二步:在雷池中配置“获取真实 IP”

仅仅传过去是不够的,你得告诉雷池:“不要看连接地址,去看看 header 里的 X-Forwarded-For”。

  1. 进入雷池管理后台

  2. 找到对应的 “防护站点”,点击 “编辑”

  3. 寻找 “获取真实 IP”“来源 IP 解析” 的选项(通常在高级设置中)。

  4. 选择从 X-Forwarded-For 头部获取。

    • 进阶提示: 如果雷池支持设置“可信代理 IP”,请将 127.0.0.1 设为可信代理,这样雷池会自动忽略这一层,提取出最原始的客户端 IP。

第三步:验证效果

配置完成后,你可以通过以下方式验证:

  1. 查看雷池防护日志: 随意访问一个页面,看雷池拦截记录或访问记录里的“来源 IP”是否已经变成了你的公网 IP。

  2. 雷池控制台检查:

    雷池底层使用的是 Tengine(Nginx 分支),你可以进入 safeline-tengine 容器查看实时访问日志:

    Bash

    docker exec -it safeline-tengine tail -f /var/log/nginx/access.log
    

    观察日志中记录的第一个字段是否为真实 IP。


为什么这一步对你很重要?

作为开发者,你应该清楚,如果雷池拿到的全是 127.0.0.1,会导致以下严重后果:

  • 频率限制失效: 雷池的 CC 防护功能会把所有用户当成同一个人。一旦触发封禁,雷池会直接把 127.0.0.1 封掉,导致全站所有用户都无法访问

  • 安全审计无效: 你无法通过日志追踪攻击者的真实来源。

特别提醒:

如果你之后在 OpenResty 前面还套了 Cloudflare 或是其他 CDN,那么 OpenResty 也要配置 set_real_ip_from 模块,否则 OpenResty 传给雷池的就会是 CDN 的节点 IP。