跳至内容

如何使用弹性负载均衡在 Web 服务器日志中捕获客户端 IP 地址?

3 分钟阅读
0

我在 Web 服务器上使用弹性负载均衡 (ELB),并在 Web 服务器访问日志中查看负载均衡器的 IP 地址。我想改为捕获客户端 IP 地址。

简短描述

您的 Web 服务器访问日志之所以捕获负载均衡器的 IP 地址,是因为负载均衡器会与您的实例建立连接。要在 Web 服务器访问日志中捕获客户端 IP 地址,请进行以下配置:

  • 对于具有 HTTP/HTTPS 侦听器的应用程序负载均衡器和经典负载均衡器,添加 X-Forwarded-For HTTP header(X-Forwarded-For HTTP 标头)来捕获客户端 IP 地址。然后,您可以对 Web 服务器访问日志进行配置,以记录这些 IP 地址。

    注意: 在某些情况下,X-FORWARDED-FOR 标头可能不存在或为空。应用程序负载均衡器、经典负载均衡器和网络负载均衡器发起的运行状况检查请求不包含 X-FORWARDED-FOR 标头。此外,具有 TCP/SSL 侦听器的网络负载均衡器和经典负载均衡器不会将 X-FORWARDED-FOR 标头附加到传入请求中。对于应用程序负载均衡器,选择附加 processing mode(处理模式),从而以一致的方式添加 X-FORWARDED-FOR 标头。

  • 对于具有 TCP/SSL 侦听器的经典负载均衡器,请 configure proxy protocol support on the Classic Load Balancer(在经典负载均衡器和目标应用程序上配置代理协议支持)。

  • 对于网络负载均衡器,通过实例 ID 注册目标,从而无需进行额外的 Web 服务器配置即可捕获客户端 IP 地址。有关说明,请参阅 Target group attributes(目标组属性)。

  • 对于只能将 IP 地址注册为目标的网络负载均衡器,请在负载均衡器上激活代理协议版本 2。有关说明,请参阅 Proxy protocol(代理协议)。

解决方法

具有 HTTP/HTTPS 侦听器的应用程序负载均衡器和经典负载均衡器 (Apache)

要添加 X-Forwarded-For HTTP 标头并配置您的 Web 服务器访问日志,请完成以下步骤:

  1. 使用文本编辑器打开您的 Apache 配置文件。位置因您的配置而异,例如适用于 Amazon Linux 和 RHEL 的 /etc/httpd/conf/httpd.conf,或适用于 Ubuntu 的 /etc/apache2/apache2.conf

  2. LogFormat 部分中,添加 %{X-Forwarded-For}i,如以下示例所示:

    ...    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
        ...
  3. 保存您的更改。

  4. 重新加载 Apache 服务。根据您的系统,运行以下命令之一:

    Sysvinit、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES11)

    # /etc/init.d/apache2 reload

    Sysvinit、基于 RPM 的系统(例如 RHEL 6 和 Amazon Linux),SUSE 除外

    # /etc/init.d/httpd reload

    Systemd、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES12)

    # systemctl reload apache2

    基于 RPM 的系统(例如 RHEL 7 和 Amazon Linux 2),SUSE 除外

    # systemctl reload httpd
  5. 打开您的 Apache Web 服务器访问日志。位置因您的配置而异。

  6. 验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。

具有 HTTP/HTTPS 侦听器的应用程序负载均衡器和经典负载均衡器 (NGINX)

要添加 X-Forwarded-For HTTP 标头并配置您的 Web 服务器访问日志,请完成以下步骤:

  1. 使用文本编辑器打开您的 NGINX 配置文件。位置通常是 /etc/nginx/nginx.conf

  2. LogFormat 部分中,添加 $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"';
        access_log  /var/log/nginx/access.log  main;
        ...
    }
  3. 保存您的更改。

  4. 重新加载 NGINX 服务。对于 Amazon Linux 2 或 RHEL,运行以下命令:

    systemctl reload nginx

    **注意:**在其他系统上,重新加载 NGINX 服务的命令是不同的。重新加载 NGINX 的命令与上一部分中重新加载 Apache 服务的命令类似。

  5. 打开您的 NGINX Web 服务器访问日志。位置因您的配置而异。

  6. 验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。

具有 TCP/SSL 侦听器的经典负载均衡器 (Apache)

要配置代理协议支持,请完成以下步骤:

  1. 使用文本编辑器打开您的 Apache 配置文件。位置因您的配置而异,例如适用于 Amazon Linux 和 RHEL 的 /etc/httpd/conf/httpd.conf,或适用于 Ubuntu 的 /etc/apache2/apache2.conf

  2. 确保您的 Apache 配置可加载模块 mod_remoteip(适用于 Apache 2.4.31 及更高版本)。有关详细信息,请参阅 Apache 网站上的 Apache Module mod_remoteip(Apache 模块 mod_remoteip)。该模块包含 RemoteIPProxyProtocol 指令。有关详细信息,请参阅 Apache 网站上的 RemoteIPProxyProtocol Directive(RemoteIPProxyProtocol 指令)。在配置文件中,检查是否有与以下内容类似的行:

    Amazon Linux 或 RHEL

    LoadModule remoteip_module modules/mod_remoteip.so

    Ubuntu

    LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
  3. 要确认 mod_remoteip 模块是否已加载,请运行以下命令:

    $ sudo apachectl -t -D DUMP_MODULES | grep -i remoteip
  4. 查看输出并验证输出中是否包含与以下内容类似的行:

    remoteip_module (shared)

    **重要事项:**如果输出不包含此行,则说明您的配置中不包含或未加载该模块。在继续操作之前,请务必激活该模块。

  5. 要激活代理协议支持,请将以下行添加到您的 Apache 配置文件中:

    RemoteIPProxyProtocol On
  6. 编辑配置文件的 LogFormat 部分以捕获远程 IP 地址 (%a) 和远程端口 (%{remote}p:):

    LogFormat "%h %p %a %{remote}p %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  7. 保存您的更改。

  8. 重新加载 Apache 服务。根据您的系统,运行以下命令之一:

    Sysvinit、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES11)

    # /etc/init.d/apache2 reload

    Sysvinit、基于 RPM 的系统(例如 RHEL 6 和 Amazon Linux),SUSE 除外

    # /etc/init.d/httpd reload

    Systemd、基于 Debian 的系统(例如 Ubuntu)和 SUSE(例如 SLES12)

    # systemctl reload apache2

    Systemd、基于 RPM 的系统(例如 RHEL 7 和 Amazon Linux 2),SUSE 除外

    # systemctl reload httpd
  9. 打开 Apache Web 服务器访问日志。位置因您的配置而异。

  10. 验证客户端 IP 地址现在是否记录在 Proxy Protocol 标头下。

  11. 在目标应用程序中激活对代理协议的支持。

具有 TCP/SSL 侦听器的经典负载均衡器 (NGINX)

要配置代理协议支持,请完成以下步骤:

  1. 使用文本编辑器打开 NGINX 配置文件。位置通常是 /etc/nginx/nginx.conf

  2. server 部分的 listen 行更新为 proxy_protocol。更新 http 部分的 log_format 行,以设置 proxy_protocol_addr

    http {    ...
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$proxy_protocol_addr"';
    
        access_log  /var/log/nginx/access.log  main;
        ...
    }
    server {
            ...
            listen  80  default_server proxy_protocol;
            ...
            }
    ...
    }
  3. 保存您的更改。

  4. 重新加载 NGINX 服务。对于 Amazon Linux 2 或 RHEL,运行以下命令:

    systemctl reload nginx

    **注意:**在其他系统上,重新加载 NGINX 服务的命令是不同的。重新加载 NGINX 的命令与上一部分中重新加载 Apache 服务的命令类似。

  5. 打开 NGINX Web 服务器访问日志。位置因您的配置而异。

  6. 验证客户端 IP 地址现在是否记录在 Proxy Protocol 标头下。

  7. 在目标应用程序中激活对代理协议的支持。