nginx获取客户端真实ip

前提:当多层代理或使用CDN时,如果代理服务器不把用户的真实IP传递下去,那么业务服务器将永远不可能获取到用户的真实IP。

nginx的变量

  1. remote_addr
    代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP,除非代理将你的IP附在请求header中一起转交给web服务器。
  2. X-Forwarded-For(简称XFF)
    X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。
    XFF的格式为:
    X-Forwarded-For: client, proxy1, proxy2
  3. X-Real-IP
    这是一个自定义头部字段,通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端,这个要看经过代理的层级次数或是是否始终将真实IP一路传下来。(注意:如果未经严格处理,可以被伪造)

配置proxy_set_header

  1. proxy_set_header Host $host;
    在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名。
  2. proxy_set_header X-Real-IP $remote_addr;
    将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip。
  3. proxy_set_header X-Forwarded-For $remote_addr;
    把客户端的真实ip传递给proxy_set_header X-Forwarded-For $remote_addr。
  4. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    和proxy_set_header X-Forwarded-For r e m o t e a d d r 差 不 多 , 区 别 在 与 remote_addr差不多,区别在与 remoteaddrproxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。如果有两个nginx做两层代理,第二个nginx做这样的设置,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,我这次就是做了这样的设置所以获取到的一直是客户端的真实ip,代理ip。

案例

  1. 阿里云的slb指到后端nginx代理时,获取用户真实ip时把阿里云的slb代理地址也获取到了。
    nginx的配置
    proxy_pass http://xx.cn;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto http;
    proxy_next_upstream off;
    在这里插入图片描述
  2. 后来查看阿里云的文档通过ngx_http_realip_module做设置后获取到两个客户真实ip地址
    阿里云文档https://help.aliyun.com/document_detail/54007.html
    ngx_http_realip_module配置官方文档http://nginx.org/en/docs/http/ngx_http_realip_module.html#real_ip_header
    新增加的配置
    set_real_ip_from 172.16.0.0/16;
    set_real_ip_from 100.116.189.0/24;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;`
    set_real_ip_from:告知Nginx哪些是反向代理IP,即排除后剩下的就是真实客户端IP,支持配置具体IP地址、CIDR地址; 在这里插入图片描述
  3. 后来认真看了proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for的作用后把这个注释掉就行了,因为这个在有2级以上的代理时传递给X-Forwarded-For的值是客户端的真实ip,代理ip。
    .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Menardღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值