Apache ProxyPass :comment conserver l'adresse IP d'origine
Question
Nous utilisons ProxyPass pour rediriger toutes les requêtes "/r" vers jboss sur le port 18080 comme suit :
ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/
Mais cela provoque l'adresse IP enregistrée dans le journal d'accès de jboss comme "127.0.0.1".Est-ce que quelqu'un sait comment conserver l'adresse IP d'origine d'où la demande est venue dans HttpServletRequest ?Nous voulons y accéder à partir de la requête du servlet jboss dans doGet()
La solution
Vous pouvez obtenir l'hôte d'origine de X-Forwarded- champ d'en-tête .
Autres conseils
La réponse de JasonW est très bien. Mais depuis apache httpd 2.4.6 il existe une alternative: mod_remoteip
Tout ce que vous devez faire est:
- Peut être vous devez installer le paquet mod_remoteip
-
Activer le module:
LoadModule remoteip_module modules/mod_remoteip.so
-
Ajoutez ce qui suit à votre config apache httpd. Notez que vous devez ajouter cette ligne pas dans la configuration du serveur proxy. Vous devez ajouter à la configuration du serveur cible proxy httpd (le serveur derrière le proxy):
RemoteIPHeader X-Forwarded-For
Voir http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html pour plus d'informations et plus d'options.
Cela a une explication plus élégante et plus d’une solution possible. http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost-while-proxying/
L'article décrit comment utiliser un module Apache populaire et un module moins connu pour préserver l'hôte/l'adresse IP dans une configuration impliquant un proxy.
Utilisez le module mod_rpaf, installez-le et activez-le sur le serveur backend et ajoutez les directives suivantes dans la configuration du module.RPAFactiver activé
RPAFsethostname Activé
RPAFproxy_ips 127.0.0.1
(édition 2017) Emplacement actuel de mod_rpaf : https://github.com/gnif/mod_rpaf
Si vous avez la possibilité de le faire, je vous conseille d'utiliser soit mod-jk ou mod-proxy-AJP pour transmettre les demandes d'Apache vers JBoss. Le protocole AJP est beaucoup plus efficace par rapport à l'utilisation de requêtes proxy HTTP et comme un avantage, JBoss verra la demande en provenance du client d'origine et non Apache.
Si vous utilisez proxy inverse Apache pour servir une application en cours d'exécution sur un port localhost vous devez ajouter un emplacement à votre vhost.
<Location />
ProxyPass http://localhost:1339/ retry=0
ProxyPassReverse http://localhost:1339/
ProxyPreserveHost On
ProxyErrorOverride Off
</Location>
Pour obtenir l'adresse IP ont des options suivantes
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
Donc, soit l'utilisation req.ip ou req.headers [ 'x-du renvoi pour']