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

StackOverflow https://stackoverflow.com/questions/760283

  •  09-09-2019
  •  | 
  •  

Вопрос

Мы используем 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().

Это было полезно?

Решение

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

Другие советы

Ответ 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 Вкл.
RPAFsethostname Вкл.
RPAFproxy_ips 127.0.0.1

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

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

Если вы используете обратный прокси-сервер 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']

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top