Remote-IPs mit HAProxy

19

Ich teste ein neues Webserver-Setup, bei dem einige Probleme auftreten. Im Wesentlichen haben wir einen Webserver, auf dem der Code die Remote-IP für einige interessante Dinge verwendet, sowie einige Apache-Verzeichnisse, die bis zu bestimmten IP-Adressen (unserem Büro usw.) gesichert sind.

Wir haben dies jedoch gerade hinter ha_proxy eingeklinkt, damit wir uns ansehen können, wie wir weitere App-Server hinzufügen, aber jetzt wird die Remote-IP immer als Proxy-IP durchgestellt, nicht als der echte Remote-Benutzer. Dies bedeutet, dass wir nicht zu bestimmten Orten gelangen können und unsere App sich etwas seltsam verhält, wenn die Benutzer-IP wichtig ist.

Unsere Konfiguration ist wie folgt:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check
Neil Middleton
quelle

Antworten:

31

Zitiert aus dem HAProxy-Dokument unter haproxy.1wt.eu .

- Wenn die Anwendung die IP des ursprünglichen Clients protokollieren muss, verwenden Sie die
  Die Option "forwardfor" fügt einen "X-Forwarded-For" -Header mit dem hinzu
  IP-Adresse des ursprünglichen Kunden. Sie müssen auch "httpclose" verwenden, um dies sicherzustellen
  dass Sie jede Anfrage neu schreiben und nicht nur die erste von jeder
  Session:
        Option httpclose
        Option vorwärtsfür

Es wird angegeben, dass die Anwendung den X-Forwarded-For-HTTP-Header behandeln muss, um die Client-IP-Adresse zu kennen. Scheint der einzige Weg in Ihrem Fall zu sein.

Aktualisiert für HAProxy 1.4

Haproxy 1.4 hat einen neuen Modus mit der Option http-server-close eingeführt. Die Verbindung zum Server wurde weiterhin getrennt, der Client wird jedoch nach Möglichkeit weiterhin aufrechterhalten und verwendet. Bei den meisten Setups möchten Sie dies wahrscheinlich verwenden, da dies die Latenz auf dem einzelnen Teil Ihrer Verbindung mit hoher Latenz (zwischen Haproxy und dem Client) verringert.

   option http-server-close
   option forwardfor
Maxwell
quelle
2
Besser verwenden option forwardfor header X-Real-IPund reqidel ^X-Real-IP:, dies hört auf, IPs in Ihren Protokollen zu fälschen. FYI: X-Real-IPist der Standardheader für NginXdie Option ' set_real_ip_from.
Tino
In der Frage wird Nginx nicht erwähnt. X-Real-IP würde nicht funktionieren.
Rick Fletcher
1. Müssen diese beiden Optionen in der Frontend- oder Backend-Konfiguration eingestellt werden? (Weil sie hier nicht zu funktionieren scheinen) 2. Ist eine Konfiguration auch auf Tomcat-Ebene erforderlich?
Yglodt
6

Es gibt eine Möglichkeit, HAproxy neu zu kompilieren, um Tproxy einzuschließen, wodurch die Weiterleitung der Quelladresse ermöglicht wird.

Hier gibt es einen Blog-Beitrag dazu: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Ein paar Anmerkungen:

Der neueste Linux-Kernel (2.6.28-11-Server) unterstützt TProxy, so dass ein erneutes Kompilieren des Kernels nicht erforderlich ist.

Stellen Sie sicher, dass Sie die Server in Ihrer Webfarm mit einer Standard-Gateway-Adresse konfigurieren, die auf den HAProxy-Server verweist.

Geoff Dalgas
quelle
2

Verwende das rpaf-Apache-Modul http://stderr.net/apache/rpaf/ Ich weiß, dass dies ein alter Beitrag ist, aber es hat Tage gedauert, bis ich ihn gefunden habe. Damit wird jeder Anwendung die x-forwarded-for-ip angezeigt.

Shaggy63
quelle
1

Beachten Sie, dass Sie anscheinend überschreiben können, wie die Anwendung die Apache-Header ändert:

SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1

Dies funktioniert jedoch nicht für den Apache-Zugriff über "Zulassen von" usw.

Neil Middleton
quelle
Dies kann zu unvorhersehbaren Ergebnissen führen, wenn der Client einen vorhandenen X-Forwarded-ForHeader sendet, während die neue IP-Adresse durch ein Komma und ein Leerzeichen getrennt am Ende der vorhandenen Liste hinzugefügt wird. Ändern Sie das (.*)to, ([^ ]*)$um nur die letzte IP zu erhalten ... oder verwenden Sie mod_rpafoder mod_remoteipfür Apache 2.4 oder höher.
Ladadadada
1

HAProxy kann die ursprüngliche IP-Adresse nicht wie jeder andere Proxy an den realen Server weiterleiten.

Wenn Sie nur ein Problem mit einem Webserver haben, können Sie in den X-Forwarded-For-HTTP-Header schauen, der die Adresse des Clients enthalten sollte. Nun, das ist ziemlich anwendungs- / sprachspezifisch, aber schauen Sie sich dieses Beispiel in PHP an:

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

Wenn Sie auch die ursprüngliche Adresse protokollieren möchten, können Sie das LogFormat in httpd.conf so ändern, dass es ungefähr so ​​aussieht:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common

Thiagodrv
quelle
falsch kann man mit der option "forwardfor"
wittwerch am
Ja, und diese Option ist standardmäßig aktiviert, setzt jedoch den X-Forwarded-For-HTTP-Header. Was ich gesagt habe und wie es aussieht, fragte der Fragesteller tatsächlich nach der tatsächlichen Quelladresse des IP-Pakets
Thiagodrv
0

Nun, es scheint, dass die X-Weiterleitung für Ihr Setup nicht gut funktioniert. Gibt es für Sie einen besonderen Grund, bei Haproxy zu bleiben? Es scheint, dass IPVS für Ihre Bedürfnisse angemessener ist (ich verwende tatsächlich ldirector, das wiederum ipvs verwendet).

Schauen Sie sich an:

http://kb.linuxvirtualserver.org/wiki/IPVS

und

http://www.vergenet.net/linux/ldirectord/

Bei Verwendung von IPVS im Modus "IP-Tunneling" oder "Direktes Routing" wird die Client-Adresse beibehalten.

Thiagodrv
quelle
0

Versuchen Sie mod_extract_forwarded von http://www.openinfo.co.uk/apache/

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx

quelle
-1

Einfacher Weg mit Haproxy im Modus TCP und Nginx:

Sende-Proxy als Server-Option hinzufügen:

haproxy.conf:

.

.

listen ssl 0.0.0.0:443

Modus tcp

balance leastconn

Option httpchk GET / ping

Option Log-Health-Checks

server w1 192.168.1.1:443 send-proxy check check-ssl überprüfe keine

server w2 192.168.1.1:443 send-proxy check check-ssl überprüfe keine

.

.

Nginx benötigt ein Proxy-Protokoll

nginx.conf:

.

.

listen 192.168.1.1:443 ssl proxy_protocol;

.

.

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

Emilio Joel Macias Gomez
quelle