我正在对我的 Web 服务器使用 Elastic Load Balancing,我可以在访问日志中看到我的负载均衡器的 IP 地址。如何改为捕获客户端 IP 地址?

您的访问日志之所以捕获负载均衡器的 IP 地址,是因为负载均衡器会与您的实例建立连接。您必须执行其他配置才能在访问日志中捕获客户端 IP 地址。

具有 HTTP/HTTPS 侦听器的 Application Load Balancers 和 Classic Load Balancer (Apache)

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

对于 Systemd、基于 RPM 的系统(如 RHEL 7 和 Amazon Linux 2),不包括 SUSE:

# systemctl reload httpd

5.    打开 Apache 访问日志。位置因配置而异。

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

具有 HTTP/HTTPS 侦听器的 Application Load Balancers 和 Classic Load Balancer (NGINX)

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 配置文件。请务必使用适当的配置文件路径。

# sudo /etc/init.d/nginx reload

5.    打开 NGINX 访问日志。位置因配置而异。

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

具有 TCP/SSL 侦听器的 Classic Load Balancer (Apache)

1.    在首选文本编辑器中打开 Apache 配置文件。位置因配置而异,例如 Amazon Linux 和 RHEL 上的位置是 /etc/httpd/conf/httpd.conf,Ubuntu 上的位置是 /etc/apache2/apache2.conf

2.确保您的 Apache 配置加载模块 mod_remoteip(适用于 Apache 2.4.31 及更高版本)。该模块包括 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 访问日志。位置因配置而异。

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

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

具有 TCP/SSL 侦听器的 Classic Load Balancer (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 配置文件。

对于 Sysvinit 系统(例如 Amazon Linux、RHEL 6、SLES11 和 Ubuntu 14.04):

# /etc/init.d/nginx reload

对于 Systemd 系统(例如 RHEL 7、Amazon Linux 2、SLES12 和 Ubuntu 16.04): 

# systemctl reload nginx

5.    打开 NGINX 访问日志。位置因配置而异。

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

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


此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2018 年 12 月 7 日