Application Load Balancer (ALB) を使用してネットワークトラフィックを転送する場合、X-Forwarded-Forヘッダーを使用してクライアントのIPアドレスを保持できます。
X-Forwarded-Forの仕組み
HTTPおよびHTTPSリスナーは、X-Forwarded-Forヘッダーをサポートしています。 X-Forwarded-ForヘッダーからクライアントIPアドレスを取得するようにバックエンドサーバーを設定できます。
X-Forwarded-Forのフォーマット:
X-Forwarded-For: <Client IP address, IP address of Proxy Server 1, IP address of Proxy Server 2, ...>
したがって、X − Forwarded − Forヘッダ内で搬送される左端のIPアドレスは、クライアントIPアドレスである。
手順
手順1: リスナーがX-Forwarded-Forヘッダーを使用してクライアントIPアドレスを保持するかどうかを確認する
ALB コンソールにログインします。
上部のナビゲーションバーで、ALBインスタンスがデプロイされているリージョンを選択します。
[インスタンス] ページで、管理するインスタンスのIDをクリックします。
インスタンスの詳細ページで、[リスナー] タブをクリックし、管理するリスナーのIDをクリックします。
リスナーの詳細ページで、[HTTPヘッダーの追加] に [X-Forwarded-Forを追加してクライアントIPを取得する] オプションが含まれているかどうかを確認します。
説明デフォルトでは、ALBはX-Forwarded-Forヘッダーを使用してクライアントIPアドレスを保持します。 この機能は無効にできません。
手順2: バックエンドサーバーの設定
次の手順は、バックエンドサーバーの設定方法を示しています。 使用するバックエンドサーバーのタイプに基づいて手順を選択します。
NGINXサーバーの構成
この例では、CentOS 7.9オペレーティングシステムとNGINX 1.20.1が使用されています。 使用する環境に基づいて設定を調整します。
nginxサーバーで
NGINX-V | grep http_realip_module
コマンドを実行し、http_realip_moduleモジュールがNGINXサーバーにインストールされているかどうかを確認します。 NGINXサーバーはhttp_realip_moduleモジュールを使用してX-Forwarded-Forの値を解析します。-- with-http_realip_module
が出力に含まれている場合は、http_realip_moduleがNGINXサーバーにインストールされていることを示し、次の手順に進むことができます。説明NGINX 1.0.4は2011年にリリースされ、後にhttp_realip_moduleモジュールをサポートしています。 NGINXバージョンが1.0.4より前の場合は、データをバックアップして新しいバージョンにアップグレードすることを推奨します。
NGINXサーバーにhttp_realip_moduleモジュールがインストールされていない場合は、NGINXを再度コンパイルしてインストールし、http_realip_moduleをインストールします。 NGINXのインストールと管理には、YUMなどのパッケージマネージャを使用することを推奨します。 パケットマネージャはプロセスを簡素化します。
NGINX設定ファイルを変更して保存します。 次のコードブロックは、例を示しています。
nginx -t
コマンドを実行して、設定ファイルのパス (デフォルトでは/etc/nginx/nginx.conf
) を照会します。 パスは、使用する環境によって異なる場合があります。http { # Set the variable $http_x_forwarded_for, which is used to record the value of X-Forwarded-For. log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ... }
sudo nginx -s reload
コマンドを実行し、NGINX設定ファイルをリロードします。
Apacheサーバーの設定
この例では、CentOS 7.9オペレーティングシステムとApache 2.4.6が使用されています。 使用する環境に基づいて設定を調整します。
Apacheサーバーで
httpd -M | grep remoteip_module
コマンドを実行し、remoteip_moduleがApacheサーバーにインストールされているかどうかを確認します。 Apacheはremoteip_moduleを使用してX-Forwarded-Forの値を解析します。remoteip_module (shared)
が出力に含まれている場合は、モジュールがApacheサーバーにインストールされていることを示し、次の手順に進むことができます。説明2012年にリリースされたApache 2.4.0は、後にremoteip_moduleモジュールをサポートしています。 Apacheのバージョンが2.4.0より前の場合は、データをバックアップして新しいバージョンにアップグレードすることを推奨します。
remoteip_moduleがApacheサーバーにインストールされていない場合は、Apacheを再度コンパイルしてインストールし、remoteip_moduleをインストールします。 Apacheのインストールと管理には、YUMなどのパッケージマネージャーを使用することを推奨します。 パケットマネージャはプロセスを簡素化します。
Apache設定ファイルを変更して保存します。 次のコードブロックは、例を示しています。 設定ファイルのデフォルトパスは
/etc/httpd/conf/httpd.conf
です。 パスは、使用する環境によって異なる場合があります。# ... <IfModule log_config_module> # Add the LogFormat directive %{X-Forwarded-For}i, which is used to record the information about X-Forwarded-For. LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common #... </IfModule> # ...
sudo systemctl restart httpd
コマンドを実行してApacheを再起動します。
IISサーバーの構成
この例では、Windows Server 2016オペレーティングシステムが使用されています。 使用する環境に基づいて設定を調整します。
F5XForwardedForファイルをダウンロードして解凍します。
F5XFFHttpModule.dll
およびF5XFFHttpModule.ini
ファイルをx86\
またはx64
ディレクトリからIISサーバー上のディレクトリにコピーします。 IISプロセスにディレクトリに対する読み取りおよび書き込み権限があることを確認します。サーバーマネージャーでIISマネージャーを開きます。
IISサーバーを選択し、[モジュール] をダブルクリックします。
[ネイティブモジュールの設定] をクリックし、表示されるダイアログボックスで [登録] をクリックします。
ダウンロードしたを追加します。dllファイル。
ファイル名を入力してパスを選択し、[OK] をクリックします。
登録するモジュールが自動的に選択されます。 [OK] をクリックします。
IIS Managerのホームページに戻り、[Logging] をダブルクリックします。
X-Forwarded-For
に関する情報を記録するようにログ形式を設定します。[フィールドの選択] をクリックします。
左下隅の [フィールドの追加] をクリックし、次のフィールドを追加して、[OK] をクリックします。
右側の [操作] ペインで [適用] をクリックします。
IISサーバーを再起動し、設定が有効になるまで待ちます。
ステップ3: バックエンドサーバーがクライアントIPアドレスを取得できるかどうかをテストする
次の手順は、テストの実行方法を示しています。 使用するバックエンドサーバーのタイプに基づいて手順を選択します。
NGINXサーバー
NGINXサーバーを使用する場合は、NGINXログをチェックして、バックエンドサーバーがクライアントIPアドレスを取得できるかどうかを判断できます。
NGINXログのデフォルトパスは /var/log/nginx/access.log
です。
各ログエントリでは、$http_x_forwarded_for
変数の左端のIPアドレスがクライアントIPアドレスです。
Apacheサーバー
Apacheサーバーを使用している場合は、Apacheログをチェックして、バックエンドサーバーがクライアントIPアドレスを取得できるかどうかを判断できます。
Apacheログのデフォルトパスは /var/log/httpd/access_log
です。
各ログエントリでは、%{X-Forwarded-For}i
変数の左端のIPアドレスがクライアントIPアドレスです。
IISサーバー
IISサーバーを使用する場合は、IISログをチェックして、バックエンドサーバーがクライアントIPアドレスを取得できるかどうかを判断できます。
ログモジュールでログファイルへのパスを見つけることができます。
各ログエントリでは、X-Forwarded-For
の左端のIPアドレスがクライアントIPアドレスです。
よくある質問
100で始まるIPアドレスがバックエンドECSインスタンスに頻繁にアクセスするのはなぜですか。
ALBは、システムサーバーのプライベートIPアドレスを使用して、外部リクエストをバックエンドECSインスタンスに転送します。 ALBはECSインスタンスにもアクセスしてヘルスチェックを実行し、サービスの可用性を監視します。
ALBのシステムCIDRブロックは100.64.0.0/10で、Alibaba Cloudによって予約されています。 セキュリティの問題を防ぐために、このCIDRブロックは他のネットワーク要素に割り当てられません。 その結果、バックエンドECSインスタンスは、100で始まるIPアドレスによってアクセスされます。
サービスの可用性を確保するために、これらのIPアドレスからすべてのバックエンドサーバーへのアクセスを許可するセキュリティルールを追加することを推奨します。
Web Application Firewall (WAF) 、Content Delivery Network (CDN) 、またはGlobal Accelerator (GA) と一緒に使用する場合、ALBはどのようにクライアントIPアドレスを保持しますか。
リクエストがALBに到達する前にWAF、CDN、またはGAによってフィルタリングされる場合、X-Forwarded-Forヘッダーを使用してクライアントのIPアドレスを保持できます。 WAF、CDN、およびGAは、デフォルトでX-Forwarded-Forヘッダーをバックエンドサーバーに渡すことができます。 追加の設定は必要ありません。
サービスのセキュリティを損なう可能性のあるX-Forwarded-Forスプーフィングを防止する場合は、ヘッダーを指定してクライアントIPアドレスを記録できます。 たとえば、リクエストがクライアント、CDN、WAF、ALB、およびECSを経由し、CDNがAli-Cdn-Real-Ipヘッダーをバックエンドサーバーに渡す場合、Ali-Cdn-Real-Ipを有効にしてクライアントのIPアドレスを記録し、http$ Ali_Cdn_Real_Ip変数をNGINX設定ファイルに追加できます。 $http_Ali_Cdn_Real_Ipによって記録されたIPアドレスは、クライアントIPアドレスです。
システムのセキュリティを向上させるために、次の対策を講じることもできます。
X-Forwarded-Forヘッダーの認証: 無効または信頼できないX-Forwarded-Forヘッダーを含むリクエストをバックエンドサーバーで除外できるようにします。 X-Forwarded-Forヘッダーの形式とIPアドレスを確認して、そのヘッダーが有効で信頼できるかどうかを確認できます。
ファイアウォールとアクセス制御リスト (ACL) の有効化: ALBとバックエンドサーバーの間にファイアウォールとACLをデプロイして、X-Forwarded-Forヘッダーを操作する可能性のある悪意のあるリクエストを除外します。
SSL/TLS暗号化を有効にする: SSL/TLS暗号化を有効にして、X-Forward-Forヘッダーの送信を含むデータ送信を暗号化します。 この対策により、中間者 (MITM) 攻撃やデータの改ざんが防止されます。
Container Service for Kubernetes (ACK) クラスターにデプロイされた場合、ALBはどのようにクライアントIPアドレスを保持しますか。
ALBは、ACKクラスターにデプロイされるときにクライアントIPアドレスを保持できます。 クライアントIP保存は、異なる方法で実装されてもよい。 詳細については、「クライアントの実際のIPアドレスを取得するようにポッドを設定する方法」をご参照ください。
関連ドキュメント
ALB、Classic Load Balancer (CLB) 、およびNetwork Load Balancer (NLB) は、クライアントIPアドレスを保持するために異なる方法を使用します。
CLBのレイヤー7リスナーは、X-Forwarded-Forヘッダーを使用してクライアントIPアドレスを保持します。 詳細については、「レイヤー7リスナーを有効にしてクライアントIPアドレスを保持する」をご参照ください。
CLBのレイヤー4リスナーは、クライアントIPアドレスを直接保持するか、プロキシプロトコルを使用してクライアントIPアドレスを保持できます。 詳細については、「Enable Layer 4 listeners to preserve client IP addresses」をご参照ください。
NLBは、バックエンドサーバーグループのクライアントIP保持機能またはProxyプロトコルを使用して、クライアントIPアドレスを保持します。 詳細については、「クライアントIPアドレスの取得」をご参照ください。