it-swarm.com.de

apache ProxyPass: wie die ursprüngliche IP-Adresse erhalten bleibt

Wir verwenden ProxyPass, um alle "/ r" -Anfragen wie folgt auf jboss an Port 18080 umzuleiten:

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

Dies bewirkt jedoch, dass die IP-Adresse im Zugriffsprotokoll von jboss als "127.0.0.1" protokolliert wird. Weiß jemand, wie wir die ursprüngliche IP-Adresse von HttpServletRequest erhalten können? Wir möchten es von JBoss Servlet Anfrage in doGet () zugreifen

35
ashweta

Sie können den ursprünglichen Host aus dem X-Forwarded-For Headerfeld erhalten.

27
andri

Die Antwort von JasonW ist in Ordnung. Aber seit Apache httpd 2.4.6 gibt es eine Alternative: mod_remoteip

Alles was Sie tun müssen, ist:

  1. Möglicherweise müssen Sie das mod_remoteip-Paket installieren
  2. Aktivieren Sie das Modul:

    LoadModule remoteip_module modules/mod_remoteip.so
    
  3. Fügen Sie Ihrer Apache-httpd-Konfiguration Folgendes hinzu. Beachten Sie, dass Sie diese Zeile not zur Konfiguration des Proxyservers hinzufügen müssen. Sie müssen fügen Sie dies der Konfiguration des Proxy-Ziel-httpd-Servers hinzu} (der Server hinter dem Proxy):

    RemoteIPHeader X-Forwarded-For
    

Weitere Informationen und Optionen finden Sie unter http://httpd.Apache.org/docs/trunk/mod/mod_remoteip.html .

25
Steffen

Dies hat eine elegantere Erklärung und mehr als eine mögliche Lösung. http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost-while-proxying/

In diesem Beitrag wird beschrieben, wie Sie ein beliebtes und ein weniger bekanntes Apache-Modul verwenden, um Host/IP in einem Setup mit Proxy-Funktion zu erhalten.

Verwenden Sie das Modul mod_rpaf, installieren und aktivieren Sie es auf dem Back-End-Server und fügen Sie der Direktive Konfiguration des Moduls folgende Anweisungen hinzu. RPAFenable On
RPAFsethostname Ein
RPAFproxy_ips 127.0.0.1 

(2017 edit) Aktueller Standort von mod_rpaf: https://github.com/gnif/mod_rpaf

12
JasonW

Wenn Sie dazu die Möglichkeit haben, würde ich empfehlen, entweder mod-jk oder mod-proxy-ajp zu verwenden, um Anforderungen von Apache an JBoss zu übergeben. Das AJP-Protokoll ist im Vergleich zur Verwendung von HTTP-Proxy-Anforderungen viel effizienter. Als Vorteil wird JBoss die Anfrage als vom ursprünglichen Client und nicht von Apache kommen sehen.

9
Jason Fritcher

Wenn Sie Apache Reverse Proxy zum Bereitstellen einer App verwenden, die auf einem localhost-Port ausgeführt wird, müssen Sie Ihrem vhost einen Ort hinzufügen.

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

Um die IP-Adresse zu erhalten, haben Sie folgende Optionen 

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 

Verwenden Sie also entweder req.ip oder req.headers ['x-forwarded-for']

1
Tarun Gupta