如何在 ELB 后面的 Web 服务器日志中捕获客户端 IP 地址?
我正在对我的 Web 服务器使用弹性负载均衡器 (ELB),我可以在 Web 服务器访问日志中看到负载均衡器的 IP 地址。如何改为捕获客户端 IP 地址?
简短描述
您的 Web 服务器访问日志之所以捕获负载均衡器的 IP 地址,是因为负载均衡器会与您的实例建立连接。要在 Web 服务器访问日志中捕获客户端的 IP 地址,请进行以下配置:
- 对于具有 HTTP/HTTPS 侦听器的 Application Load Balancer 和 Classic Load Balancer,使用 X-Forwarded-For HTTP 标头来捕获客户端 IP 地址。然后,您可以将 Web 服务器访问日志配置为记录这些 IP 地址。
- 对于具有 TCP/SSL 侦听器的经典负载均衡器,需要在经典负载均衡器和目标应用程序上激活代理协议支持。确保在负载均衡器和应用程序上配置代理协议支持。
- 对于 Network Load Balancer,请按实例 ID 注册目标,以捕获客户端 IP 地址,而无需额外的 Web 服务器配置。有关说明,请参阅目标组属性而不是以下解决方法。
- 对于网络负载均衡器,如果您只能将 IP 地址注册为目标,请在负载均衡器上激活代理协议版本 2。有关说明,请参阅启用代理协议而不是以下解决方法。
解决方法
具有 HTTP/HTTPS 侦听器的 Application Load Balancer 和 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 Web 服务器访问日志。位置因配置而异。
6. 验证客户端 IP 地址现在是否记录在 X-Forwarded-For 标头下。
具有 HTTP/HTTPS 侦听器的 Application Load Balancer 和 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 服务。
例如,在 Amazon Linux 2 或 RHEL 上,运行以下命令:
systemctl reload nginx
**注意:**用于重新加载 NGINX 服务的命令在其他系统上各不相同。用于重新加载 NGINX 的命令类似于上一节中用于重新加载 Apache 服务的命令。
5. 打开您的 NGINX Web 服务器访问日志。位置因配置而异。
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 Web 服务器访问日志。位置因配置而异。
10. 验证客户端 IP 地址现在是否记录在 Proxy Protocol 标头下。
11. 在目标应用程序中激活对代理协议的支持。
具有 TCP/SSL 侦听器的经典负载均衡器 (NGINX)
1. 使用文本编辑器打开 NGINX 配置文件。该位置通常是 /etc/nginx/nginx.conf。
2. 将 server(服务器)部分的 listen(侦听)行更改为*NOTE: THIS IS PLACEHOLDER CONTENT THAT WILL BE REPLACED AFTER EDITING*(*注意:这是占位符内容,将在编辑后被替换*)
###Long Sentences XX ###Wrong/Misspelled Service Name ###Link broken or incorrect title link ###Sensitive Terms Terms ###Changes **WAS:** **IS:** **REASON:** **WAS:** **IS:** **REASON:** **WAS:** **IS:** **REASON:** **WAS:** **IS:** **REASON:** 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. 在目标应用程序中激活对代理协议的支持。

相关内容
- 已提问 9 个月前lg...
- AWS 官方已更新 10 个月前
- AWS 官方已更新 5 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 个月前