如何在 ELB 後面的 Web 伺服器日誌中擷取用戶端 IP 地址?

4 分的閱讀內容
0

對於 Web 伺服器我使用 Elastic Load Balancing (ELB),並且可以在 Web 伺服器存取日誌中看到我的負載平衡器的 IP 地址。如何改為擷取用戶端 IP 地址?

簡短描述

Web 伺服器存取日誌會擷取負載平衡器的 IP 地址,因為負載平衡器會建立與執行個體的連線。若要擷取 Web 伺服器存取日誌中用戶端的 IP 地址,請設定下列項目:

解決方法

與 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 通訊協定支援。


AWS 官方
AWS 官方已更新 2 年前