K8S中应用无法获取用户真实ip问题排查

现象

领导反馈生产环境的用户ip有问题。登陆到这个页面,发现是所有的用户ip都是172.30.94.97,这是个内部网络ip.

排查过程

1 登陆到应用前端nginx, 查看nginx的请求日志

172.30.94.97 - - [17/Jul/2024:02:02:54 +0000] "POST /***/notify/my-page HTTP/1.1" 200 182 "/report/home?type=2&id=2612&lang=zh_CN" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" "10.72.44.200"
172.30.94.97 - - [17/Jul/2024:02:02:54 +0000] "POST /***/notify/my-page HTTP/1.1" 200 182 "/home?lang=zh_CN" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "10.49.140.102"
172.30.94.97 - - [17/Jul/2024:02:02:56 +0000] "POST /***/msg/notify/my-page HTTP/1.1" 200 59 "/user/message/info?lang=zh_CN" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "10.13.52.192"

发现第一列展示的ip正好是我们的Java应用代码拿到的iP,而真实的ip展示在最后一列

2 查看nginx的日志输出格式。第一列取的是remote_addr变量,说明这个变量是有问题的 。我们要取的是最后一列http_x_forwarded_for变量

log_format  main   '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

3 查看Java代码获取客户ip的逻辑。Java代码从6个Header变量中依次找可以用的ip。

    public static String getClientIP(HttpServletRequest request, String... otherHeaderNames) {String[] headers = new String[]{"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"};if (ArrayUtil.isNotEmpty(otherHeaderNames)) {headers = (String[])ArrayUtil.addAll(new String[][]{headers, otherHeaderNames});}return getClientIPByHeader(request, headers);} 

4 查看nginx传递过来了哪些Header变量。nginx传递过来了X-Real-IP和X-Forwarded-For,其中X-Real-IP取的是有问题的remote_addr,正好我们Java代码取到的是这个变量。X-Forwarded-For没有值。

location ~ ^/(admin-api|rpc-api)/ {client_max_body_size 32m;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://***:30001;
}

5 根据第二步的分析,将remote_addr修改为http_x_forwarded_for
6 重启nginx,问题解决

K8S网络拓扑

在这里插入图片描述
所有的外部流量一定会通过一个ingress controller进入到K8S的内部。ingress controller的一个常见实现是Nginx,正好我们的k8s选择的就是Nginx。也就是说我们的业务前端nginx前面还有一个nginx。所以我们的前端nginx的remote_addr拿到的是k8s入口ingress的内部ip地址。

总结

用户请求经过两层nginx转发才到达后端java业务应用。remote_addr仅存储上一个转发节点的ip,所以我们的业务应用一直拿的是ingress的ip。http_x_forwarded_for存储的是原始用户的请求ip。

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

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

相关文章

2.倒排索引

传统数据库mysql使用的是正向索引 词条是不允许重复的,给词条创建唯一索引,根据词条查找的速度就很快了。

【Android Studio】新建项目及问题解决

新建项目 按照《Android 第一行代码》中 1.3 小节的步骤创建项目。 注意:Minimum API Level 用于设置项目的最低兼容版本。Android 5.0 以上的系统已经占据超过了 99.9% 的 Android 市场份额,因此这里指定为 API 21: Android 5.0 即可。 问题解决 &…

SX1268低功耗sub-1g芯片支持lora和GFSK调制

SX1268 射频收发器是长距离无线应用的理想设备,支持410-810MHZ。它专为长电池寿命而设计,仅消耗4.2 mA的主动接收电流。SX1268 可以使用高效的集成功率放大器在490 MHz传输高达 22 dBm 的信号。在 780 MHZ时,SX1268 在天线端口传输10dBm的信号…

C#高级:利用反射让字符串决定调用哪个方法

一、反射的实现 using System; using System.Reflection; using System.Threading.Tasks;public class Calculator {public int Add(int a, int b){return a b;}public int Subtract(int a, int b){return a - b;}public int Multiply(int a, int b){return a * b;}public do…

图像二分类任务推荐使用Sigmoid函数‌

‌图像二分类任务中可以使用Softmax作为激活函数,但通常更推荐使用Sigmoid函数‌。Softmax函数可以将多个类别的输出转换成概率分布,适合多分类任务。在二分类任务中,虽然可以使用Softmax,但它会生成两个输出值(每个类…

湖北理元理律师事务所:债务优化的法律逻辑与生活平衡术

在债务纠纷数量年均增长19%的背景下(最高人民法院2023年数据),专业法律服务机构的价值不仅在于解决纠纷,更在于重构债务人与生活的平衡关系。湖北理元理律师事务所的实践显示,科学的债务优化需同时满足三个维度&#x…

window 显示驱动开发-处理视频帧

Microsoft Direct3D 运行时调用用户模式显示驱动程序的 VideoProcessBeginFrame 和 VideoProcessEndFrame 函数,以指示用户模式显示驱动程序可以处理视频帧的这些函数调用之间的时间段。 在用户模式显示驱动程序可以处理任何视频帧之前,Microsoft Direct…

基于 React Native for HarmonyOS5 的跨平台组件库开发指南,以及组件示例

基于 React Native for HarmonyOS5 的跨平台组件库开发,需融合分层架构设计、鸿蒙原生能力桥接及性能优化技术,核心指南如下: ‌一、分层架构设计‌ 采用 ‌模块化分层结构‌,隔离平台差异逻辑: ├── common_har …

一站式了解单例模式

引言 这是设计模式专栏的第一篇文章,在这个专栏里面会讲到我们在开发中经常使用的设计模式,我会用心将它们解析,然后讲给你们听,如果感兴趣可以持续关注这个专栏❤️ 这次我们要讲的是单例模式,这个在大厂面试中十分…

Java应用Flink CDC监听MySQL数据变动内容输出到控制台

文章目录 maven 依赖自定义数据变化处理器flink cdc监听验证 maven 依赖 <properties><flink.version>1.14.0</flink.version><flink-cdc.version>2.3.0</flink-cdc.version></properties><dependencies><!-- Flink dependencie…

猎板厚铜PCB工艺能力如何?

在电子产业向高功率、高集成化狂奔的今天&#xff0c;电路板早已不是沉默的配角。当5G基站、新能源汽车、工业电源等领域对电流承载、散热效率提出严苛要求时&#xff0c;一块能够“扛得住大电流、耐得住高温”的厚铜PCB&#xff0c;正成为决定产品性能的关键拼图。而在这条赛道…

业务:资产管理功能

文章目录 一、项目背景1.1概述1.2编写目的 二、注意点说明三、页面效果四、代码AssetManagementControllerHwinfoAssetManagementHwinfoAssetManagementServiceHwinfoAssetManagementServiceImplHwinfoAssetManagementMapperHwinfoAssetManagementMapper.xmlSfpAssetManagement…

【MySQL进阶】MySQL程序

目录 一.有哪些MySQL程序 二. mysqld —— MySQL服务器 三.mysql——MySQL客户端 3.1.连接mysql客⼾端 3.2.mysql客户端选项 3.2.1.mysql常用选项 3.2.2.在命令⾏中使⽤选项 3.3.MySQL 选项&#xff08;配置&#xff09;文件 3.3.1.Linux环境下默认配置文件的路径 3.…

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…

​​CentOS 7.9​​ 上配置 ​​Fail2ban 自动封禁 IP​​ 的完整步骤,整合了多篇权威资料的最佳实践

&#x1f527; ​​一、安装 Fail2ban​​ ​​启用 EPEL 仓库​​ yum install epel-release -y ​​安装 Fail2ban​​ yum install fail2ban -y ​​启动并设置开机自启​​ systemctl start fail2ban systemctl enable fail2ban ⚠️ 注意&#xff1a;CentOS 7.9 默认 Py…

损坏的RAID5 第十六次CCF-CSP计算机软件能力认证

纯大模拟 提前打好板子 我只通过4个用例点 然后就超时了。 #include<iostream> #include<cstring> #include<algorithm> #include<unordered_map> #include<bits/stdc.h> using namespace std; int n, s, l; unordered_map<int, string>…

Kafka Topic中的数据在消费后还存在吗

在 Kafka 的主题(Topic)和分区(Partition)中,数据在被消费者消费后是否仍然存在,取决于 Kafka 的设计机制和配置策略。

Linuxkernel学习-deepseek-2

以下是国际上广受好评的 Linux 内核权威公开课&#xff0c;均来自顶级高校和技术组织&#xff0c;附课程链接和特色说明&#xff1a; —### 一、殿堂级大学课程1. MIT 6.S081: Operating System Engineering - 核心&#xff1a;基于 RISC-V 架构 重写 Unix 内核&#xff08;xv6…

高频面试之6Hive

Hive 文章目录 Hive6.1 Hive的架构6.2 HQL转换为MR流程6.3 Hive和数据库比较6.4 内部表和外部表6.5 系统函数6.6 自定义UDF、UDTF函数6.7 窗口函数6.8 Hive优化6.8.1 分组聚合6.8.2 Map Join6.8.3 SMB Map Join6.8.4 Reduce并行度6.8.5 小文件合并6.8.6 谓词下推6.8.7 并行执行…

分类场景数据集大全「包含数据标注+训练脚本」 (持续原地更新)

一、作者介绍&#xff1a;六年算法开发经验、AI 算法经理、阿里云专家博主。擅长&#xff1a;检测、分割、理解、大模型 等算法训练与推理部署任务。 二、数据集介绍&#xff1a; 质量高&#xff1a;高质量图片、高质量标注数据&#xff0c;吐血标注、整理&#xff0c;可以作为…