« 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


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

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