第13关 解决K8s中Ingress Nginx控制器无法获取真实客户端IP的问题

news2024/12/23 9:15:26

------> 课程视频同步分享在今日头条和B站

大家好,我是博哥爱运维。

这节课带大家探索并分享最全面的解决在使用Kubernetes(K8s)和Ingress-Nginx-Controller中无法获取客户端真实IP问题的视频教程,帮助你快速理解并解决这一问题。

如果我们按下面网络架构图,暴露我们服务到公网上提供访问,那么此时我们后端的业务服务POD获取真实IP是没什么问题的,但种形式的网络架构直接暴露出我们源站的公网IP信息到互联网上,无疑于是在公网上裸奔,一旦遭受攻击,对我们的业务服务将是毁灭性的打击。

在这里插入图片描述

那么我们会去寻求一些大型提供公网网络防护的企业的帮助,购买他们的安全服务,如动态加速线路、WAF、或者高防线路,这个时候,我们的业务在公网上提供由于可以相对更安全了,但此时会带来另外一个问题,就是我们后端服务获取的客户端IP,都是安全服务提供商的代理IP了。

在这里插入图片描述

那么我们怎么解决这个问题,获取到真实CLIENT客户端的IP地址呢,在ingress-nginx控制器上配置其实也不难,加入下面三行配置即可解决:

# kubectl -n kube-system edit configmaps nginx-configuration

apiVersion: v1
data:
  ......
  compute-full-forwarded-for: "true"
  forwarded-for-header: "X-Forwarded-For"
  use-forwarded-headers: "true"

我们来看看这三行配置的详细含义:

compute-full-forwarded-for
: 将 remote address 附加到 X-Forwarded-For Header而不是替换它。当启用此选项后端应用程序负责根据自己的受信任代理列表排除并提取客户端 IP。

forwarded-for-header
: 设置用于标识客户端的原始 IP 地址的 Header 字段。默认值X-Forwarded-For
,此处由于A10带入的是自定义记录IP的Header,所以此处填入是X_FORWARDED_FOR

use-forwarded-headers
: 如果设置为True时,则将设定的X-Forwarded-*
 Header传递给后端, 当Ingress在L7 代理/负载均衡器
之后使用此选项。如果设置为 false 时,则会忽略传入的X-Forwarded-*
Header, 当 Ingress 直接暴露在互联网或者 L3/数据包的负载均衡器后面,并且不会更改数据包中的源 IP请使用此选项。

OK,到这里,大家是不是以为万事大吉了,NONONO,这个时候,其实还存在一个安全隐患是我们必须要提前知道的。

我们先来准备部署一个测试服务,用来模拟后端服务POD,并且能获取ingress-nginx传回来的请求头部信息打印出来,以便我们更直观的观察测试的详细情况

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: default
  labels:
    app: whoami
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - image: traefik/whoami:v1.10
        imagePullPolicy: Always
        name: whoami
        ports:
        - containerPort: 80
          name: 80tcp02
          protocol: TCP
      dnsPolicy: ClusterFirst
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: whoami
  name: whoami
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: whoami
  sessionAffinity: None
  type: ClusterIP

---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.1.201/32  # 只允许信任IP访问,其他返回403
    nginx.ingress.kubernetes.io/configuration-snippet: |  # 加入自定义头部,保存remote_addr信息
      proxy_set_header X-Custom-Real-IP $remote_addr;
  name: whoami
spec:
  rules:
  - host: whoami.boge.com
    http:
      paths:
      - backend:
          service:
            name: whoami
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - whoami.boge.com
    secretName: boge-com-tls

上面可以看到,我们对于whoami加入了访问限制,只允许出口IP为10.0.1.201这个地址来访问,其他全部拒绝返回403

curl -H "Host: whoami.boge.com" -s http://10.0.1.201

在201这台节点上请求是正常的

root@node-1:~# curl -H "Host: whoami.boge.com" -s http://10.0.1.201
Hostname: whoami-6cf6989d4c-7hrxz
IP: 127.0.0.1
IP: ::1
IP: 172.20.217.124
IP: fe80::383a:48ff:fe1e:e1e5
RemoteAddr: 172.20.84.128:5110
GET / HTTP/1.1
Host: whoami.boge.com
User-Agent: curl/7.81.0
Accept: */*
X-Custom-Real-Ip: 10.0.1.201
X-Forwarded-For: 10.0.1.201
X-Forwarded-Host: whoami.boge.com
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Scheme: http
X-Real-Ip: 10.0.1.201
X-Request-Id: 5b90653f94b45c1fa20ab038ff294534
X-Scheme: http

我们来到202这台节点请求看看,正常是会返回403拒绝请求的

root@node-2:~# curl -H "Host: whoami.boge.com" -s http://10.0.1.201
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

但这个时候,我们在请求头部传入伪造的XFF信息,再看结果呢

curl -H "X-Forwarded-For: 10.0.1.201" " -H "Host: whoami.boge.com" -s http://10.0.1.201

这里我们可以看到我们通过伪造XFF,成功绕过了服务的安全访问限制。

root@node-2:~# curl -H "X-Forwarded-For: 10.0.1.201" -H "boge: test" -H "Host: whoami.boge.com" -s http://10.0.1.201
Hostname: whoami-6cf6989d4c-7hrxz
IP: 127.0.0.1
IP: ::1
IP: 172.20.217.124
IP: fe80::383a:48ff:fe1e:e1e5
RemoteAddr: 172.20.84.128:5110
GET / HTTP/1.1
Host: whoami.boge.com
User-Agent: curl/7.81.0
Accept: */*
Boge: test
X-Custom-Real-Ip: 10.0.1.201
X-Forwarded-For: 10.0.1.201, 10.0.1.202
X-Forwarded-Host: whoami.boge.com
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Scheme: http
X-Original-Forwarded-For: 10.0.1.201
X-Real-Ip: 10.0.1.201
X-Request-Id: 81ce680afd34390c7936b72ac0e5c105
X-Scheme: http

解决这个也不复杂,就是我们就对请求到ingress-nginx控制器的来源IP作信任加白处理,只允许信任的IP段传来的XFF等信息。

但要注意的是,对于提供安全的厂商来说,他们的出口IP信息会经常变化的,意味着一旦变化,那么获取客户端真实IP又会存在问题。我们在加这个信任配置的时候,需要根据实际情况来作考量要不要添加,其实只要我们不暴露限制的IP信息,通常情况下还是相对安全的

proxy-real-ip-cidr: 10.0.1.201/32,10.0.1.203/32

加了信任IP配置后,再请求就没有安全问题了

root@node-2:~# curl -H "X-Forwarded-For: 10.0.1.201" -H "boge: test" -H "Host: whoami.boge.com" -s http://10.0.1.201
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1265997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot项目整合Redis,Rabbitmq发送、消费、存储邮件

&#x1f4d1;前言 本文主要是【Rabbitmq】——SpringBoot项目整合Redis&#xff0c;Rabbitmq发送、消费、存储邮件的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页…

一起学docker系列之十四Dockerfile微服务实践

目录 1 前言2 创建微服务模块2.1 **创建项目模块**2.2 **编写业务代码** 3 编写 Dockerfile4 构建 Docker 镜像5 运行 Docker 容器6 测试微服务7 总结8 参考地址 1 前言 微服务架构已经成为现代软件开发中的一种重要方式。而 Docker 提供了一种轻量级、便携式的容器化解决方案…

贵州乾辰谷材 以科技创新引领绝缘材料领域的新发展

贵州乾辰谷材科技有限公司&#xff0c;这家于2018年10月18日成立的贵州本地企业&#xff0c;已经在绝缘材料领域崭露头角。乾辰谷材不仅在成立短短几年内实现了快速成长&#xff0c;更以其科技创新能力和卓越产品性能赢得了业界和用户的广泛赞誉。 乾辰谷材的创始人王金斗先生&…

RFID资产管理系统全功能详解!高效管理从这里开始!

在现代商业环境中&#xff0c;RFID资产管理系统正成为企业管理不可或缺的先进工具。现代企业管理正处于数字化的浪潮中&#xff0c;而RFID资产管理系统正是这场浪潮中的一颗璀璨明珠。在这篇文章中&#xff0c;我们将全方位解析RFID资产管理系统的功能&#xff0c;助您深入了解…

Vue框架学习笔记——绑定class样式和绑定style样式

文章目录 前文提要class样式的三种绑定方法&#xff08;图片来自参考链接&#xff09;style样式&#xff08;内联形式&#xff09;总结 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 主要学习链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从…

redis运维(二十二)redis 的扩展应用 lua(四)

一 最佳实践 ① 铺垫 最佳实践&#xff1a;1、把redis操作所需的key通过KEYS进行参数传递2、其它的lua脚本所需的参数通过ARGV进行传递. redis lua脚本原理 Redis Lua脚本的执行原理 ② 删除指定的脚本缓存 ③ redis集群模式下使用lua脚本注意事项 1、常见报错现象 C…

超卓航科聚国内外专家学者,共推冷喷涂技术的发展与应用

11月24日——26日&#xff0c;冷喷涂技术及其在增材制造中的应用专题会在襄阳召开&#xff0c;来自国内外200多名科技工作者齐聚一堂&#xff0c;共同交流冷喷涂技术的研究与应用。 本次专题研讨会由中国机械工程学会表面工程分会主办&#xff0c;湖北超卓航空科技股份有限公司…

LeetCode.24两两交换链表中的节点

LeetCode.24两两交换链表中的节点 1.问题描述2.解题思路3.代码 1.问题描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示…

Hive数据库与表操作

文章目录 一、准备工作二、Hive数据库操作&#xff08;一&#xff09;Hive数据存储&#xff08;二&#xff09;创建数据库&#xff08;三&#xff09;查看数据库&#xff08;四&#xff09;修改数据库信息 一、准备工作 二、Hive数据库操作 &#xff08;一&#xff09;Hive数据…

Ultipa参加国际科学会议KGSWC2023

近日&#xff0c;领先的国际科学会议 KGSWC 2023&#xff0c;在西班牙萨拉戈萨大学召开&#xff0c;Ultipa Graph参加。 KGSWC2023是第五届伊比利亚-美洲会议和第四届印度-美洲知识图谱与语义网大会的联合论坛。自2019年成立以来&#xff0c;KGSWC一直是一个重要的学术活动&am…

通过流量监控分析某个部门或客户端网络性能

在当今数字化时代&#xff0c;网络已经成为组织和企业不可或缺的基础设施之一。作为信息传输和数据交互的关键载体&#xff0c;网络的性能对于保障业务的稳定运行和提升工作效率至关重要。因此&#xff0c;对某个部门或客户端网络的性能进行分析和评估&#xff0c;有助于了解当…

PyTorch入门教学——加载数据(Dataset)

1、简介 PyTorch中如何读取数据主要涉及到两个类&#xff0c;分别为Dataset和Dataloader。 Dataset&#xff1a;创建可被Pytorch使用的数据集Dataloader&#xff1a;向模型传递数据本文主要讲解Dataset的使用方法。 2、Dataset 2.1、查看使用方法 打开Anaconda Prompt&…

在表格中显示字典的内容(根据后端返回的数据)vue3

进入页面&#xff0c;调接口&#xff0c;后端返回数据&#xff0c;indexType为0或者1&#xff0c;要用这个数据显示字典的内容 用插槽拿到数据 写一个函数&#xff0c;在模板中使用 const { proxy } getCurrentInstance(); // 字典-指标类型 const { index_type } proxy.u…

java:jpa、Hibernate、Spring Data JPA、ORM以及和mybatis的区别

文章目录 Java连接数据库几种方式JPAHibernate和Spring Data JPAORM框架jpa和mybatis区别Spring Boot JPA使用例子1、创建库和表2、添加依赖3、配置数据源和Hibernate属性4、配置实体类5、创建一个继承JpaRepository的接口&#xff1a;6、创建一个控制器&#xff08;Controller…

混合云案例:利用 Databend Cloud 高效加速私有 Databend 的策略与实施

背景 Databend 是一款基于对象存储的存算分离湖仓产品&#xff0c;已成为云上大数据分析中高效且低成本的首选解决方案。目前&#xff0c;Databend 在多个用户场景中得到广泛应用&#xff0c;包括&#xff1a; 新媒体行业数据分析及大屏数据展示云上 CDH 替代以减少本地磁盘和…

DDD 系统间的七种关系梳理与实践

系统间的七种关系 本节将根据耦合度从高到低逐一探讨这些关系。耦合度高有时并不是坏事&#xff0c;它能够让团队内部的系统更加内聚&#xff0c;而不是无法整合的碎块。我们应该根据具体情况进行选择。 因为系统间关系往往也是组织架构的反映&#xff0c;此处每种关系除了描…

9.Spring 整合 Redis

引入依赖&#xff1a;spring-boot-starter-data-redis配置 Redis&#xff1a;配置数据库参数、编写配置类&#xff0c;构造 RedisTemplate访问 Redis&#xff1a; redisTemplate.opsForValue() redisTemplate.opsForHash() redisTemplate.opsForList() redisTemplate.opsForSe…

vue3默认插槽、具名插槽以及作用域插槽实现父子组件通信

默认插槽与具名插槽 父组件 <template><div><h1>我是父组件</h1><child><div style"color: red">我是从父元素插入的值(默认插槽)</div><template #juming><div style"color: green">我是从父元素…

2023亚马逊云科技re:Invent,在开发者板块探究如何利用技术重塑业务

美国当地时间11月27日&#xff0c;一年一度的亚马逊云科技re:Invent大会在美国拉斯维加斯盛大开幕。这场全球云计算领域的前沿盛会&#xff0c;已连续12年成为引领行业的风向标。那么本次2023亚马逊云科技re:Invent大会又有哪些可玩、可看的新项目&#xff0c;下面就一起来瞧一…