ELB の背後にあるウェブサーバーのログでクライアント IP アドレスをキャプチャするにはどうすればよいですか?
最終更新日: 2021 年 3 月 17 日
ウェブサーバーで Elastic Load Balancing (ELB) を使用しています。ロードバランサーの IP アドレスはウェブサーバーのアクセスログで確認できます。代わりにクライアント IP アドレスをキャプチャする方法を教えてください。
簡単な説明
ウェブサーバーのアクセスログにロードバランサーの IP アドレスがキャプチャされるのは、ロードバランサーがインスタンスへの接続を確立するためです。ウェブサーバーのアクセスログでクライアント IP アドレスをキャプチャするには、次のように設定します。
- HTTP/HTTPS リスナーを使用する Application Load Balancer と Classic Load Balancer の場合、X-Forwarded-For HTTP ヘッダーがクライアントの IP アドレスをキャプチャします。その後、これらの IP アドレスを記録するようにウェブサーバーのアクセスログを設定できます。
- TCP/SSL リスナーを使用する Classic Load Balancer の場合は、Proxy Protocol サポートを Classic Load Balancer とターゲットアプリケーションで有効にします。ロードバランサーとアプリケーションの両方で Proxy Protocol サポートを確実に設定します。
- Network Load Balancer の場合、クライアント IP アドレスをキャプチャするには、追加のウェブサーバー設定を行わずにインスタンス ID を使用してターゲットを登録します。手順については、次の解決方法の代わりに「ターゲットグループの属性」をご参照ください。
- IP アドレスのみをターゲットとして登録できる Network Load Balancer の場合、ロードバランサーでプロキシプロトコルバージョン 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 ウェブサーバーのアクセスログを開きます。アクセスログの場所は設定に応じて異なります。
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 のサポートを有効にします。