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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

# kubectl -n kube-system edit configmaps nginx-configurationapiVersion: 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_FORuse-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: whoaminamespace: defaultlabels:app: whoami
spec:replicas: 1selector:matchLabels:app: whoamitemplate:metadata:labels:app: whoamispec:containers:- image: traefik/whoami:v1.10imagePullPolicy: Alwaysname: whoamiports:- containerPort: 80name: 80tcp02protocol: TCPdnsPolicy: ClusterFirstrestartPolicy: Always---
apiVersion: v1
kind: Service
metadata:labels:app: whoaminame: whoami
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: whoamisessionAffinity: Nonetype: 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访问,其他返回403nginx.ingress.kubernetes.io/configuration-snippet: |  # 加入自定义头部,保存remote_addr信息proxy_set_header X-Custom-Real-IP $remote_addr;name: whoami
spec:rules:- host: whoami.boge.comhttp:paths:- backend:service:name: whoamiport:number: 80path: /pathType: ImplementationSpecifictls:- hosts:- whoami.boge.comsecretName: 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.hqwc.cn/news/227933.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue select选择下拉组织树,解决不出现横向滚动条

背景&#xff1a;由于项目需求需要使用下拉选择框的组织架构树 实现代码如下&#xff1a; <el-row><el-col :span"18"><el-form-item label"所属组织:" prop"groupName"><el-select v-model"dataForm.groupName"…

【双指针】四数之和

四数之和 建议做过了解三数之和的思想再做这道题&#xff0c;思路是一样的~ 题目描述 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [num…

海翔云平台 getylist_login.do SQL 注入漏洞复现

0x01 产品简介 海翔云平台一站式整体解决方案提供商&#xff0c;业务涵盖 批发、连锁、零售行业ERP解决方案、wms仓储解决方案、电商、外勤、移动终端&#xff08;PDA、APP、小程序&#xff09;解决方案。 0x02 漏洞概述 海翔云平台getylist_login.do接口处存在SQL注入漏洞&am…

docker容器运维操作命令

docker exec &#xff1a;在运行的容器中执行命令 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] OPTIONS说明&#xff1a; -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端docker ps : 列出容器 docker ps [OPTIONS] OPTIONS说明&#…

如何集成一个TypeScript开发环境?

首先要安装个node.js。Node.js (nodejs.org) 然后我们随便建一个文件夹&#xff0c;并且打开它运行到终端 然后再运行命令&#xff1a; npm install typescript -g 成功后 尝试使用 tsc -v 查看版本 接下来再使用命令&#xff1a; tsc --init 我们在.ts文件中尝试输出一些…

GitHub 2023排名前十的最佳开源项目

开源软件&#xff08;OSS&#xff09;彻底改变了当今软件开发的方式。在数百万个开源GitHub项目中&#xff0c;要找到最适合需求的开源项目可能会让人不知所措。 今天给大家列出2023年增长最快的前10个开源GitHub仓库。通过这些增长最快的开源项目&#xff0c;也可以从整体上了…

zabbix 6.0 原理与部署

一、zabbix简介&#xff1a; zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbi…

如何运行C/C++程序

一、在线运行C/C 码曰 - 让代码在云端多飞一会&#xff1a;这是一个支持C/C&#xff0c;Java&#xff0c;Python等多种语言的在线编程&#xff0c;编译运行&#xff0c;粘贴分享的平台。你可以在这里输入你的代码&#xff0c;点击运行按钮&#xff0c;就可以看到输出结果。你也…

java设计模式 开闭原则

开闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计中的一个重要原则&#xff0c;它指导着我们如何设计和组织代码&#xff0c;以便使系统在扩展性和可维护性方面更加优秀。 开闭原则的定义是&#xff1a;软件实体&#xff08;类、模块、函数…

PWM占空比原理是什么,几个实例带你进一步了解

PWM : 即脉冲宽度调制(Pulse Width Modulation) 脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在从测量、通信到功率控制与变换及嵌入式领域的许多领域中。 PWM控制技术以其控制简单&#xff0c;灵活和动态响应好的优点而…

tcpdump使用心得

参考原文 https://danielmiessler.com/p/tcpdump/ 几个用例 tcpdump -i eth0 显示eth0网卡当前所有的抓包情况eth0是网卡名&#xff0c;可以通过ifconfig获得&#xff0c;也可以通过 tcpdump -D 显示当前可以监听的网卡 -i 参数表示接口&#xff0c;后跟要监听的网卡 tcpdu…

ASP.NET Core Web API设置响应输出的Json数据格式的两种方式

前言 在ASP.NET Core Web API中设置响应输出Json数据格式有两种方式&#xff0c;可以通过添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化库在应用程序中全局设置接口响应的Json数据格式&#xff0c;本文示例使用的是新的Minimal API模式。 JSON序列化和反序列化库…