当您通过SLB访问应用时,可以通过本文提供的方法在代码中获取客户端IP。

问题描述

在EDAS中创建的应用绑定SLB后,客户端通过SLB访问时,如何在后端Java代码中获取到客户端的真实IP呢?

说明 EDAS应用基本信息 > 应用设置页面的负载均衡-外网和负载均衡-内网在获取客户端IP这个问题上类似。

解决方案

根据应用部署的集群不同,解决方案也有所区别。

  • 部署在ECS集群的应用

    可直接在后端Java代码中使用下面的方式获取即可。

    String client_ip = request.getHeader("x-forwarded-for");                

    另外,还可以通过获取HTTP Header中的x-real-ipwl-proxy-client-ip参数来得到客户端的真实IP。

  • 部署在容器服务Kubernetes集群的应用

    1. 在容器服务Kubernetes控制台的集群列表中找到您创建的Kubernetes集群,并在该集群操作列单击控制台
    2. 在该集群的控制台页面,单击服务,然后在服务页面中找到并单击通过EDAS控制台部署的应用。
    3. 在应用服务的详情页面右上角单击编辑
    4. 修改Service对话框找到externalTrafficPolicy配置参数,将该参数值由默认的Cluster改为Local,然后在该对话框右下角单击更新,即会动态更新该服务的配置。修改 Service
    5. 在后端Java代码中可通过下面的方式获取到客户端的真实IP :
      String client_ip = request.getRemoteAddr();              

    结合上面ECS集群和容器服务Kubernetes集群部署的应用获取客户端IP的方法,可通过三元运算符将这两种方式变为一行代码:

    String client_ip = request.getHeader("x-forwarded-for") == null ? request.getRemoteAddr() : request.getHeader("x-forwarded-for");               

    即可适配EDAS中不同的集群类型。

    另外,该参数的修改还可以通过kubectl命令的方式:

    说明 前提是已经参见Kubernetes集群基本信息页面的通过kubectl连接Kubernetes集群部分配置好了KubeConfig。
    kubectl patch svc <service_name> -p '{"spec":{"externalTrafficPolicy":"Local"}}'