ELB の背後にあるウェブサーバーのログでクライアント IP アドレスをキャプチャするにはどうすればよいですか?
ウェブサーバーで 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 をアクティブ化します。手順については、次の解決策の代わりに、「Proxy Protocol の有効化」を参照してください。
解決方法
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] (リッスン) 行を [*注: これは編集後に置き換えられるプレースホルダーコンテンツです*] に変更します。
###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 ウェブサーバーのアクセスログを開きます。アクセスログの場所は設定に応じて異なります。
6. クライアント IP アドレスが Proxy Protocol ヘッダーに記録されていることを確認します。
7. ターゲットアプリケーションで Proxy Protocol のサポートをアクティブ化します。

関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 7年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前