点赞
评论
收藏
分享
举报
Ingress NGINX传递用户真实ip问题
发表于2021-11-24 13:04

浏览 2k

原文作者:felix_yujing
原文链接:ingress nginx传递用户真实ip问题
转载来源:CSDN


背景

业务应用经常有需要用到用户真实ip的场景,比如:异地登录的风险预警、访问用户分布统计等功能等。当有这种需求的时候,在业务上容器过程中,如果用到ingress就要注意配置了。通常,用户ip的传递依靠的是X-Forwarded-*参数。但是默认情况下,ingress是没有开启的。

ingress的文档还比较详细,这里介绍一下可能用到的这3个参数:


在这里插入图片描述

注:在文档顶栏的搜索框搜索forward字样就可以找到这3个参数


1. use-forwarded-headers

  • 如果Nginx在其他7层代理或负载均衡后面,当期望Nginx将X-Forwarded-*的头信息传递给后端服务时,则需要将此参数设为true


  • 如果设为false(默认为false),Nginx会忽略掉X-Forwarded-*的头信息。false设置适用于Nginx直接对外或前面只有3层负载均衡的场景


由于ingress的主配置是从configmap中获取的,更新参数则需要修改名为nginx-configuration的configmap的配置:在data配置块下添加use-forwarded-headers: "true"

修改后,ingress nginx会自动加载更新nginx.conf主配置文件。下图为更新前后配置文件变化对比:


在这里插入图片描述

注:左边为开启use-forwarded-headers后ingress nginx主配置文件,右边为开启前

2. forwarded-for-header

用来设置识别客户端来源真实ip的字段,默认是X-Forwarded-For。如果想修改为自定义的字段名,则可以在configmap的data配置块下添加:forwarded-for-header: "THE_NAME_YOU_WANT"。通常情况下,我们使用默认的字段名就满足需求,所以不用对这个字段进行额外配置。

3. compute-full-forwarded-for

如果只是开启了use-forwarded-headers: "true"的话,会发现还是没能获取到客户端来源的真实ip,原因是当前X-Forwarded-For变量是从remote_addr获取的值,每次取到的都是最近一层代理的ip。为了解决这个问题,就要配置compute-full-forwarded-for字段了,即在configmap的data配置块添加:compute-full-forwarded-for: "true"。其作用就是,将客户端用户访问所经过的代理ip按逗号连接的列表形式记录下来。

待ingress nginx加载configmap并更新主配置文件后,对比更新前后变化如下:


在这里插入图片描述

在这里插入图片描述

注:左边是未开启compute-full-forwarded-for配置的ingress nginx主配置文件,右边是开启了的

举例说明

如果从客户端ip0发起一个HTTP请求到达服务器之前,经过了三个代理proxy1、proxy2、proxy3,对应的ip分别为ip1、ip2、ip3,那么服务端最后得到的X-Forwarded-For值为:ip0,ip1,ip2。列表中并没有ip3,ip3可以在服务端通过remote_addr来获得。这样应用程序通过获取X-Forwarded-For字段的第一个ip,就可以得到客户端用户真实ip了。

注意项

值得注意的是,并不是所有的场景都能通过X-Forwarded-For来获取用户正式ip。
比如,当服务器前端使用了CDN的时候,X-Forwarded-For方式获取到的可能就是CDN的来源ip了,
这种情况,可以根CDN厂商约定一个字段名来记录用户真实ip,然后代理将这个字段逐层传递,最后到服务端。

更多资源

想要更及时全面地获取NGINX相关的技术干货、互动问答、系列课程、活动资源?请前往NGINX开源社区:

官网:nginx.org.cn

微信公众号:https://mp.weixin.qq.com/s/XVE5yvDbmJtpV2alsIFwJg

微信群:https://www.nginx.org.cn/static/pc/images/homePage/QR-code.png?v=1621313354

- B站:https://space.bilibili.com/628384319

已修改于2023-03-08 16:38
创作不易,留下一份鼓励
NGINX社区小N助手

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NGINX社区小N助手
这家伙很懒还未留下介绍~
14
文章
0
问答
12
粉丝
相关文章
一、nginx安装1、本地安装windows系统:直接去官网:https://nginx.org/en/download... 下载相应版本即可。mac系统:$brewinstallnginx2、Linux安装:以centOS系统为例,有下面两种安装方式(推荐1)1.)通过rpm镜像源安装$rpm-ivhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm $yuminstall-ynginx2.)通过依赖包详细安装安装nginx依赖库pcre、zlib$yuminstallpcrepcre-devel $yuminstallzlibzlib-devel如有必要,可以安装c++编译环境和openssl$yuminstallgcc-c++ $yuminstallopensslopenssl-devel下载/编译nginx$wget-chttps://nginx.org/download/ngi
点赞 7
浏览 1.6k
译序:一般来讲,Nginx的错误日志级别是error,作为Nginx用户来讲,你设置成info就足够用了。    但有时有些难以挖掘的bug,需要看到更详细的debug级别的日志,这时候,单单把 error_log 级别设置成debug是不行的,Nginx记录下来的还是info级别以上的信息。你需要激活Nginx的debug日志才可以得到debug级别的日志信息。本文简要介绍了Nginxdebug日志的激活和配置使用。官方正文如下:    要激活debug日志,Nginx在构建时需要配置为支持debug:./configure--with-debug...    然后可以通过 error_log 指令设置debug级别:error_log/path/to/logdebug;    Window
点赞 0
浏览 1.5k
Unit,已经出道好几年Unit是NGINX作者IgorSysoev亲自设计,NGINX团队核心人员开发的,首次开源发布于2017年。有着活跃的社区和专业的开发能力,我有幸成为其中正式一员。Changes with Unit 1.24.0   27 May 2021......Changes with Unit 0.1      06 Sep 2017*)Firstpublicrelease.Unit现代应用服务器软件结合此图看Unit,以下是它的核心功能。配置:完全动态,包括进程数、服务监听端口、证书等。路由:灵活并且强大的路由功能,它会成为微服务的杀器功能。语言:支持各种主流语言和版本,这对DevOps太友好了。文件:支持静态资源服务,并且更好用。代理:目前只有简单的轮循,成为完整的负载均衡只是时间问题。容器:目前拥有隔离功能,一直在挑战做容器的事情。NGINX,全球头号Web
点赞 1
浏览 1.6k