Knowledge Center Monthly Newsletter - June 2025
Stay up to date with the latest from the Knowledge Center. See all new Knowledge Center articles published in the last month, and re:Post's top contributors.
如何在 ELB 後面的 Web 伺服器日誌中擷取用戶端 IP 地址?
對於 Web 伺服器我使用 Elastic Load Balancing (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 接聽程式的 Classic Load Balancer,在 Classic Load Balancer 和目標應用程式上啟用 Proxy 通訊協定支援。確保同時在負載平衡器和應用程式上設定 Proxy 通訊協定支援。
- 對於 Network Load Balancer,請依執行個體 ID 註冊目標,以擷取用戶端 IP 地址,而無需額外的 Web 伺服器組態。如需指示,請參閱目標群組屬性而非下列解決方法。
- 針對 Network Load Balancer,只有將 IP 地址註冊為目標時,會在負載平衡器上啟用 Proxy 通訊協定版本 2。如需指示,請參閱啟用 Proxy 通訊協定而非下列解決方法。
解決方法
與 HTTP/HTTPS 接聽程式 (Apache) 搭配使用 Application Load Balancer 和 Classic Load Balancer
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 接聽程式 (NGINX) 搭配使用 Application Load Balancer 和 Classic Load Balancer
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) 的 Classic Load Balancer
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 組態檔案以啟動 Proxy 通訊協定支援:
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 通訊協定標頭下。
11. 在目標應用程式中啟用 Proxy 通訊協定支援。
具有 TCP/SSL 接聽程式 (NGINX) 的 Classic Load Balancer
1. 使用文字編輯器開啟 NGINX 組態檔案。位置通常是 /etc/nginx/nginx.conf。
2. 將伺服器區段的接聽行變更為 *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 通訊協定標頭下。
7. 在目標應用程式中啟用 Proxy 通訊協定支援。
相關內容
- 已提問 2 年前
- 已提問 1 年前
- AWS 官方已更新 2 年前