Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
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 のサポートをアクティブ化します。
- 言語
- 日本語

関連するコンテンツ
- 質問済み 8年前