ProxyPreserveHost, кажется, мало что для меня делает

Я вижу, что многие в Интернете ссылаются на использование ProxyPreserveHost On, чтобы убедиться, что прокси-сервер получает имя хоста исходного вызывающего абонента. Я использую это, чтобы усилить безопасность моего веб-приложения (Java, Tomcat), тогда как было бы неплохо, если бы мои журналы показывали, где на самом деле находятся пользователи. Мои журналы Tomcat теперь показывают это довольно бесполезно:

127.0.0.1 - - [17/Mar/2013:06:32:13 +0100] "GET /webapp/frontend/app/partials/welcome.html HTTP/1.1" 200 54

Это моя конфигурация, которая явно не работает должным образом:

"/etc/apache2/sites-enabled/000-по умолчанию"

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass /webapp http://localhost:8080/webapp
ProxyPassReverse /webapp http://localhost:8080/webapp
RewriteEngine On
RewriteRule ^/$            /webapp/frontend/app/ [proxy]
RewriteRule ^/webapp/$     /webapp/frontend/app/ [redirect]
RewriteRule ^/webapp/app/$ /webapp/frontend/app/ [redirect]

(отсюда по умолчанию то, что было в 000-default)

Включенные модули:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod rewrite

Это Ubuntu 12.10 с Apache HTTPD 2.2.22.

Ваша помощь будет высоко оценена.


person Sander Verhagen    schedule 17.03.2013    source источник


Ответы (1)


Я предполагаю, что вас беспокоит то, что ваш журнал доступа все еще содержит 127.0.0.1 в поле клиента. На это не влияет ProxyPreserveHost; это IP-адрес конечной точки сети, подключенной к Apache. Для прокси-соединений с другого сервера это всегда будет localhost.

Кроме того, ProxyPreserveHost относится к сохранению заголовка Host, отправленного клиентом, а не к сохранению исходного IP-адреса клиента. Другими словами, речь идет об информации, идущей в неправильном направлении для ваших целей; он сохраняет имя вашего сервера, отправленное клиентом, а не IP-адрес клиента.

Я думаю, что ваш вопрос такой же, как этот вопрос. Я бы добавил дополнительное примечание, что вы можете регистрировать заголовок X-Forwarded-For в своих журналах, используя %{X-Forwarded-For}i в своей конфигурации CustomLog.

person rra    schedule 18.03.2013
comment
Спасибо. На вопрос, на который вы ссылаетесь, есть ответ, за который проголосовали, который ссылается на статью вне Stack Overflow, которая на самом деле ссылается на ProxyPreserveHost как на одно решение, поэтому разработчику не нужно в конечном итоге использовать заголовок X-Forwarded-For. Я такой разработчик, и мне было неудобно использовать что-то нестандартное. Сказав это, я погуглил X-Forwarded-For, и даже Википедия называет его стандартом де-факто, что намного лучше, чем я изначально думал (что-то специфичное для Apache HTTPD, что делает мое веб-приложение специфичным для Apache HTTPD). ). - person Sander Verhagen; 18.03.2013
comment
Я думаю, что связанный пост в блоге просто запутанно написан. Он говорит, что директиву можно использовать для сохранения удаленного хоста, а не удаленного IP-адреса. При нормальных обстоятельствах это были бы два разных имени (через DNS) для одного и того же, но я думаю, что под удаленным хостом он на самом деле подразумевает заголовок хоста, отправленный удаленным клиентом, а не имя хоста удаленного клиента. Но на самом деле, как написано, это довольно запутанно. - person rra; 18.03.2013
comment
Я пошел дальше и реализовал проверку возвращаемого значения HttpServletRequest.getHeader("X-Forwarded-For") в дополнение к моей существующей проверке WebAuthenticationDetails.getRemoteAddress(). Таким образом, мое приложение теперь X-Forwarded-For осведомлено. Не то, на что я надеялся изначально, но, тем не менее, работает. Спасибо. - person Sander Verhagen; 18.03.2013
comment
Согласно Steffen answer в упомянутом вопросе, модуль apache mod_remoteip кажется стандартом de faco если работает apache httpd 2.4.6 или выше. - person Brean; 09.11.2015