web-dev-qa-db-ja.com

TomcatにX-Real-IPを使用させる

Tomcat 7の前でnginxをリバースプロキシとして構成しています。nginx構成に次の行を追加しました。

set_real_ip_from 127.0.0.1;
...
location / {
    proxy_pass http://Tomcat;
    proxy_set_header Host $Host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

しかし、それでも、Tomcatログに次の画像が表示されます。

127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=6C1B02376C5F748C509B28FC7CE416C9 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=0BBE0174C1F0E94FDF49610144E809D3 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=AD48005AD453F3A0BE46F1AC978F145D HTTP/1.0" 200 10571

TomcatにX-Real-IPヘッダーを使用するように強制する(そしてログファイルに書き込む)方法はありますか変更なしで Webアプリ?

8
Kerb

Tomcat構成でValveを追加する必要があります。

<Valve className="org.Apache.catalina.valves.RemoteIpValve"
               remoteIpHeader="X-Forwarded-For"
               requestAttributesEnabled="true"
               internalProxies="127\.0\.0\.1"  />

その後、Tomcatはnginxから渡されたヘッダーのディスパッチを開始します。

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
13
Kerb

グーグル経由でこの質問を見つけ、承認された回答にコメントを追加したい:

documentation によると、デフォルトでは、このバルブ(RemoteIpValve)はアクセスログに書き込まれる値に影響を与えません。ログで実際のIPを取得するには、追加する必要があります

requestAttributesEnabled="true"

accessLogValveにも。

4
yumaa

Tomcat設定のもう1つの便利な例:internalProxiesは、正規表現を受け入れるため、パイプライン(|)で区切ることができます。

<Valve
   className="org.Apache.catalina.valves.RemoteIpValve"
   internalProxies="192\.168\.10\.110|127\.0\.0\.1"
   remoteIpHeader="x-forwarded-for"
   proxiesHeader="x-forwarded-by"
   protocolHeader="x-forwarded-proto"
   />

その他の例については、 Tomcatドキュメント を参照してください

1
Hamedz

同じことを探していたところ、ネットを調査して次の解決策に導いてくれる情報が見つかりました。

Tomcatserver.xmlで、ロギングバルブパターンを編集して、受信ヘッダーから値を取得する必要があります。

あなたの

パターンを次のように変更します。

pattern="Remote User[ %{X-Forwarded-For}i %l %u %t ] Request[ &quot;%r&quot; ] Status Code[ %s ] Bytes[ %b ] Referer[ &quot;%{Referer}i&quot; ] Agent[ &quot;%{User-agent}i&quot; ] "

フルアクセスログの値は次のようになります。

      <Valve className="org.Apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="access_log." suffix=".txt"
               pattern="Remote User[ %{X-Forwarded-For}i %l %u %t ] Request[ &quot;%r&quot; ] 
               Status Code[ %s ] Bytes[ %b ] Referer[ &quot;%{Referer}i&quot; ] 
               Agent[ &quot;%{User-agent}i&quot; ] " />

これには、以下のNginx構成が伴います。

location / {
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_Host;
    proxy_intercept_errors on;
}

Tomcatのログバルブパターンの追加情報は、次の場所にあります。 Apache 7:The Valve Component

1

Mod_realipをインストールする必要があります http://httpd.Apache.org/docs/trunk/mod/mod_remoteip.htmlhttp://Tomcat.Apache.org/Tomcat- 7.0-doc/config/filter.html#Remote_IP_Filter )またはApacheサーバーのmod_rpaf。

0