20

ELB の背後にある EC2 にいくつかの PHP サーバーがあります。サーバーに接続しているクライアントの IP アドレスによってロケール/地域を特定したいと考えています。問題は、PHP サーバーが ELB の IP アドレスしか認識しないことです。ELB を通過したクライアントの IP アドレスを確認したいと考えています。

4

5 に答える 5

24

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"];
于 2013-02-27T19:20:31.367 に答える
9

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 を使用することをお勧めします。

于 2014-03-12T14:21:18.177 に答える
2

これは大きな問題なので、これを試してください:D

   <?php 
       if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $real_client_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } else {
            $real_client_ip = $_SERVER["REMOTE_ADDR"];
        }
于 2014-01-17T11:44:24.210 に答える