本文最后更新于 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”。
-
进入雷池管理后台。
-
找到对应的 “防护站点”,点击 “编辑”。
-
寻找 “获取真实 IP” 或 “来源 IP 解析” 的选项(通常在高级设置中)。
-
选择从
X-Forwarded-For头部获取。- 进阶提示: 如果雷池支持设置“可信代理 IP”,请将
127.0.0.1设为可信代理,这样雷池会自动忽略这一层,提取出最原始的客户端 IP。
- 进阶提示: 如果雷池支持设置“可信代理 IP”,请将
第三步:验证效果
配置完成后,你可以通过以下方式验证:
-
查看雷池防护日志: 随意访问一个页面,看雷池拦截记录或访问记录里的“来源 IP”是否已经变成了你的公网 IP。
-
雷池控制台检查:
雷池底层使用的是 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。