nginx配置获取客户端的真实ip

这篇具有很好参考价值的文章主要介绍了nginx配置获取客户端的真实ip。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景描述:

访问路径: A机器 - > B机器的 ->C虚拟机 :

A机器为客户端用户,本地地址为 192.168.0.110

B机器为服务端反向代理服务器 本地地址为192.168.0.128 –>(192.168.56.1)

C机器为B主机安装的linux虚拟机,并安装了nginx ,本地ip为**(192.168.56.10)**

从侧面反映了反向代理的好处,直接从A是无法访问C的,但是在B中做了反向代理 ,就能访问了,保护了服务端的地址。而无法将C的ip暴露给客户端A

注意:在B和C直接由于使用了虚拟机,虚拟机的网关的ip为192.168.56.1 所以 在C端取到的上一层ip为192.168.56.1

目的: 在C机器取到 A的ip地址,并输出日志客户端的真实ip为192.168.0.110

B机器的nginx 配置:(首层代理)

 location /bb/ {

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;

            proxy_pass http://192.168.56.10/cc/;
       }

在B中的nginx 中 给请求设置了 header 。 X-Real-IP 和 X-Forwarded-For

X-Real-IP 取得值是 r e m o t e a d d r ,而 remote_addr ,而 remoteaddr,而remote_addr为与主机B直连客户端A 的ip地址。

X-Forwarded-For 取得值是个用逗号分隔得多个值,主要包括客户端X-Forwarded-For的值 与 $remote_addr 的值,两部分用逗号分隔。

所以此时 X-Real-IP 为 192.168.0.110, X-Forwarded-For 为 ,192.168.0.110 此时客户端并未主动传 X-Forwarded-For 头。

  • proxy_set_header X-Real-IP $remote_addr; 这句的作用是将客户端的IP地址赋值给X-Real-IP请求头,$remote_addr变量表示与nginx服务器直接连接的客户端或代理服务器的IP地址。这句一般用于第一层代理服务器,以便后续的代理服务器能够获取到客户端的IP地址。
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这句的作用是将客户端请求头中的X-Forwarded-For和 r e m o t e a d d r 两部分用逗号分隔后赋值给 X − F o r w a r d e d − F o r 请求头, remote_addr两部分用逗号分隔后赋值给X-Forwarded-For请求头, remoteaddr两部分用逗号分隔后赋值给XForwardedFor请求头,proxy_add_x_forwarded_for变量表示客户端请求头中的X-Forwarded-For和$remote_addr两部分。这句一般用于非首层代理服务器,以便将客户端和所有经过的代理服务器的IP地址都记录下来。

C中nginx 输出的log-format

   log_format main '$http_x_forwarded_for|$realip_remote_addr|$http_x_real_ip|$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    '$upstream_addr $request_time $upstream_response_time ';

C中nginx的配置

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    proxy_set_header        X-Real-IP       $remote_addr; 
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
 #   real_ip_header X-Forwarded-For;
 #   set_real_ip_from 192.168.56.1;
 #   real_ip_recursive on;
}

在这一层中 X-Real-IP 取到的是上层代理的地址,也就是192.168.56.1

X-Forwarded-For 是上两层的地址?192.168.0.110,192.168.56.1 (这一层其实就一个值还是192.168.0.110,在下一层才是这两个值,这里有些歧义,原因是这一层接收到值之后 还没有拼接本层获取上一层的地址。这一层只是待发送状态。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 这个是将头拼接后发给下一层的。所以在下一层取到地址才是 192.168.0.110,192.168.56.1

所以在c中的输出日志中打印的值为

192.168.0.110|192.168.56.1|192.168.0.110|192.168.56.1 - - [15/Sep/2023:02:32:43 +0000] "GET /cc/ HTTP/1.0" 200 15539 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" "192.168.0.110" 123.121.155.167:16002 0.326 0.326

如果我使用nginx自带的模块 realip 再固定一层,重点观察$remote_addr的值

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    real_ip_header X-Forwarded-For;
    set_real_ip_from 192.168.56.1;
    real_ip_recursive on;
}

如果我将配置改成这样,我们再来观察一下日志输出

192.168.0.110|192.168.56.1|192.168.0.110|192.168.0.110 - - [15/Sep/2023:02:46:38 +0000] "GET /cc/ HTTP/1.0" 200 15539 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" "192.168.0.110" 123.121.155.167:16002 0.796 0.796

上述描述只是两层代理,为了测试出 X-Forwarded-For 的值,我们设置了3层代理。

A -》B-》c-》d

A:192.168.0.110 B:192.168.0.104 C:192.168.0.128(192.168.56.1) D:192.168.56.10

B nginx 配置:

location /testIp/ {
            # set $current-X-Fowarded-for X-Forwarded-For 
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://192.168.0.128:6666/testIp/;
       }

C nginx配置:

 location /testIp/ {
            # set $current-X-Fowarded-for X-Forwarded-For 
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://192.168.56.10/testIp/;
       }

D nginx 配置:

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   # real_ip_header X-Forwarded-For;
   #  set_real_ip_from 192.168.56.1;
   #  real_ip_recursive on;
   .....
        
        localtion /testIp/ {
            porxy_pass  http://666.com
         }
   }

D 中nginx的日志

192.168.0.110, 192.168.0.104|192.168.56.1|192.168.0.104|192.168.56.1 - - [15/Sep/2023:03:26:30 +0000] "GET /testIp/ HTTP/1.0" 200 15539 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" "192.168.0.110, 192.168.0.104" 192.168.0.104:82 0.299 0.299

192.168.0.110, 192.168.0.104 是输出的X-forwarded-for 的值。

   real_ip_header X-Forwarded-For;
   set_real_ip_from 192.168.56.1;
   real_ip_recursive on;

这三个值一般是加到最后的D中,为了设置授信ip为上层的remot_addr的值,

  • set_real_ip_from:用于设置信任的 IP,即请求头中的 IP 中 nginx 认为可信的 IP。一般是前几层代理的 IP。
  • real_ip_header:用于告诉 nginx 从哪个请求头字段中获取客户端真实的 IP。一般是 X-Forwarded-For 或 X-Real-IP。
  • real_ip_recursive:用于控制 nginx 如何从请求头字段中获取多个 IP 中的一个。当值为 on 时,nginx 会从右往左排除信任的 IP,取最后一个非信任的 IP 作为客户端真实的 IP。

例如,如果您想从 X-Forwarded-For 字段中获取客户端真实的 IP,并且信任 192.168.56.1 这个 IP,您可以在 location 中添加以下代码:

location /test {
    proxy_pass http://backend;
    real_ip_header X-Forwarded-For;
    set_real_ip_from 192.168.56.1;
    real_ip_recursive on;
}

这样,nginx 就会把 X-Forwarded-For 字段中最后一个非 192.168.56.1 的 IP 赋值给 $remote_addr 变量,作为客户端真实的 IP。

对于nginx 获取客户端真实ip做个总结
  • 对于首层代理服务器,使用proxy_set_header X-Forwarded-For $remote_addr;来将客户端IP赋值给X-Forwarded-For请求头
  • 对于非首层代理服务器,使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;来将客户端请求头中的X-Forwarded-For和$remote_addr两部分用逗号分隔后赋值给X-Forwarded-For请求头
    ursive on;
    }
    这样,nginx 就会把 X-Forwarded-For 字段中最后一个非 192.168.56.1 的 IP 赋值给 $remote_addr 变量,作为客户端真实的 IP。

对于nginx 获取客户端真实ip做个总结

对于首层代理服务器,使用proxy_set_header X-Forwarded-For $remote_addr;来将客户端IP赋值给X-Forwarded-For请求头文章来源地址https://www.toymoban.com/news/detail-742640.html

  • 对于非首层代理服务器,使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;来将客户端请求头中的X-Forwarded-For和$remote_addr两部分用逗号分隔后赋值给X-Forwarded-For请求头
  • 如果有多层代理服务器,可以使用nginx的realip模块来从XFF中抛弃指定的可信IP,从而获取用户真实IP

到了这里,关于nginx配置获取客户端的真实ip的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nginx 获取客户端真实IP

    网站接入Web应用防火墙WAF(Web Application Firewall)后,访问请求在到达源站服务器之前,需要经过WAF的代理转发。这种情况下,源站服务器可以通过解析回源请求中的X-Forwarded-For记录,获取客户端的真实IP。 WAF在将客户端的访问请求转发到下一环节的服务器时,会在HTTP的请求头

    2023年04月09日
    浏览(37)
  • Nginx(二十) 获取真实客户端IP

            客户端在访问互联网应用服务器时,与真实的应用服务器之间会因为有多层反向代理,而导致真实应用服务器获取的仅是最近一层的反向代理服务器 IP。为使 Nginx 后端的上游服务器可以获得真实客户端 IP,Nginx 提供了 ngx_http_realip_module 模块用以实现真实客户端

    2024年01月16日
    浏览(34)
  • nginx如何获取真实客户端ip

    nginx作为反向代理服务器,即代理我们的服务端,下面介绍下如何配置nginx获取真实的客户端ip 1、配置nginx.con 2、在java程序中可以通过如下方式获取: 这样就可以打印出真实ip了!即request.getHeader(\\\"X-Real-IP\\\")的值 引用: 查看端口占用及释放所占用的端口_查询谷歌浏览器的端口

    2024年02月11日
    浏览(40)
  • Nginx代理后获取客户端真实IP地址

    在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址,比如记录系统操作日志等情况。 通常情况下我们可以使用以下方式来获取IP地址 但是当我们使用Nginx反向代理项目地址后,使用以上方法只能获取到Nginx服务器的IP地址,并不是客户端的IP地址。 解决

    2023年04月11日
    浏览(36)
  • Docker部署Nginx,无法获取客户端真实ip地址

    在部署docker版本nginx进行请求转发,意外发现nginx打印日志中的客户端ip并非为客户端的真实ip(221.237.xxx.xxx),而是docker虚拟网卡的ip(172.17.0.1) 开始猜测是nginx配置问题,对比其他环境,发现配置相同,但其他环境未出现此情况 通过查询资料,推测是docker网桥和linux防火墙存在

    2023年04月21日
    浏览(26)
  • Nginx+netty实现tcp负载均衡,获取客户端真实ip

    在nginx.conf文件中,events,http同级添加配置 启动nginx服务 启动2个服务netty服务设置nginx中8888,8889端口。 使用tcp工具连接并发送数据测试 参考博客 参考链接1 参考链接2

    2024年02月06日
    浏览(40)
  • nginx配置获取真实ip

    要想在应用中获取到真实IP,取决于各个转发节点的传递配置, 第一、要确定客户端使用哪个请求头传递IP地址 第二、第一转发点, proxy_set_header field value value是变量值,来源于请求方 field是变量名,是要发给下一站的变量 注意这个顺序,set设置要发往下一站的变量,紧接着

    2024年02月11日
    浏览(35)
  • k8s ingress 添加获取客户端真实ip配置

    本环境是一个互联网ip服务器上的nginx转发k8s集群内的ingress域名,实现所有服务通过域名访问, 默认配置下,在pod内获取客户端请求地址信息时,获取的是pod的ip和节点ip。要获取客户端ip,需要添加nginx配置中 除此之外还需要修改configmap ingress-nginx-controller ,增加如下配置

    2024年02月02日
    浏览(29)
  • 第13关 解决K8s中Ingress Nginx控制器无法获取真实客户端IP的问题

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维。 这节课带大家探索并分享最全面的解决在使用Kubernetes(K8s)和Ingress-Nginx-Controller中无法获取客户端真实IP问题的视频教程,帮助你快速理解并解决这一问题。 如果我们按下面网络架构图,暴露我们服务到公

    2024年02月03日
    浏览(37)
  • centos 安装 nginx配置ssl 和 获取用户真实ip

    安装所需环境 nginx 是用 C语言开发的,建议在Linux上使用,如果是windows用户,也可以使用windows版本。 一. gcc 安装 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果有 gcc 环境,则不需要安装,命令: yum install gcc-c++ 二. PCRE pcre-devel 安装 PCRE(Perl Compatible

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包