apache ProxyPass: come conservare l’indirizzo IP originale

Stiamo utilizzando ProxyPass per redirect tutte le richieste “/ r” su jboss sulla porta 18080 come segue:

ProxyPreserveHost on ProxyPass /r http://localhost:18080/redirectService/ ProxyPassReverse /r http://localhost:18080/redirectService/ 

Ma questo fa sì che l’indirizzo IP registrato nel log di accesso di jboss sia “127.0.0.1”. Qualcuno sa come possiamo conservare l’IP originale da dove è arrivata la richiesta in HttpServletRequest? Vogliamo accedervi dalla richiesta servlet jboss in doGet ()

È ansible ottenere l’host originale dal campo dell’intestazione X-Forwarded-For .

La risposta di JasonW va bene. Ma poiché apache httpd 2.4.6 esiste un’alternativa: mod_remoteip

Tutto ciò che devi fare è:

  1. Potrebbe essere necessario installare il pacchetto mod_remoteip
  2. Abilita il modulo:

     LoadModule remoteip_module modules/mod_remoteip.so 
  3. Aggiungi quanto segue alla tua configurazione httpd di apache. Si noti che è necessario aggiungere questa riga non nella configurazione del server proxy. È necessario aggiungerlo alla configurazione del server httpd di destinazione del proxy (il server dietro il proxy):

     RemoteIPHeader X-Forwarded-For 

Vedi su http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html per ulteriori informazioni e altre opzioni.

Questo ha una spiegazione più elegante e più di una ansible soluzione. http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost-while-proxying/

Il post descrive come utilizzare un modulo Apache popolare e uno meno conosciuto per preservare l’host / ip in una configurazione che prevede il proxy.

Utilizzare il modulo mod_rpaf, installarlo e abilitarlo nel server di backend e aggiungere le seguenti direttive nella configurazione del modulo. RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1

(Modifica 2017) Posizione attuale di mod_rpaf: https://github.com/gnif/mod_rpaf

Se hai la possibilità di farlo, ti consiglio di utilizzare mod-jk o mod-proxy-ajp per passare richieste da Apache a JBoss. Il protocollo AJP è molto più efficiente rispetto all’utilizzo di richieste proxy HTTP e, come vantaggio, JBoss vedrà la richiesta come proveniente dal client originale e non da Apache.

Se si utilizza il proxy inverso Apache per servire un’app in esecuzione su una porta localhost, è necessario aggiungere una posizione al proprio vhost.

  ProxyPass http://localhost:1339/ retry=0 ProxyPassReverse http://localhost:1339/ ProxyPreserveHost On ProxyErrorOverride Off  

Per ottenere l’indirizzo IP hai le seguenti opzioni

 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 

Quindi usa req.ip o req.headers [‘x-forwarded-for’]