2016-11-02 7 views
1

私は基礎データベースのデータを持つWebページを提供するJavaアプリケーションを作成しています。私はいくつかのIP制限に基づいてWebページへのアクセスを制限しています。基本的に、「Accepted」の範囲に入るIPはWebページにアクセスでき、この範囲外のIPはエラーページにリダイレクトされます。以下、私が使用していますページにアクセスしようとするユーザーのIPアドレスを取得するには:Apacheのプロキシによって隠されているHttpServletRequestオブジェクトのリモートIPアドレス

String userIPAddress = request.getRemoteAddr(); 

「要求」を私のHttpServletRequestオブジェクトです。

私は、このWebページがApache Webサーバーを介してプロキシされているという問題に取り組んでいます。

この場合、クライアントのIPアドレスが失われ、ファイアウォールのIPアドレスが使用されます。したがって、私がrequest.getRemoteAddr()にアクセスすると、顧客がどこからWebページにアクセスしようと試みても、同じIPが返されます。

直接IPアドレスを使用してWebページにアクセスすると、IPチェックがうまく動作します。この問題は、プロキシを介してアクセスするときに発生します。

クライアントの実際のIPアドレスにアクセスするためにプログラムで実行できることはありますか?あるいは、この情報を通過させるためにApache Webサーバーを介して行われ/変更されなければならないことがありますか?その場合は、より良いフォーラムになるなら、私はServer Faultに投稿することができます。

ご協力いただき誠にありがとうございます。

よろしくお願いいたします。

答えて

0

私はこれをプログラムで行うことはできないと思います。 Apache Webサーバーで何かを変更することさえできないと思います。

ファイアウォールが着信IPアドレスを偽装しているような音です。私は解決策があなたのファイアウォールの設定にあると思う。

0

ApacheプロキシでHTTPの代わりにAJPプロトコルを使用できます。

これは明らかにクライアントのIPアドレスを保持しています。誰にも理由がありますか?

使用:代わりの

ProxyPass /APPLICATION_NAME ajp://IP_ADDRESS:8009/APPLICATION_NAME 

:.confのプロキシファイルで

<Location "/APPLICATION_NAME"> 
    ProxyPass http://IP_ADDRESS:8080/APPLICATION_NAME 
    ProxyPassReverse http://IP_ADDRESS:8080/APPLICATION_NAME 
</Location> 

これにより、プロキシの実行中に上書きされることなく、クライアントからIPを取得できました。コードを変更する必要はありませんでした。

String userIPAddress = request.getRemoteAddr(); 
2

(例えば、ProxyPassディレクティブを使用して)リバースプロキシモードで動作し、Apacheのmod_proxy_httpは、いくつかのリクエストヘッダを追加します:ApacheのプロキシファイルでAJPに変更した後、次のように正しいIPアドレスが含まれていオリジンサーバに情報を渡すために、クライアントのIPアドレスを含むX-Forwarded-Forの1つが必要です。

元のリクエストにすでにこのヘッダーが含まれている場合(珍しいことではない)、ApacheはクライアントIPアドレスを既存の値に追加してカンマ+スペースで区切られたIPリストを取得しますアドレス。最後の(最も右の)IPアドレスは、常に最後のプロキシ(あなたのApache)に接続するIPアドレスです。つまり、テスト対象のIPアドレスです。

+0

これは非常に有用な情報です。 HTTPでProxyPassを使用する場合、X-Forwarded-Forヘッダーは自動的にインクルードされますか?あるいは、これを含めるためにApache内で何かを設定する必要がありますか? – MotoDave452

+2

デフォルトでは、 'request.getHeader(" X-FORWARDED-FOR ")'(またはそのようなもの、私はJavaの専門家ではありません:)を見てください) –

関連する問題