现在需要获取请求到服务器的客户端 IP,一般有这些方式。
- remote_addr:TCP 底层的会话 IP 地址,socket 连接的 IP 地址,不可伪造。但经过 Nginx 代理时会重置为 Nginx 的 IP,因为 Nginx 重新发起了和服务器的 TCP 连接。
- X-Real-IP:Nginx 中可以配置,将上一级的 remote_addr 设置为 X-Real-IP。
- X-Forwarded-For:记录完整的代理链路,可以伪造。
可以看出为了兼容有 Nginx 代理的场景,使用 X-Forwarded-For 方式是做好的。这种方式也需要在 Nginx 中进行配置。
Nginx 配置
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
参考
ip-transparency-direct-server-return-nginx-plus-transparent-proxy