Apache ProxyPass: cómo preservar la dirección IP original
Pregunta
Estamos utilizando ProxyPass para redirigir todas las "/ r" peticiones a JBoss en el puerto 18080 de la siguiente manera:
ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/
Pero, eso hace que la dirección IP registrada en el registro de acceso de JBoss como "127.0.0.1". ¿Alguien sabe cómo podemos preservar la IP original desde la que llegó la solicitud HttpServletRequest? Queremos acesss desde JBoss petición de servlet en doGet ()
Solución
Usted puede obtener el host original de X-reenviado-Para campo de cabecera .
Otros consejos
La respuesta de JasonW está muy bien. Pero desde httpd Apache 2.4.6 hay una alternativa: mod_remoteip
Todo lo que debe hacer es:
- Puede ser que usted debe instalar el paquete mod_remoteip
-
Habilitar el módulo:
LoadModule remoteip_module modules/mod_remoteip.so
-
Añadir lo siguiente a su configuración de Apache httpd. Tenga en cuenta que se debe añadir esta línea no en la configuración del servidor proxy. Debe añadir esto a la configuración del servidor proxy de destino httpd (el servidor detrás del proxy):
RemoteIPHeader X-Forwarded-For
Vea en http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html para más información y más opciones.
Esto tiene una explicación más elegante y más de las posibles soluciones. http://kasunh.wordpress.com/2011 / 10/11 / preservar-remote-IPHost-mientras-proxy /
El puesto se describe cómo utilizar uno popular y uno menor módulos Apache conocidos para preservar host / ip, mientras que en una configuración que implica proxy.
Utilice módulo mod_rpaf, instalar y activarlo en el servidor back-end y añadir siguientes directivas de configuración del módulo. En RPAFenable
En RPAFsethostname
RPAFproxy_ips 127.0.0.1
(2017 edición) Ubicación actual de mod_rpaf: https://github.com/gnif/mod_rpaf
Si usted tiene la capacidad para hacerlo, yo recomendaría usar ya sea mod-jk o mod-proxy-AJP para pasar peticiones de Apache a JBoss. El protocolo AJP es mucho más eficiente en comparación con el uso de solicitudes de proxy HTTP y como un beneficio, JBoss verá la petición como viniendo desde el cliente original y no Apache.
Si está utilizando Apache proxy inverso para servir una aplicación que se ejecuta en un puerto localhost debe agregar una ubicación en el host virtual.
<Location />
ProxyPass http://localhost:1339/ retry=0
ProxyPassReverse http://localhost:1339/
ProxyPreserveHost On
ProxyErrorOverride Off
</Location>
Para obtener la dirección IP tiene siguientes opciones
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
Así que, o uso req.ip o req.headers [ 'x-reenvío para']