nginx多层代理获取用户真实IP

获取用户真实IP
一、nginx+容器

这种场景只需要ningx配置

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
二、安全代理+nginx

网站部署了流量代理服务(例如Web应用防火墙、DDoS高防、CDN)后,源站服务器可以通过解析回源请求中的X-Forwarded-For记录,获取客户端的真实IP

以nginx为例,在location / {}中添加以下内容:

set_real_ip_from <ip_range1>;
set_real_ip_from <ip_range2>;
...
set_real_ip_from <ip_rangex>;
real_ip_header X-Forwarded-For;
其中,<ip_range1>、<ip_range2>、<ip_rangex>需要设置为代理服务器(即Web应用防火墙)的回源IP段。

在log_format中添加x-forwarded-for字段,替换默认的remote-address字段:

log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ';
这样子完美解决获取用户真实IP问题,但其实这里会导致nginx代理后的容器是获取不到真实IP,需要修改第一种场景的配置,设置转发头,如下:

proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
遗留问题1:

通过VPN代理访问的话,就无法获取真实IP。

已邀请:

要回复问题请先登录注册