it-swarm.com.de

Haproxy und Weiterleitung der Client-IP-Adresse an Server

Ich habe ein Problem mit HAproxy.

Ich verwende HAproxy als Load Balancer, der eingehende http-Anfragen an 5 Webserver verteilt. Normalerweise wird eine Client-Anfrage an Webserver mit der IP des Loadbalancers weitergeleitet. Aber ich brauche Client-IPs oder echte IPs, die etwas von Webservern anfordern. Weil wir die IPs des realen Clients protokollieren müssen.

Ich versuche, Client-IPs auf Webservern abzurufen, kann aber bisher keinen Erfolg haben. Ich sehe immer die IP des Load Balancers.

Ich benutze die Option x-forward-for, aber das Problem ist nicht gelöst. Danach fand ich eine andere Option "Quelle 0.0.0.0:80 usedrc clientip", aber ich bekam Fehler beim Versuch, HAproxy auszuführen, bei dem es um Kompilierungsanforderungen mit der Option USE_TPROXY des HAproxy geht. Ich habe es getan, ich kompiliere HAproxy mit der Option USE_TPROXY neu, ändere aber nichts. Was kann ich tun, um die IPs des echten Kunden zu lernen?.

Meine Linux-Kernel-Version ist 2.6.32-34. Ich meine, der Kernel unterstützt transparenten Proxy. und ich benutze UBUNTU 10.4 LTS

meine Konfigurationsdatei ist hier

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    (1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
        (2)source 0.0.0.0:80 usesrc clientip
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor header X-Client
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:xXx

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

(1) (2) Beim Testen von HAproxy habe ich eine dieser beiden Zeilen verwendet.

Hilft mir jemand, echte IPs der Clients zu erfahren, die von unseren Servern angefordert werden?

15
System

Ich habe dieses Problem gelöst. Vielleicht war es von Anfang an kein Problem. Ich habe die Google-Suche durchgeführt, als ich auf dieses Problem gestoßen bin, und das habe ich gesehen

option forwardfor

zeile, um in der Datei haproxy.cfg und auch andere Optionen zu verwenden. Ich habe diese Optionen ausprobiert, einschließlich des Neukompilierens des Haproxys ... Das eigentliche Problem beim Erlernen der IP-Adressen von echten Clients auf Webservern stammt jedoch nicht von HAproxy. Es geht darum, Header durch Serverskripte zu lesen. In unserem Fall ist diese Skriptsprache PHP.

Ich versuche, die IPs des Clients mit diesen Befehlen zu lernen

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

und diese Befehle zeigen die IP des Loadbalancers an. Das ist richtig, aber das wird nicht von mir erwartet. Trotz der Option forwardfor gaben mir diese Befehle die IP des Loadbalancers

Mit der Option forwardfor aktivieren wir HAproxy, um den x-forwarded-for-Header in die an unsere Webserver gesendeten Clientanforderungen einzufügen. HAproxy hat dieses Feld in den Header gestellt, aber ich habe dies ignoriert. Heute habe ich festgestellt, dass dies ein Header-Feld ist und ich muss diesen Header so lesen

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

Mit diesem Befehl habe ich die IP-Adresse des Clients erhalten, nicht die IP-Adresse des Loadbalancers.

Aber mein Angebot ist, um die Header-Daten zu bekommen, um die anderen Informationen zu untersuchen, ist getallheaders () Funktion für PHP.

//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

Das Ende meiner letzten haproxy.cfg-Datei ist wie folgt.

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:passwd

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

Trotzdem fehlen mir viele Dinge über HAproxy, wie die Bedeutung von uid oder gid.

15
System

Wenn Sie die Client-IP-Adresse im Apache-Protokoll benötigen, können Sie Ihre Apache-Konfiguration ändern, um das X-Forwarded-For an Ort und Stelle der ursprünglichen Quelle zu protokollieren (5h).

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
2

Ich habe gerade die Lösung von @ System ausprobiert und es scheint, dass der Headername von HTTP_X_FORWARDED_FOR In x-forwarded-for Geändert wurde. Wahrscheinlich hängt es mit der HAproxy-Version zusammen, weil die Antwort vor 5 Jahren geschrieben wurde ...?

Dies funktioniert beispielsweise in der Produktion:

String requestIp = httpRequest.getHeader("x-forwarded-for");

1
Roc Boronat