« Tomcat&Apacheでフェールオーバー | Main | svndumpfilter »

2007.06.06

Apache&Tomcatで連携時のRemoteIPアドレス

 Apache2.0+Tomcat5.5+mod_jkで連携している場合、HttpServletRequest#getRemoteAddr()で接続元のIPアドレスを取得することが可能です。

 しかしながら、Apache2.2+Tomcat5.5+mod_proxyで連携した場合、HttpServletRequest#getRemoteAddr()の戻り値が"0.0.0.0"になってしまうようです。で、どうも(リバース)プロキシの動きとしては、これはこれで正しい動きとなるようですが(通常、プロキシサーバを経由すると、リクエスト元のIPアドレスはプロキシサーバのアドレスになってしまうよう)。ただ、その場合、"127.0.0.1"ではなく、何故"0.0.0.0"になってしまうのか不明ですが。

 いろいろと調べてみると、RequestHeader中にHTTP_X_FORWARDED_FORといった感じでアクセス元のIPアドレスをセットすることもできるようなのですが、どうも上手くいかず(セットの仕方がわからない)。もっとも、この場合、getRemoteAddr()ではなくgetHeader(String)でアドレスを取得することになるので、アプリケーションの修正が必要になると言うのが難点ですが(デプロイ環境によって取得方法が変わってしまうというのも・・・)。

 Proxyの仕様ってことなら、Proxyを使用しなければアドレスを取得できるはず・・・ってことで、Apache2.2+Tomcat5.5+mod_jkの組み合わせも構築してみたのですが、やはり同様にアドレスの取得はできず("0.0.0.0"になってしまう)。

 Apache2.0からApache2.2にかけて、このあたりの実装が変わったんですかねぇ??(ソースを見ればわかるのでしょうが・・・) 設定等での回避方法はあるんでしょうか。

 で、さらに調べてみると、どうもApacheのlogファイルに出力されているIPアドレスがすべて0.0.0.0になってしまっている(!) こりゃProxy云々以前の問題だなぁ、ってことで調査すると、http://www.apachelounge.com/forum/viewtopic.php?p=7464に同様の現象(リンク先は元々はWAMPに関してですが、Apacheのバージョンとしては2.2.4のようです)に関する話がありました。それによると、Windows2000の環境では既知の問題(コンパイル環境にもよるとは思いますが)で、Win32DisableAcceptExをhttpd.confの任意のところに追記すればOKとのこと。
 ってことで、LoadModuleの羅列のすぐ次にWin32DisableAcceptExを追記すると、問題なくリモートのIPアドレスを取得できるようになりました。また、(LANの中だからか)プロキシサーバのアドレスではなく、リクエスト元の端末のIPアドレスを取得できました。なお、設定が有効となった場合、コンソール等に

[notice] Disabled use of AcceptEx() WinSock2 API

といったメッセージが出力されます。

 ちなみに、Apache2.2 MPM winntのドキュメントによると、Win32DisableAcceptExディレクティブは、

AcceptEx() は Microsoft WinSock v2 API で、場合によっては BSD 形式の accept() API よりもよい性能を発揮します。 よく使われている Windows 製品の中で、特にウィルススキャナや VPN パッケージ の中には、バグが原因で AcceptEx() の適切な動作を妨げるものがあります。 以下のようなエラーに遭遇した場合は、このディレクティブを使用して AcceptEx() を使用しないようにしてください。

とのことです。

#まぁ、Tomcat側で接続元のIPアドレスを取得する必要がなければ気にすることはありませんが。

|

« Tomcat&Apacheでフェールオーバー | Main | svndumpfilter »

Java」カテゴリの記事

Subversion・Trac・etc.」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/15290148

Listed below are links to weblogs that reference Apache&Tomcatで連携時のRemoteIPアドレス:

« Tomcat&Apacheでフェールオーバー | Main | svndumpfilter »