web-dev-qa-db-fra.com

apache ProxyPass: comment conserver l'adresse IP d'origine

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 sous le nom "127.0.0.1". Est-ce que quelqu'un sait comment pouvons-nous conserver l'adresse IP d'origine d'où la demande est venue dans HttpServletRequest? Nous voulons accéder à la requête de servlet de jboss dans doGet ()

35
ashweta

Vous pouvez obtenir l'hôte d'origine à partir du champ X-Forwarded-For header.

27
andri

La réponse de JasonW est bien. Mais depuis Apache httpd 2.4.6, il existe une alternative: mod_remoteip

Tout ce que vous devez faire c'est:

  1. Peut-être que vous devez installer le paquet mod_remoteip
  2. Activer le module:

    LoadModule remoteip_module modules/mod_remoteip.so
    
  3. Ajoutez ce qui suit à votre configuration Apache httpd. Notez que vous devez ajouter cette ligne not à la configuration du serveur proxy. Vous devez ajouter ceci à la configuration du serveur proxy cible 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.

25
Steffen

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/

Cet article explique comment utiliser un module Apache populaire et un module moins connu pour préserver Host/ip dans une configuration impliquant un proxy.

Utilisez le module mod_rpaf, installez-le, activez-le sur le serveur principal et ajoutez les directives suivantes dans la configuration du module . RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 

(2017 edit) Emplacement actuel de mod_rpaf: https://github.com/gnif/mod_rpaf

12
JasonW

Si vous en avez la possibilité, je vous recommanderais d'utiliser mod-jk ou mod-proxy-ajp pour transmettre les requêtes d'Apache à JBoss. Le protocole AJP est beaucoup plus efficace que l'utilisation de demandes de proxy HTTP. JBoss considérera que la demande provient du client d'origine et non d'Apache.

9
Jason Fritcher

Si vous utilisez le proxy inverse Apache pour desservir une application exécutée 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 les 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 utilisez soit req.ip, soit req.headers ['x-forwarded-for']

1
Tarun Gupta