
# 如何获取来访者的真实IP？
当客户端通过ELB访问后端服务器时，客户端真实的IP地址会被ELB转换，后端服务器获取到的往往是ELB转换后的客户端IP地址。如果需要获取到客户端的真实IP，可以按如下方法操作。
- 七层服务（HTTP/HTTPS协议）：需要对应用服务器进行配置，然后使用X-Forwarded-For的方式获取来访者的真实IP地址。 配置详情见[七层服务]。
  
- 四层服务（TCP/UDP协议），有两种方式可以获取客户端的真实IP：
  - 方法一：开启监听器的"获取客户端IP"功能。
  
  - 方法二：配置TOA插件获取。
  
  
  配置详情见[四层服务]。
  
![](https://support.huaweicloud.com/elb_faq/public_sys-resources/note_3.0-zh-cn.png)
TCP Option字段不具备防篡改能力，数据传输经过的中间网络设备都可以对TCP Option字段进行更改。所以，使用TOA插件获取来访者真实IP的方式存在被伪造的风险。
#### 约束与限制
- 如果IP经过NAT，则只能获取到NAT转化后的IP地址，无法获取到NAT转化前的IP地址。
- 如果客户端为容器，只能获取到容器所在主机的IP地址，无法获取容器的IP。
- 四层监听器（TCP/UDP）开启"获取客户端IP"功能之后，不支持同一台服务器既作为后端服务器又作为客户端的场景。
- 独享型负载均衡的四层监听器（TCP/UDP）默认开启源地址透传功能，无需手动开启，且不支持关闭。
 
![](https://support.huaweicloud.com/elb_faq/public_sys-resources/note_3.0-zh-cn.png)
如果客户端经过WAF+ELB访问服务器，则还可以通过WAF直接获取客户端真实IP。详见[《Web应用防火墙用户指南》](https://support.huaweicloud.com/bestpractice-waf/waf_06_0020.html#section1)
 #### 七层服务
针对七层服务（HTTP/HTTPS协议），需要对应用服务器进行配置，然后使用X-Forwarded-For的方式获取来访者的真实IP地址。
真实的来访者IP会被负载均衡放在HTTP头部的X-Forwarded-For字段，格式如下：
```
X-Forwarded-For: 来访者真实IP, 代理服务器1-IP,  代理服务器2-IP, ...
```
当使用此方式获取来访者真实IP时，获取的第一个地址就是来访者真实IP。
**配置Apache服务器**
1. 安装Apache 2.4。 例如在CentOS 7.5环境下，可以执行如下命令执行安装：
   ```
   yum install httpd
   ```
   
2. 修改Apache的配置文件/etc/httpd/conf/httpd.conf，在最末尾添加以下配置信息。
   ```
   LoadModule remoteip_module modules/mod_remoteip.so
   RemoteIPHeader X-Forwarded-For
   RemoteIPInternalProxy 100.125.0.0/16
   ```
   图1修改Apache的配置文件示例图   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001866004105.jpg)
   ![](https://support.huaweicloud.com/elb_faq/public_sys-resources/note_3.0-zh-cn.png)
   将代理服务器的网段添加到 RemoteIPInternalProxy \<IP_address\>。
   - 共享型负载均衡需要添加的IP地址段为 100.125.0.0/16（100.125.0.0/16 是负载均衡服务保留地址，其他用户无法分配到该网段内，不会存在安全风险）和高防IP地址段。多个IP地址段用逗号分隔。
   
   - 独享型负载均衡需要添加ELB实例关联的VPC子网网段。
     
3. 修改Apache的配置文件/etc/httpd/conf/httpd.conf，将日志输出格式修改为如下所示（%a代表源IP地址）：
   ```
   LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
   ```
   
4. 重启Apache。
   ```
   systemctl restart httpd
   ```
   
5. 查看httpd的访问日志，您可以获取真实的来访者IP。
**配置Nginx服务器**
例如在CentOS 7.5环境下，可以执行如下命令执行安装：
1. 运行以下命令安装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. 在以下配置信息后添加新的配置字段和信息。 在http或者server处，需要添加的配置字段和信息：
   ```
   set_real_ip_from 100.125.0.0/16;
   real_ip_header X-Forwarded-For;
   ```
   图2添加配置字段和信息示例图   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001819324178.jpg)
   ![](https://support.huaweicloud.com/elb_faq/public_sys-resources/note_3.0-zh-cn.png)
   将代理服务器的网段添加到 RemoteIPInternalProxy \<IP_address\>。
   - 共享型负载均衡需要添加的IP地址段为 100.125.0.0/16（100.125.0.0/16 是负载均衡服务保留地址，其他用户无法分配到该网段内，不会存在安全风险）和高防IP地址段。多个IP地址段用逗号分隔。
   
   - 独享型负载均衡需要添加ELB实例关联的VPC子网网段。
     
4. 启动Nginx。
   ```
   /path/server/nginx/sbin/nginx
   ```
   
5. 查看Nginx的访问日志，您可以获取真实的来访者IP。
   ```
   cat /path/server/nginx/logs/access.log
   ```
   
**配置Tomcat服务器**
本教程中的Tomcat的安装路径为"/usr/tomcat/tomcat8/"。
1. 登录已安装Tomcat的服务器。
2. 执行如下命令，确定Tomcat已经正常运行。
   ```
   ps -ef|grep tomcat
   netstat -anpt|grep java
   ```
   图3正常运行结果示例   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001819164390.png "点击放大") 
3. 将server.xml文件中的className="org.apache.catalina.valves.AccessLogValve"模块修改为如下内容。
   ```
   vim /usr/tomcat/tomcat8/conf/server.xml
   ```
   ```
   <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/elb_faq/zh-cn_image_0000001865923929.png "点击放大") 
4. 执行如下命令，重启Tomcat服务。
   ```
   cd /usr/tomcat/tomcat8/bin && sh shutdown.sh && sh startup.sh
   ```
   其中"/usr/tomcat/tomcat8/"为Tomcat安装路径，请根据实际情况替换。
   图5重启Tomcat服务   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001819324186.png) 
5. 执行如下命令，查看最新的日志。 如图中红框所示获取到的非100.125网段的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/elb_faq/zh-cn_image_0000001866004109.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/elb_faq/zh-cn_image_0000001819324166.png "点击放大")
   图8配置本机模块   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001819324170.png "点击放大") 
4. 单击"注册"，分别注册x86和x64插件。
   图9注册插件   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001865923941.png "点击放大") 
5. 在"模块"页面，确认注册的模块名称出现在列表中。
   图10确认注册成功   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001819324182.png "点击放大") 
6. 选择IIS管理器主页的"ISAPI筛选器"，为2个插件授权运行ISAPI和CGI扩展。
   图11添加授权   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001819164394.png "点击放大") 
7. 选择"ISAPI和CGI限制"，为2个插件设置执行权限。
   图12允许执行   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001819324174.png "点击放大") 
8. 单击主页的"重新启动"，重启IIS服务，重启后配置生效。
   图13重启IIS服务   
   ![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001865923925.png "点击放大") 
 #### 四层服务
针对四层服务（TCP/UDP协议），有两种方式可以获取客户端的真实IP。
- **方式一（TCP/UDP协议）** ：开启监听器的"获取客户端IP"功能。
  ![](https://support.huaweicloud.com/elb_faq/public_sys-resources/caution_3.0-zh-cn.png)
  - 开启此功能后，执行后端服务器迁移任务时，可能出现流量中断（例如单向下载、推送类型的流量）。所以后端服务器迁移完成后，需要通过报文重传来恢复流量。
  
  - 监听器开启此功能后，后端服务器不能作为客户端访问此监听器。
  
  - 如果监听器之前已经添加了后端服务器、并且开启了健康检查功能，开启"获取客户端IP"功能会重新上线后端服务器，新建流量会有1-2个健康检查间隔的中断。
   
  1. 开启监听器的"获取客户端IP"功能。
     1. 登录管理控制台。
     
     2. 在管理控制台左上角单击![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001865923869.png)图标，选择区域和项目。
     
     3. 单击页面左上角的![](https://support.huaweicloud.com/elb_faq/zh-cn_image_0000001866004041.png)，选择"网络 \> 弹性负载均衡"。
     
     4. 在"负载均衡器"界面，单击需要操作的负载均衡名称。
     
     5. 切换到"监听器"页签。
        - 新增场景：单击"添加监听器"。
        
        - 修改场景：在需要修改的监听器名称右侧所在行的操作列，单击"编辑"。
         
     
     6. 开启"获取客户端IP"开关。 独享型负载均衡默认支持"获取客户端IP"功能，不需要手动开启。
        
      
  
  2. 设置后端服务器的安全组、网络ACL、操作系统和软件的安全规则，使客户端的IP地址能够访问后端服务器。
     ![](https://support.huaweicloud.com/elb_faq/public_sys-resources/note_3.0-zh-cn.png)
     开启"获取客户端IP"之后，不支持同一台服务器既作为后端服务器又作为客户端的场景。如果后端服务器和客户端使用同一台服务器，且开启"获取客户端IP"，则后端服务器会根据报文源IP为本地IP判定该报文为本机发出的报文，无法将应答报文返回给ELB，最终导致回程流量不通。
     
   
- **方式二（TCP协议）** ：配置TOA插件获取。
  针对四层（TCP协议）服务，需要配置TOA插件获取。配置TOA插件请参考[TOA插件配置](https://support.huaweicloud.com/usermanual-elb/elb_06_0001.html)。
  
 
