ELB の背後にある EC2 にいくつかの PHP サーバーがあります。サーバーに接続しているクライアントの IP アドレスによってロケール/地域を特定したいと考えています。問題は、PHP サーバーが ELB の IP アドレスしか認識しないことです。ELB を通過したクライアントの IP アドレスを確認したいと考えています。
5 に答える
AWS docsによると、ELB は元のクライアント IP アドレスを保持する「X-Forwarded-For」HTTP ヘッダーを設定する必要があります。
X-Forwarded-For 要求ヘッダーは、クライアントの IP アドレスを識別するのに役立ちます。ロード バランサーはクライアントとサーバー間のトラフィックをインターセプトするため、サーバー アクセス ログにはロード バランサーの IP アドレスのみが含まれます。クライアントの IP アドレスを確認するには、X-Forwarded-For 要求ヘッダーを使用します。
次の PHP コードを使用してアクセスできます (Apache を想定)。
$http_headers = apache_request_headers();
$original_ip = $http_headers["X-Forwarded-For"];
Apache を使用している場合は、mod_remoteipモジュールを参照してください。これは Apache 2.4 以降に含まれていますが、2.2 用のバックポートもあります。
このモジュールは、RemoteIPHeader ディレクティブで構成された要求ヘッダーで報告された useragent IP アドレスを使用して、接続のクライアント IP アドレスをオーバーライドします。
指示に従って置き換えられると、このオーバーライドされたユーザーエージェント IP アドレスは mod_authz_host Require ip 機能に使用され、mod_status によって報告され、mod_log_config %a および core %a フォーマット文字列によって記録されます。接続の基礎となるクライアント IP は、%{c}a フォーマット文字列で利用できます。
つまり、使用するヘッダー (X-Forwarded-For など) と信頼できる IP (ロードバランサーなど) を設定できます。信頼できる IP はヘッダーから削除され、最初の信頼できない IP が元のクライアントとして使用されます。この IP は、ロギング、ホスト認証など、他のモジュールで Apache によって内部的に使用されます。
mod_remoteip はスタック全体を処理し、アクセス ログが正しいことを確認するなど、PHP で XFF ヘッダーのみを処理するよりも便利です。
注: このモジュールの前身である mod_rpaf モジュールもあります。それははるかに限られています。たとえば、信頼できる IP 範囲を処理できません。ELB の IP を事前に知らないため、これが必要です。また、Varnish の前の ELB、Apache の前など、複数のホップを処理することもできません。rpaf モジュールをスキップして、代わりに remoteip を使用することをお勧めします。
これは大きな問題なので、これを試してください:D
<?php
if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$real_client_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$real_client_ip = $_SERVER["REMOTE_ADDR"];
}