Haproxy und Weiterleitung der Client-IP-Adresse an Server

15

Ich habe ein Problem mit HAproxy.

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

Ich versuche die IPs des Kunden auf Webservern zu erhalten, kann aber bisher keinen Erfolg haben. Immer sehe ich die IP des Load Balancers.

Ich verwende die Option x-forward-for, aber das Problem ist noch nicht gelöst. Danach habe ich eine andere Option " source 0.0.0.0:80 usesrc clientip " gefunden, aber beim Versuch, HAproxy auszuführen, ist ein Fehler aufgetreten, bei dem es um die Kompilierungsanforderungen mit der USE_TPROXY-Option von HAproxy geht. Ich habe es geschafft, ich kompiliere HAproxy mit der USE_TPROXY-Option neu, aber es ändert sich nichts. Was kann ich tun, um die IPs des echten Kunden zu erfahren?

Meine Linux-Kernel-Version ist 2.6.32-34. Ich meine, dass der Kernel transparenten Proxy unterstützt. 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 Leitungen verwendet.

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

System
quelle
Was Sie suchen, wird als "transparenter Proxy" bezeichnet. iptables ist irgendwie involviert, aber ich weiß nicht genau wie.
sysadmin1138
indem ich transparenten Proxy sage, erwähne ich, dass die Proxys die http-Header nicht ändern, während sie die eingehenden Verbindungen verteilen. Auf diese Weise kann die IP des realen Webseitenanforderer-Clients an den Webserver gesendet werden. Das habe ich von transparent proxy verstanden.
System

Antworten:

15

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

option forwardfor

Zeile, um in der haproxy.cfg-Datei und auch andere Optionen zu verwenden. Ich habe diese Optionen ausprobiert, einschließlich des erneuten Kompilierens des Haproxys ... Das eigentliche Problem beim Erlernen der IPs von echten Clients auf Webservern stammt jedoch nicht von HAproxy, sondern vom Lesen von Headern durch Serverskripten. In unserem Fall ist diese Skriptsprache PHP.

Mit diesen Befehlen versuche ich, die IPs des Clients 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 ist nicht das, was ich erwartet habe. Trotz der forwardfor-Option gaben mir diese Befehle die IP des Loadbalancers

Mit der Option forwardfor ermöglichen wir HAproxy das Einfügen des x-forwarded-for-Headers in Clientanforderungen, die an unsere Webserver gesendet werden. HAproxy hat dieses Feld in den Header gesetzt, aber ich habe dies ignoriert. Heute habe ich gemerkt, 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 erhalten, um die anderen Informationen zu untersuchen, ist die Funktion getallheaders () 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 habe ich viele fehlende Dinge über HAproxy wie die Bedeutung von uid oder gid.

System
quelle
2

Wenn Sie die Client-IP-Adresse im Apache-Protokoll benötigen, können Sie Ihre Apache-Konfig ändern, um die X-Weiterleitung für die ursprüngliche 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
Marcelo Bittencourt
quelle
Vielen Dank für Ihre Antwort, Marcelo. Wir benötigen jedoch keine IP-Adresse des Clients im Apache-Protokoll. Wir versuchen, durch unsere PHP-Skripte zu lernen.
System
1

Gerade versucht @ System - Lösung und es scheint , dass der Header - Name von geändert wurde HTTP_X_FORWARDED_FORzu x-forwarded-for. Wahrscheinlich hängt es mit der HAproxy-Version zusammen, weil die Antwort vor 5 Jahren geschrieben wurde ...?

Dies ist ein Beispiel für die Produktion:

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

Roc Boronat
quelle