2015年1月17日土曜日

aipo7とx-forwarded-for via nginx

数年に一度グループウェアを入れてくれというリクエストがあって、
今回はaipo7っていうのがあるらしいから、それでどうだということで・・・。
(あ、blogのタイトルに反してインストール先はUbuntuなのだが)

でこいつは、デフォルトインストールでport 81にtomcatが貼り付くのだけれど
聞くところによるとS◯ftBank系のキャリアではport 80/443は通るけど
port 81なんて遮断されてるらしい。まぁさもありなんなので
nginxでリバースプロキシさせることにした。
(なお、nginxはx-forwarded-forをつけて接続するように設定している。)

ところが、nginxのリバースプロキシの後ろに繋がれたaipo7の
イベント履歴でリモートIPがプロキシ自身のIPになってしまうのは管理上
(あるいは精神衛生上)よろしくないので調べてみた。
そして、どうせ忘れるのでメモ代わりに書いておく。

tomcat7ならRemoteIpFilterというのが使えるのだが、tomcat6にはそんなものはないので、RemoteIpValveで対応する。

tomcat/conf/server.xmlの末尾に
<Host name="localhost"  appBase="webapps" 〜で始まるエントリーがある。
このエントリーの最後に
<!-- valve start -->
        <Valve className="org.apache.catalina.valves.RemoteIpValve"
            remoteIpHeader="x-forwarded-for"
            protocolHeader="x-forwarded-proto"
            internalProxies="10\.10\.2\.27" />

        <!-- Access log processes all example.
         Documentation at: /docs/config/valve.html
         Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            rotatable="false"
            prefix="localhost_access_log"
            suffix=".txt"
            requestAttributesEnabled="true"
            pattern="combined" />
<!-- valve end -->
      </Host>
    </Engine>
  </Service>
</Server>
となるように追加する。(追加するのは valve startからvalve endの部分だ)
上の例ではInternal proxyのIPアドレスが 10.10.2.27になっているので、
それぞれの事例に合わせて直すこと。但しピリオドは正規表現的にバックスラッシュで
エスケープすること。
複数書きたければ
internalProxies="192\.168\.0\.10|192\.168\.0\.11"
のように書ける。