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

Ingress 文档 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration 还比较详细

修改 Config Map(ingress-nginx-controller)添加下发参数:

"compute-full-forwarded-for": "true",
"use-forwarded-headers": "true"

重启之后还是不能获取到用户IP,是因为还需要需要改services 的 externalTrafficPolicy: Local。externalTrafficPolicy介绍:K8s中的external-traffic-policy是什么?

原因是 externalTrafficPolicy 默认为Cluster。Kube-proxy在做转发的时候,会做一次SNAT (source network address translation),所以源IP变成了转发源节点的IP地址。而externalTrafficPolicy 默认为Local。Kube-proxy转发时会保留源IP,但只转发给本机的容器,绝不跨节点转发。

所以需要修改deployment,添加 node 亲和性。将 pod ingress-nginx-controller 调度到 ip所指向的node上,比如a1

nodeSelector:kubernetes.io/os: linux
nodeName: a1

在修改Servicesingress-nginx-controller

  type: NodePortexternalTrafficPolicy: Local

重启pod,查看ip,成功,happy。

下面介绍一下用到的2个参数

注:在文档顶栏的搜索框搜索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,然后代理将这个字段逐层传递,最后到服务端。

k8s 集群 Ingress Nginx传递用户真实IP问题相关推荐

  1. nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

    nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题) 参考文章: (1)nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题) (2)https:// ...

  2. CDN下nginx获取用户真实IP地址

    为什么80%的码农都做不了架构师?>>>    随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能 ...

  3. vue获取url中ip_Kubernetes 集群中这样获取客户端真实 IP

    Kubernetes 依靠 kube-proxy 组件实现 Service 的通信与负载均衡.在这个过程中,由于使用了 SNAT 对源地址进行了转换,导致 Pod 中的服务拿不到真实的客户端 IP 地 ...

  4. k8s集群部署nginx服务并使用ceph-csi挂载存储以及测试

    一.ceph-csi存储在k8s部署以及外部cephfs集群的搭建 请查看我之前的文章,这里直接使用已安装的存储即可. 二.部署nginx持久化存储. 1.创建空间命名nginx-www # cat ...

  5. 面对大规模 K8s 集群,如何先于用户发现问题?

    作者 | 彭南光(光南) 来源 | 阿里巴巴云原生公众号 千里之堤,溃于蚁穴. 绪论 不知道大家是否经历过这样的情景:突然被用户告知系统出现问题,然后一脸懵地惶惶然排查修复:或是等到自己发现系统出现故 ...

  6. 一次对K8S集群service的“非主流”访问方式引发的网络探究

    一次对K8S集群service的"非主流"访问方式引发的网络探究 目录 一次对K8S集群service的"非主流"访问方式引发的网络探究 (一)"颇有 ...

  7. 利用k8s集群部署第一个容器化应用

    准备工作 按照这篇文章描述的流程搭建好k8s集群. 部署nginx Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 Kubernete ...

  8. Kubeadm安装高可用的K8S集群--多master单node

    Kubeadm安装高可用的K8S集群–多master单node master1 IP 192.168.1.180/24 OS Centos7.6 master2 IP 192.168.1.181/24 ...

  9. NGINX根据客户端真实ip限制/referer限制

    最近后端服务被攻击,所有接口被疯狂调用,记录一次nginx应对攻击的方案,包括黑白名单.referer限定等. 一.NGINX根据用户真实IP限源 1.nginx日志打印 在nginx.conf配置文 ...

最新文章

  1. 【MySQL 】学习笔记千行总结
  2. IntelliJ IDEA 偏好设置
  3. python中index方法详解_详解python中的index函数用法
  4. IE下常见兼容性问题
  5. Ubuntu16.04安装java(Oracle jre)
  6. 1.20 将多行单元格进行分栏打印 [原创Excel教程]
  7. 数据结构之常见排序算法的适用范围
  8. Halcon图像修复
  9. 跨境软体家具垂直供应链平台“品划算”获银河系千万级天使轮融资
  10. 三菱系统刀库乱刀处理_数控加工中心刀库乱刀原因以及处理方法
  11. 吉林大学珠海学院计算机录取分数线,吉林大学珠海学院录取分数线2021是多少分(附历年录取分数线)...
  12. windows下安装vc6.0和其PSDK
  13. java list clear 垃圾回收_Java垃圾回收
  14. 页面之间数据调转传输
  15. 用vue-cli创建项目后npm run serve 报错Component name “main“ should always be multi-word vue/multi-word-compo
  16. 传统文化之广场舞乱相到底反映出中国社会怎样的深层次矛盾
  17. C++ 没有找到接受const _Ty类型的左操作数的运算符
  18. 【原创】连连看Flex版设计与实现
  19. java文件打包成jar文件_将java文件打包成jar包步骤
  20. Pointofix安装与设置为中文

热门文章

  1. Nature子刊:华中农大Kenichi Tsuda组利用植物体内原位细菌转录及蛋白组学鉴定寄主免疫攻击的病原菌蛋白...
  2. R语言函数:length计算长度、seq生成数据序列、rep将数据对象重复N遍复制、cut将连续变量分割为多水平的因子变量、pretty将连续变量x分成n个区间创建合适的断点、cat数据对象拼接
  3. R语言ggplot2可视化时间序列数据:ggplot2可视化在时间轴上添加按月的箱图(boxplot)
  4. R语言data.table导入数据实战:data.table使用字符向量创建新的数据列
  5. Python以表格、可视化图像的形式输出模型特征重要度(feature importances)并进行重要度归一化及排序
  6. R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)
  7. R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比
  8. 机器学习流程模板及多模型对比实战梳理
  9. 梯度消失、梯度爆炸、过拟合问题之神经网络应对方案:数据预处理、批量归一化、非饱和激活函数、梯度缩放和梯度裁剪、权重初始化、提前终止、集成学习、l1l2、Dropout
  10. R语言包_lubridate