如何在 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 通訊協定支援。
相關內容
- 已提問 8 個月前lg...
- 已提問 10 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前