更新时间:2024-04-18 GMT+08:00

如何获取来访者的真实IP?

当客户端通过ELB访问后端服务器时,客户端真实的IP地址会被ELB转换,后端服务器获取到的往往是ELB转换后的客户端IP地址。如果需要获取到客户端的真实IP,可以按如下方法操作。

  • 七层服务(HTTP/HTTPS协议):需要对应用服务器进行配置,然后使用X-Forwarded-For的方式获取来访者的真实IP地址。

    配置详情见七层服务

约束与限制

  • 如果IP经过NAT,则只能获取到NAT转化后的IP地址,无法获取到NAT转化前的IP地址。
  • 如果客户端为容器,只能获取到容器所在主机的IP地址,无法获取容器的IP。
  • 四层监听器(TCP/UDP)开启“获取客户端IP”功能之后,不支持同一台服务器既作为后端服务器又作为客户端的场景。
  • 独享型负载均衡的四层监听器(TCP/UDP)默认开启源地址透传功能,无需手动开启,且不支持关闭。

七层服务

针对七层服务(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的配置文件示例图

    将代理服务器的网段添加到 RemoteIPInternalProxy <IP_address>。

    负载均衡需要添加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 添加配置字段和信息示例图

    将代理服务器的网段添加到 RemoteIPInternalProxy <IP_address>。

    负载均衡需要添加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 正常运行结果示例
  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 配置示例
  4. 执行如下命令,重启Tomcat服务。
    cd /usr/tomcat/tomcat8/bin && sh shutdown.sh && sh startup.sh

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

    图5 重启Tomcat服务
  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地址

配置Windows IIS服务器

本教程以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服务