haproxy e inoltro dell'indirizzo IP del client ai server


15

Ho un problema con HAproxy.

Uso HAproxy come bilanciamento del carico che distribuisce le richieste HTTP in entrata a 5 server Web. normalmente una richiesta del client viene inoltrata ai server Web con l'IP del loadbalancer. Ma ho bisogno di IP client o IP reali che richiedono qualcosa dai server Web. Perché dobbiamo registrare gli IP del client reale.

Cerco di ottenere gli IP dei client sui server Web, ma finora non riesco. Vedo sempre l'IP del bilanciamento del carico.

Uso l'opzione x-forward-for ma non è stato risolto il problema. Dopodiché ho trovato un'altra opzione " source 0.0.0.0:80 utilizzarc clientip " ma ho avuto un errore durante il tentativo di eseguire HAproxy che riguarda le esigenze di compilazione con l'opzione USE_TPROXY del programma HAproxy. L'ho fatto, ho ricompilato HAproxy con l'opzione USE_TPROXY ma non ho cambiato nulla. cosa posso fare per apprendere gli IP reali del cliente.

La mia versione del kernel linux è 2.6.32-34 Voglio dire che il kernel supporta proxy trasparente. e utilizzo UBUNTU 10.4 LTS

il mio file di configurazione è qui

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) Durante il test di HAproxy ho usato una di queste due righe.

Qualcuno mi aiuta a conoscere gli IP reali dei client che vengono richiesti dai nostri server?


Quello che stai cercando si chiama 'proxy trasparente'. iptables è coinvolto in qualche modo, ma non sono sicuro di come.
sysadmin1138

dicendo proxy trasparente menziono questo, i proxy che non modificano le intestazioni http mentre distribuiscono le connessioni in entrata. pertanto l'IP del client richiedente pagina web reale può essere inviato al server web. Questo è ciò che ho capito dal proxy trasparente.
Sistema

Risposte:


15

Ho risolto questo problema. Potrebbe non essere stato un problema sin dall'inizio. Ho fatto una ricerca su Google quando ho riscontrato questo problema e l'ho visto

option forwardfor

linea per utilizzare nel file haproxy.cfg e anche altre opzioni. Ho provato quelle opzioni tra cui la ricompilazione dell'haproxy ... Ma il vero problema relativo all'apprendimento degli IP reali del client sui server Web non proviene da HAproxy, si tratta di leggere le intestazioni dagli script del server, nel nostro caso questo linguaggio di scripting è PHP.

Provo a imparare gli IP del client con questi comandi

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

e questi comandi visualizzano l'IP del loadbalancer. Questo è corretto ma non è quello che mi aspetto. Nonostante l'opzione forwardfor questi comandi, mi ha dato l'IP del loadbalancer

Usando l'opzione forwardfor abilitiamo HAproxy a inserire l'intestazione x-forwarded-for nelle richieste del client inviate ai nostri server web. HAproxy ha messo questo campo nell'intestazione ma l'ho ignorato. Oggi ho capito che questo è un campo di intestazione e devo leggere questa intestazione in questo modo

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

Con questo comando ho ottenuto l'indirizzo IP del client, non l'indirizzo IP del loadbalancer.

Ma la mia offerta è al fine di ottenere i dati di intestazione per indagare le altre informazioni è la funzione getallheaders () per PHP.

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

La fine di tutto il mio ultimo file haproxy.cfg è come di seguito.

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

Tuttavia ho molte cose mancanti su HAproxy come qual è il significato uid o gid.


2

Se hai bisogno dell'indirizzo IP del client sul registro di Apache puoi cambiare la tua configurazione di Apache per registrare la X-forwarded-in-place al posto dell'origine originale (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

Grazie per la risposta Marcelo, ma non abbiamo bisogno dell'indirizzo IP del client sul registro Apache. proviamo a imparare dai nostri script php.
Sistema

1

Ho appena provato la soluzione di @ System e sembra che il nome dell'intestazione sia stato cambiato da HTTP_X_FORWARDED_FORa x-forwarded-for. Probabilmente è legato alla versione HAproxy, perché la risposta è stata scritta 5 anni fa ...?

Ad esempio, questo sta lavorando sulla produzione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.