apache ProxyPass: come preservare indirizzo IP originale
Domanda
Stiamo usando ProxyPass per reindirizzare tutti "/ r" richieste a JBoss sulla porta 18080 nel seguente modo:
ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/
Ma, che provoca l'indirizzo IP registrato nel log di accesso di JBoss come "127.0.0.1". C'è qualcuno che sa come possiamo preservare la IP originale da cui la richiesta è venuto in HttpServletRequest? Vogliamo acesss dalla richiesta servlet JBoss in doGet ()
Soluzione
È possibile ottenere l'host originale da X-Forwarded-For campo di intestazione .
Altri suggerimenti
La risposta di JasonW va bene. Ma dal momento che apache httpd 2.4.6 c'è un'alternativa: mod_remoteip
Tutto ciò che dovete fare è:
- Può essere è necessario installare il pacchetto mod_remoteip
-
Attiva il modulo:
LoadModule remoteip_module modules/mod_remoteip.so
-
Aggiungere la seguente al vostro configurazione di Apache httpd. Si noti che è necessario aggiungere questa riga non nella configurazione del server proxy. È necessario aggiungere questo alla configurazione del server proxy di destinazione httpd (il server dietro il proxy):
RemoteIPHeader X-Forwarded-For
http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html per maggiori informazioni e più opzioni.
Questo ha una spiegazione più elegante e più di un possibili soluzioni. http://kasunh.wordpress.com/2011 / 10/11 / preservando-remote-IPHost-while-proxy /
Il post descrive come utilizzare uno popolare e uno meno noti moduli Apache preservare host / ip mentre in una configurazione che coinvolge proxy.
Utilizza il modulo mod_rpaf, installare e attivare nel server back-end e aggiungere seguenti direttive di configurazione del modulo. RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
(2017 edit) posizione attuale di mod_rpaf: https://github.com/gnif/mod_rpaf
Se avete la possibilità di farlo, mi consiglia di utilizzare entrambi i mod-jk o mod-proxy-AJP per passare le richieste da Apache a JBoss. Il protocollo di AJP è molto più efficiente rispetto all'utilizzo di richieste proxy HTTP e come un beneficio, JBoss vedrà la richiesta come proveniente dal client originale e non Apache.
Se si utilizza Apache proxy inverso per servire un app in esecuzione su una porta localhost è necessario aggiungere una posizione per il vostro vhost.
<Location />
ProxyPass http://localhost:1339/ retry=0
ProxyPassReverse http://localhost:1339/
ProxyPreserveHost On
ProxyErrorOverride Off
</Location>
Per ottenere l'indirizzo IP hanno 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, o l'uso req.ip o req.headers [ 'x-inoltrato-for']