apache ProxyPass: como preservar endereço IP original
Pergunta
Estamos usando ProxyPass para redirecionar todas as solicitações "/ r" para o JBoss na porta 18080 da seguinte forma:
ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/
Mas, isso faz com que o endereço IP registrado no log de acesso do jboss como "127.0.0.1". Será que alguém sabe como podemos preservar o IP original do que o pedido veio em HttpServletRequest? Queremos acesss-lo do pedido servlet jboss em doGet ()
Solução
Você pode obter o host original de X-Forwarded-For campo de cabeçalho .
Outras dicas
A resposta de JasonW é bom. Mas desde apache httpd 2.4.6 existe uma alternativa: mod_remoteip
Tudo o que você deve fazer é:
- Pode ser que você deve instalar o pacote mod_remoteip
-
Ativar o módulo:
LoadModule remoteip_module modules/mod_remoteip.so
-
Adicione o seguinte ao seu apache httpd configuração. Observe que você deve adicionar esta linha não para a configuração do servidor proxy. Você deve adicionar isso para a configuração do servidor de destino httpd procuração (o servidor atrás do proxy):
RemoteIPHeader X-Forwarded-For
Veja a http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html para mais informações e mais opções.
Isto tem uma explicação mais elegante e mais de soluções possíveis. http://kasunh.wordpress.com/2011 / 10/11 / preservando-remote-ipHost-enquanto-proxy /
O post descreve como usar um popular e um módulos do Apache menos conhecidos para preservar host / ip enquanto em uma configuração envolvendo proxy.
Use o módulo mod_rpaf, instalar e ativá-lo no servidor de back-end e adicionar seguintes diretrizes na configuração do módulo. RPAFenable Em
RPAFsethostname Em
RPAFproxy_ips 127.0.0.1
(2017 edit) localização atual de mod_rpaf: https://github.com/gnif/mod_rpaf
Se você tem a capacidade de fazê-lo, eu recomendaria usando mod-jk ou mod-proxy-AJP para passar solicitações do Apache para JBoss. O protocolo AJP é muito mais eficiente em comparação ao uso HTTP pedidos de proxy e como um benefício, JBoss verá o pedido como provenientes do cliente original e não Apache.
Se você estiver usando Apache proxy reverso para servir um aplicativo executado em uma porta localhost você deve adicionar um local para o seu vhost.
<Location />
ProxyPass http://localhost:1339/ retry=0
ProxyPassReverse http://localhost:1339/
ProxyPreserveHost On
ProxyErrorOverride Off
</Location>
Para obter o endereço IP têm as seguintes opções
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
Assim, ou o uso req.ip ou req.headers [ 'x encaminhadas-para']