apache ProxyPass: как сохранить исходный IP-адрес

Мы используем ProxyPass для перенаправления всех запросов «/r» на jboss через порт 18080 следующим образом:

ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/

Но это приводит к тому, что IP-адрес регистрируется в журнале доступа jboss как «127.0.0.1». Кто-нибудь знает, как мы можем сохранить исходный IP-адрес, с которого пришел запрос в HttpServletRequest? Мы хотим получить к нему доступ из запроса сервлета jboss в doGet()


person ashweta    schedule 17.04.2009    source источник


Ответы (5)


Вы можете получить исходный хост из поля заголовка X-Forwarded-For.

person andri    schedule 17.04.2009

Ответ JasonW в порядке. Но начиная с apache httpd 2.4.6 есть альтернатива: mod_remoteip

Все, что вы должны сделать, это:

  1. Возможно, вы должны установить пакет mod_remoteip

  2. Включите модуль:

    LoadModule remoteip_module modules/mod_remoteip.so
    
  3. Добавьте следующее в конфигурацию apache httpd. Обратите внимание, что вы должны добавить эту строку not в конфигурацию прокси-сервера. Вы должны добавить это в конфигурацию целевого прокси-сервера httpd (сервер за прокси):

    RemoteIPHeader X-Forwarded-For
    # replace IP with the remote server you trust
    RemoteIPInternalProxy 10.123.123.1/24
    

См. http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html для получения дополнительной информации и дополнительных параметров.

Предупреждение о безопасности! Делайте это только для тех прокси, которым вы доверяете. В противном случае кто-то может подделать свой IP.

person Steffen    schedule 11.06.2015
comment
Какую установку вы здесь описываете? Это apache за другим apache? Это применимо для jboss за apache? - person Pavel Niedoba; 22.08.2016
comment
да. Добавьте пакет mod_remoteip в apache за прокси-сервером. mod_remoteip заменяет IP-адрес прокси-сервера на значение X-Forward-For, которое содержит исходный IP-адрес веб-клиента. - person Steffen; 26.06.2017
comment
Не забывайте всегда использовать это с RemoteIPInternalProxy или аналогичной функцией безопасности. Создать поддельный IP обычно довольно сложно. Создать поддельный заголовок XFF не так уж и сложно. - person Nux; 21.07.2021

Этому есть более элегантное объяснение и несколько возможных решений. http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost-while-proxying/

В посте описывается, как использовать один популярный и один менее известный модуль Apache для сохранения host/ip при настройке, включающей проксирование.

Используйте модуль mod_rpaf, установите и включите его на внутреннем сервере и добавьте следующие директивы в конфигурацию модуля. RPAFenable Вкл
RPAFsethostname Вкл
RPAFproxy_ips 127.0.0.1

(редактирование 2017 г.) Текущее местоположение mod_rpaf: https://github.com/gnif/mod_rpaf

person JasonW    schedule 26.11.2011
comment
Будет лучше, если вы подведете итог, о чем ссылка, и/или процитируете наиболее важную часть. В противном случае это выглядит так, как будто вы рассылаете спам. - person random; 26.11.2011
comment
RPAF также может обмануть сайт, заставив его думать, что к нему обращаются через HTTPS, для прокси-серверов с терминацией ssl. - person Quentin Skousen; 03.11.2015

Если у вас есть такая возможность, я бы рекомендовал использовать либо mod-jk, либо mod-proxy-ajp для передачи запросов от Apache к JBoss. Протокол AJP гораздо более эффективен по сравнению с использованием запросов HTTP-прокси, и в качестве преимущества JBoss будет видеть запрос как исходящий от исходного клиента, а не от Apache.

person Jason Fritcher    schedule 17.04.2009

Если вы используете обратный прокси-сервер Apache для обслуживания приложения, работающего на порту локального хоста, вы должны добавить местоположение на свой виртуальный хост.

<Location />            
   ProxyPass http://localhost:1339/ retry=0
   ProxyPassReverse http://localhost:1339/
   ProxyPreserveHost On
   ProxyErrorOverride Off
</Location>

Чтобы получить IP-адрес, есть следующие варианты

console.log(">>>", req.ip);// this works fine for me returned a valid ip address 
console.log(">>>", req.headers['x-forwarded-for'] );// returned a valid IP address 
console.log(">>>", req.headers['X-Real-IP'] ); // did not work returned undefined 
console.log(">>>", req.connection.remoteAddress );// returned the loopback IP address 

Так что либо используйте req.ip, либо req.headers['x-forwarded-for']

person Tarun Gupta    schedule 16.01.2018
comment
Что делает тег местоположения? - person Kapil; 12.06.2018
comment
ProxyPreserveHost On помог мне. Я не знал, что вы можете вставить тег местоположения, чтобы повлиять на обратный прокси-сервер в зависимости от местоположения. Спасибо. - person Israelm; 10.09.2019