Назад | Перейти на главную страницу

Заставьте Tomcat использовать X-Real-IP

Я настраиваю nginx как обратный прокси перед Tomcat 7. Я добавил следующие строки в конфигурацию 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 (и записывать его в файлы журнала) без изменения веб-приложение?

Требуется добавить Valve в конфигурацию Tomcat:

<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;

Нашел этот вопрос через Google и хочу добавить комментарий к утвержденному ответу:

В соответствии с документация, по умолчанию этот клапан (RemoteIpValve) не влияет на значения, которые записываются в журнал доступа. Для того, чтобы в лог были записаны реальные IP, вам нужно добавить

requestAttributesEnabled="true"

к AccessLogValve также.

Я искал то же самое и нашел информацию, которая привела меня к следующему решению, исследуя сеть.

В твоем коте server.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: Компонент Valve

Еще один полезный пример конфигурации Tomcat: внутренние прокси можно разделить конвейером (|), поскольку принимает регулярное выражение.

<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"
   />

Дополнительные примеры см. документ кота

Вам необходимо установить mod_realip http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html (http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filter) или mod_rpaf на сервере apache.