ELB の背後にあるウェブサーバーのログでクライアント IP アドレスをキャプチャするにはどうすればよいですか?

最終更新日: 2021 年 3 月 17 日

ウェブサーバーで Elastic Load Balancing (ELB) を使用しています。ロードバランサーの IP アドレスはウェブサーバーのアクセスログで確認できます。代わりにクライアント IP アドレスをキャプチャする方法を教えてください。

簡単な説明

ウェブサーバーのアクセスログにロードバランサーの IP アドレスがキャプチャされるのは、ロードバランサーがインスタンスへの接続を確立するためです。ウェブサーバーのアクセスログでクライアント IP アドレスをキャプチャするには、次のように設定します。

解決方法

HTTP/HTTPS リスナーを使用する Application Load Balancer と Classic Load Balancer (Apache)

1.    テキストエディタを使用して Apache 設定ファイルを開きます。設定ファイルの場所は設定に応じて異なります。例えば、Amazon Linux および RHEL の場合は /etc/httpd/conf/httpd.confUbuntu の場合は /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 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 ウェブサーバーのアクセスログを開きます。アクセスログの場所は設定に応じて異なります。

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 設定ファイルに追加して Proxy Protocol サポートを有効にします。

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.    ターゲットアプリケーションで Proxy Protocol のサポートを有効にします。

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 サービスをリロードします。

例えば、Amazon Linux 2 または RHEL では、次のコマンドを実行します。

systemctl reload nginx

注: NGINX サービスをリロードするコマンドは、他のシステムでは異なります。NGINX をリロードするコマンドは、前のセクションの Apache サービスをリロードするコマンドに似ています。

5.    NGINX ウェブサーバーのアクセスログを開きます。アクセスログの場所は設定に応じて異なります。

6.    クライアント IP アドレスが Proxy Protocol ヘッダーに記録されていることを確認します。

7.    ターゲットアプリケーションで Proxy Protocol のサポートを有効にします。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?