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

 更新时间:2025年07月10日 08:39:35   作者:bruce128  
这篇文章主要介绍了K8S中应用无法获取用户真实ip问题排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

现象

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

排查过程

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

*.*.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" "*.*.44.200"
*.*.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" "*.*.140.102"
*.*.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" "*.*.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。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Centos 8.2 升级内核通过elrepo源的方法

    Centos 8.2 升级内核通过elrepo源的方法

    这篇文章主要介绍了Centos 8.2 升级内核通过elrepo源,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • K8s Pod容器中的command和args指令详解

    K8s Pod容器中的command和args指令详解

    这篇文章主要介绍了K8s新手系列之Pod容器中的command和args指令的相关资料,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-05-05
  • Google Kubernetes Engine 集群实战详解

    Google Kubernetes Engine 集群实战详解

    这篇文章主要为大家介绍了Google Kubernetes Engine 集群实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Prometheus Operator架构介绍

    Prometheus Operator架构介绍

    这篇文章主要为大家介绍了Prometheus Operator架构介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • k8s部署rabbitmq集群的方式

    k8s部署rabbitmq集群的方式

    本次部署方式为setafulset的方式部署rabbitmq集群,使用svc的无头服务,本次涉及使用到的服务有setafulset、secret、configmap、service、pv、pvc、sa,在rabbitmq的官网中使用的是operator的方式,感兴趣的朋友一起看看吧
    2024-03-03
  • 超详细的Kubernetes (k8s)常用命令整理

    超详细的Kubernetes (k8s)常用命令整理

    这篇文章主要介绍了Kubernetes (k8s)常用命令整理的相关资料,讲解了Kubernetes集群管理、节点资源查看、Pod管理、部署管理、命名空间管理、服务负载均衡、调试排错以及备份恢复等操作的命令,需要的朋友可以参考下
    2025-03-03
  • k8s Service 实现服务发现和负载均衡

    k8s Service 实现服务发现和负载均衡

    这篇文章主要为大家介绍了k8s Service 实现服务发现和负载均衡的工作原理及使用方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Rainbond功能架构及应用管理官方文档介绍

    Rainbond功能架构及应用管理官方文档介绍

    这篇文章主要为大家介绍了Rainbond功能机构及使用官方文档,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Spark三种属性配置方式详解

    Spark三种属性配置方式详解

    有时间还是多学习知识比较好,这篇文章主要介绍了Spark三种属性配置方式详解,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • k8s dashboard安装过程记录

    k8s dashboard安装过程记录

    这篇文章主要介绍了k8s dashboard安装过程记录,本案例k8s版本为v1.22.17,所以安装v2.7.0版本的dashboard,需要的朋友可以参考下
    2024-05-05

最新评论