多级代理下Nginx获取真实用户IP地址的总结

本文介绍了在Nginx作为多级代理时,如何通过自定义IP头、HTTP_X_FORWARDED_FOR以及使用realip模块来获取用户的真实IP地址,同时讨论了防止XFF欺骗的方法和realip模块的工作原理。
摘要由CSDN通过智能技术生成

声明:本文参考http://www.ttlsa.com/nginx/nginx-get-user-real-ip/并做了一些补充讲解,希望会更加清晰明了~


随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户的真实IP地址,如果后端是apache,请跳转到<apache获取用户真实IP地址>,如果是后端真实服务器是nginx,那么继续往下看。

实例环境:
用户IP 120.22.11.11
CDN前端 61.22.22.22
CDN中转 121.207.33.33
公司NGINX前端代理 192.168.50.121(外网121.207.231.22)

1、使用CDN自定义IP头来获取

假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:

proxy_set_header remote-user-ip $remote_addr;

//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>

后端PHP代码getRemoteUserIP.php

<?php
    $ip = getenv("HTTP_REMOTE_USER_IP");
    echo $ip;   
?>

访问getRemoteUserIP.php,结果如下:

120.22.11.11 //取到了真实的用户IP

注:这里$remote_addr是nginx的变量,一般情况是,是报文发送方的IP地址,如果发送方为proxy,那么这里就是proxy的ip,而非用户的真实ip.

注意:这里面会有一个问题,就是所谓的XFF欺骗,当用户直接访问后端的时候,并且他伪造了HTTP报头REMOTE_USER_IP,那么后端获取到的,将是一个虚假的用户IP,这个时候可能会产生一些安全问题。如果可以,建议的做法是:后端服务不允许对外部用户访问,最前端的代理,proxy_set_header xxxxx $remote_addr;这样就能解决欺骗,因为$remote_addr获取的是用户IP数据包中的IP,而非伪造的HTTP报文首部。

2、通过HTTP_X_FORWARDED_FOR获取IP地址

一般情况下CDN服务器都会传送HTTP_X_FORWARDED_FOR头。而且会用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这里,$proxy_add_x_forwarded_for是一个神奇的变量,假如接收到的报文已经含有X-FORWARDED-FOR首部,那么nginx将在后面添加上$remote_addr(也就是发送者的ip地址在最后),因此后端的真实服务器获取HTTP_X_FORWARDED_FOR头,截取字符串第一个不为unkown的IP作为用户真实IP地址, 例如:

120.22.11.11,  61.22.22.22,  121.207.33.33,192.  168.50.121(用户IP,CDN前端IP,CDN中转,公司NGINX代理)

getFor.php

<?php
    $ip = getenv("HTTP_X_FORWARDED_FOR");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值