Apacheがリバースプロキシ(Squidなど)の背後にある状況では、cgi環境変数REMOTE_ADDR
はクライアントではなくプロキシのアドレスを取得します。
ただし、プロキシはX-Forwarded-For
というヘッダーを設定して、クライアントの元のIPアドレスを含め、Apacheがそれを認識できるようにします。
問題は、すべてのWebアプリケーションが正しいアドレスを透過的に認識できるように、ApacheでREMOTE_ADDR
をX-Forwarded-For
ヘッダーの値に置き換えるにはどうすればよいかということです。
そのためにmod_rpafを使用できます。 http://stderr.net/Apache/rpaf/
リクエストが複数のプロキシを通過した場合、X-Forwarded-ForヘッダーにlistのIPアドレスが含まれる場合があることに注意してください。この場合、通常は左端のIPが必要です。これは、SetEnvIfを使用して抽出できます。
SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1
$ 1を使用して、XFFCLIENTIP環境変数を設定し、正規表現(括弧内)の最初のグループの内容を保持することに注意してください。
次に、環境変数の値を使用してヘッダーを設定できます(または、ログに実際のクライアントIPが含まれるようにApacheログ形式で使用します)。
現在、Apacheモジュールmod_remoteipがこれを行うための推奨される方法です。 rpafは確実に保守されておらず、問題を引き起こす可能性があります。
前述の mod_rpaf に加えて、 mod_extract_forwarded もこの機能を実行するようです。
mod_extract_forwarded
の利点の1つは、RHEL/CentOSサーバーでは [〜#〜] epel [〜#〜] から利用できるのに対し、mod_rpaf
では利用できないことです。
これらの2つのモジュールのどちらでも、プロキシサーバーのサブネット全体をホワイトリストに登録できないようです。そのため、CloudFlareの人々は独自のプラグインを作成しました。 mod_cloudflare これはnot他の2つのような汎用ツール。 CloudFlareサブネットのハードコードされたリストが含まれています。
はい、できます。
auto_prepend_file = "c:/prepend.php"
のようにPHP.iniにauto_prepend_fileを追加し、このファイルに次を追加します。
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
Apache幅RemoteIPHeader X-Real-IP
のMOD_REMOTEIPが必要です。
乾杯、
ギレマッハ
残念ながら、
この記事の執筆時点では、freshports.org、people.Apache.org、Gist.github.comのバックポートとフォークはいずれも機能していませんでした。これらはすべて、現在のバージョンの2.2または2.4と互換性のないApache httpd2.3の初期のアルファバージョンに基づいていました。
そのため、バックポートを調整してhttpd 2.2で実際に機能するものを作成しようとして何時間も時間を無駄にした後、httpd2.4に移行することにしました。 httpd 2.4内では、ロードバランサーに永続的なキープアライブ接続があり、それを使用してさまざまな実際のクライアントIPアドレスからバックエンドにリクエストをプロキシする場合でも、mod_remoteipはスムーズに機能します。他のモジュールがこの状況を処理できるかどうかはわかりません(同じ接続内の各要求でクライアントIPアドレスを変更します)。
この値はなりすましの可能性があることに注意してください。クロスサイトスクリプティングの結果を伴う実際の例については、 http://blog.c22.cc/2011/04/22/surveymonkey-ip-spoofing/ を参照してください。
モジュールmod_extract_forwardedをインストールし、MEFacceptパラメーターをallに設定できます。