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 ()

5 ответов


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


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

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

  1. может быть, вы должны установить пакет mod_remoteip
  2. включить модуль:

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

    RemoteIPHeader X-Forwarded-For
    

см. в http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html Для больше информаций и больше вариантов.


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

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

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

(2017 edit) текущее местоположение mod_rpaf:https://github.com/gnif/mod_rpaf


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


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

<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.заголовки ['X-forwarded-for']