文档首页/ 弹性负载均衡 ELB/ 最佳实践/ 高级功能/ 在七层独享型ELB转发下获取客户端真实IP
更新时间:2025-08-28 GMT+08:00

在七层独享型ELB转发下获取客户端真实IP

应用场景

在使用弹性负载均衡进行业务转发时,您可能需要获取客户端请求的真实IP地址进行进一步分析,特别是在安全防护、数据分析、用户行为分析和故障排查等典型业务场景。由于通过HTTP/HTTPS/QUIC监听器进行七层业务转发时,客户端真实IP经过独享型ELB实例时会发生转换,您可以参考本文获取客户端真实的IP地址。

约束与限制

  • 如果请求经过NAT网关,则只能获取到NAT转换后的IP地址,无法获取NAT转化前的IP地址。
  • 如果请求客户端为容器,则只能获取到容器所在主机的IP地址,无法获取容器的IP地址。

七层服务获取客户端真实IP方法介绍

  • 独享型ELB的七层协议监听器(HTTP/HTTPS/QUIC)默认开启“获取客户端IP”功能,支持通过X-Forwarded-For字段传递客户端的真实IP。
  • 对后端服务器进行配置,确保服务器可以正确解析X-Forwarded-For字段以获取客户端的真实IP。

    X-Forwarded-For字段格式如下:

    X-Forwarded-For: <请求客户端真实IP, 代理服务器1-IP, 代理服务器2-IP, ...>

    使用此方式获取客户端真实IP时,获取的第一个IP地址就是客户端真实IP。

准备工作

  • 已创建独享型ELB实例,且ELB已绑定EIP。具体操作,请参见购买独享型负载均衡器绑定IPv4公网IP
  • 已创建协议类型为HTTP协议的后端服务器组。服务器组中添加了ECS01实例,并且在ECS01中部署了应用服务。

步骤一:七层监听器开启“获取客户端IP”功能

独享型ELB实例的HTTP/HTTPS/QUIC监听器默认开启“获取客户端IP”功能,即默认支持通过X-Forwarded-For走字段记录客户端请求的真实IP。

步骤二:配置后端服务器

根据部署的后端服务器类型,进行相应的配置,确保服务器可以正确解析X-Forwarded-For字段。

例如在CentOS 7.5环境下,可以执行如下命令执行安装:

  1. 运行以下命令下载Nginx源码包,安装http_realip_module。
    yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
    wget http://nginx.org/download/nginx-1.17.0.tar.gz
    tar zxvf nginx-1.17.0.tar.gz
    cd nginx-1.17.0
    ./configure --prefix=/path/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
    make
    make install
  2. 执行以下命令,打开nginx.conf文件。
    vi /path/server/nginx/conf/nginx.conf
  3. 按i进入编辑模式。
  4. 修改server配置块,修改参考如下。
    set_real_ip_from 192.168.0.0/16;
    real_ip_header X-Forwarded-For;
    图1 添加配置字段和信息示例图

    将代理服务器的网段添加到 set_real_ip_from <IP_address>,独享型负载均衡需要添加ELB实例的后端子网网段。

  5. 修改http配置块,为Nginx配置访问日志,将X-Forwarded-For头字段的客户端请求信息通过http_x_forwarded_for传入日志,您可以参考执行以下命令。
    http {  
          log_format main '$remote_addr- $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';     
          } 
    图2 配置访问日志
  6. 启动Nginx。
    /path/server/nginx/sbin/nginx

本教程中的Tomcat的安装路径为“/usr/tomcat/tomcat8/”。

  1. 登录已安装Tomcat的服务器。
  2. 执行如下命令,确定Tomcat已经正常运行。
    ps -ef|grep tomcat
    netstat -anpt|grep java
    图3 正常运行结果示例
  3. 将server.xml文件中的className="org.apache.catalina.valves.AccessLogValve"模块修改为如下内容。
    1. 打开server.xml文件。
      vim /usr/tomcat/tomcat8/conf/server.xml
    2. 修改文件内容参考如下。
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
      prefix="localhost_access_log." suffix=".txt"
      pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false" />
    图4 配置示例
  4. 执行如下命令,重启Tomcat服务。
    cd /usr/tomcat/tomcat8/bin && sh shutdown.sh && sh startup.sh

    其中“/usr/tomcat/tomcat8/”为Tomcat安装路径,请根据实际情况替换。

    图5 重启Tomcat服务
  5. 执行如下命令,查看最新的日志。

    如图中红框所示获取到IP地址,即为获取到的源IP地址。

    cd /usr/tomcat/tomcat8/logs/
    cat localhost_access_log.2021-11-29.txt

    其中“localhost_access_log.2021-11-29.txt”为当天日志路径,请根据实际情况替换。

    图6 查询源IP地址

本教程以Windows Server 2012配置IIS7为例介绍,其他版本操作可能略有不同。

  1. 下载并安装IIS。
  2. 从第三方网站下载F5XForwardedFor.dll插件,并获取x86和x64目录下的F5XForwardedFor.dll插件拷贝到IIS服务具有访问权限的目录下,例如C:\F5XForwardedFor2008。
  3. 打开IIS管理器,选择“模块 > 配置本机模块”注册拷贝的2个插件。
    图7 选择模块选项
    图8 配置本机模块
  4. 单击“注册”,分别注册x86和x64插件。
    图9 注册插件
  5. 在“模块”页面,确认注册的模块名称出现在列表中。
    图10 确认注册成功
  6. 选择IIS管理器主页的“ISAPI筛选器”,为2个插件授权运行ISAPI和CGI扩展。
    图11 添加授权
  7. 选择“ISAPI和CGI限制”,为2个插件设置执行权限。
    图12 允许执行
  8. 单击主页的“重新启动”,重启IIS服务,重启后配置生效。
    图13 重启IIS服务

步骤三:验证后端服务器已获取客户端真实IP

以Nginx作为后端服务器时,查看Nginx的访问日志,您可以获取客户端请求的真实IP。

cat /path/server/nginx/logs/access.log

日志记录中,$http_x_forwarded_for变量对应的字段中,第一个IP地址即为客户端的真实IP地址。

图14 查看Nginx的日志