
# 在七层独享型ELB转发下获取客户端真实IP
#### 应用场景
在使用弹性负载均衡进行业务转发时，您可能需要获取客户端请求的真实IP地址进行进一步分析，特别是在安全防护、数据分析、用户行为分析和故障排查等典型业务场景。由于通过HTTP/HTTPS监听器进行七层业务转发时，客户端真实IP经过独享型ELB实例时会发生转换，您可以参考本文获取客户端真实的IP地址。
#### 约束与限制
- 如果请求经过NAT网关，则只能获取到NAT转换后的IP地址，无法获取NAT转化前的IP地址。
- 如果请求客户端为容器，则只能获取到容器所在主机的IP地址，无法获取容器的IP地址。
 
#### 七层服务获取客户端真实IP方法介绍
- 独享型ELB的七层协议监听器（HTTP/HTTPS）默认开启"获取客户端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。具体操作，请参见[购买独享型负载均衡器](https://support.huaweicloud.com/usermanual-elb/elb_lb_000006.html)和[绑定IPv4公网IP](https://support.huaweicloud.com/usermanual-elb/elb_ug_fz_0015.html)。
- 已创建协议类型为HTTP协议的后端服务器组。服务器组中添加了ECS01实例，并且在ECS01中部署了应用服务。
 
#### 步骤一：七层监听器开启"获取客户端IP"功能
独享型ELB实例的HTTP/HTTPS监听器默认开启"获取客户端IP"功能，即默认支持通过X-Forwarded-For走字段记录客户端请求的真实IP。
#### 步骤二：配置后端服务器
根据部署的后端服务器类型，进行相应的配置，确保服务器可以正确解析X-Forwarded-For字段。
- [配置Nginx服务器]
  例如在CentOS 7.5环境下，可以执行如下命令执行安装：
  1. 运行以下命令下载[Nginx源码包](https://nginx.org/download/nginx-1.17.0.tar.gz)，安装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添加配置字段和信息示例图   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002365366681.png "点击放大")
     ![](https://support.huaweicloud.com/bestpractice-elb/public_sys-resources/note_3.0-zh-cn.png)
     将代理服务器的网段添加到 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配置访问日志   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002325315034.png "点击放大") 
  
  6. 启动Nginx。
     ```
     /path/server/nginx/sbin/nginx
     ```
     
   
- [配置Tomcat服务器]
  本教程中的Tomcat的安装路径为"/usr/tomcat/tomcat8/"。
  1. 登录已安装Tomcat的服务器。
  
  2. 执行如下命令，确定Tomcat已经正常运行。
     ```
     ps -ef|grep tomcat
     netstat -anpt|grep java
     ```
     图3正常运行结果示例   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002357797433.png "点击放大") 
  
  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配置示例   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002357637589.png "点击放大") 
  
  4. 执行如下命令，重启Tomcat服务。
     ```
     cd /usr/tomcat/tomcat8/bin && sh shutdown.sh && sh startup.sh
     ```
     其中"/usr/tomcat/tomcat8/"为Tomcat安装路径，请根据实际情况替换。
     图5重启Tomcat服务   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002323878802.png) 
  
  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地址   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002323718974.png "点击放大") 
   
- [配置Windows IIS服务器]
  本教程以Windows Server 2012配置IIS7为例介绍，其他版本操作可能略有不同。
  1. 下载并安装IIS。
  
  2. 从第三方网站下载F5XForwardedFor.dll插件，并获取x86和x64目录下的F5XForwardedFor.dll插件拷贝到IIS服务具有访问权限的目录下，例如C:\\F5XForwardedFor2008。
  
  3. 打开IIS管理器，选择"模块 \> 配置本机模块"注册拷贝的2个插件。
     图7选择模块选项   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002357797437.png "点击放大")
     图8配置本机模块   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002357637593.png "点击放大") 
  
  4. 单击"注册"，分别注册x86和x64插件。
     图9注册插件   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002323878806.png "点击放大") 
  
  5. 在"模块"页面，确认注册的模块名称出现在列表中。
     图10确认注册成功   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002323718978.png "点击放大") 
  
  6. 选择IIS管理器主页的"ISAPI筛选器"，为2个插件授权运行ISAPI和CGI扩展。
     图11添加授权   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002357797441.png "点击放大") 
  
  7. 选择"ISAPI和CGI限制"，为2个插件设置执行权限。
     图12允许执行   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002357637597.png "点击放大") 
  
  8. 单击主页的"重新启动"，重启IIS服务，重启后配置生效。
     图13重启IIS服务   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002323878810.png "点击放大") 
   
#### 步骤三：验证后端服务器已获取客户端真实IP
以Nginx作为后端服务器时，查看Nginx的访问日志，您可以获取客户端请求的真实IP。
```
cat /path/server/nginx/logs/access.log
```
日志记录中，$http_x_forwarded_for变量对应的字段中，第一个IP地址即为客户端的真实IP地址。
图14查看Nginx的日志   
![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002359483205.png "点击放大")
