haproxy i przekazywanie adresu IP klienta na serwery

15

Mam problem z HAproxy.

Używam HAproxy jako modułu równoważenia obciążenia, który dystrybuuje przychodzące żądania HTTP do 5 serwerów WWW. zwykle żądanie klienta jest przekazywane do serwerów WWW z adresem IP modułu równoważenia obciążenia. Ale potrzebuję adresów IP klientów lub prawdziwych adresów IP, którzy żądają czegoś od serwerów sieciowych. Ponieważ musimy rejestrować rzeczywiste adresy IP klientów.

Próbuję uzyskać adresy IP klientów na serwerach internetowych, ale do tej pory nie mogę osiągnąć sukcesu. Zawsze widzę adres IP modułu równoważenia obciążenia.

Używam opcji x-forward-for, ale to nie rozwiązało problemu. Potem znalazłem inną opcję „ source 0.0.0.0:80 usesrc clientip ”, ale dostałem błąd podczas próby uruchomienia HAproxy, która dotyczy potrzeb kompilacji z opcją USE_TPROXY HAproxy. Zrobiłem to, ponownie kompiluję HAproxy z opcją USE_TPROXY, ale niczego nie zmieniam. co mogę zrobić, aby poznać prawdziwe adresy IP klientów.

Moja wersja jądra Linuksa to 2.6.32-34 Mam na myśli, że jądro obsługuje przezroczyste proxy. i używam UBUNTU 10.4 LTS

mój plik konfiguracyjny jest tutaj

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) Podczas testowania HAproxy użyłem jednej z tych dwóch linii.

Czy ktoś pomaga mi poznać prawdziwe adresy IP klientów, którzy są żądani od naszych serwerów?

System
źródło
To, czego szukasz, nazywa się „przezroczystym proxy”. iptables jest w jakiś sposób zaangażowany, ale nie jestem pewien, jak dokładnie.
sysadmin1138
mówiąc transparentny serwer proxy, wspominam, że serwery proxy, które nie modyfikują nagłówków http podczas dystrybucji połączeń przychodzących. w ten sposób adres IP klienta żądającego strony internetowej może zostać przesłany na serwer WWW. Właśnie to zrozumiałem z przejrzystego proxy.
System

Odpowiedzi:

15

Rozwiązałem ten problem. Być może od samego początku nie było problemu. Przeprowadziłem wyszukiwanie w Google, gdy napotkałem ten problem, i zobaczyłem to

option forwardfor

wiersz w celu użycia w pliku haproxy.cfg, a także w innych opcjach. Próbowałem tych opcji, w tym ponownej kompilacji haproxy ... Ale prawdziwy problem związany z uczeniem się prawdziwych adresów IP klientów na serwerach internetowych nie pochodzi od HAproxy, chodzi o czytanie nagłówków przez skrypty serwera, w naszym przypadku tym językiem skryptowym jest PHP.

Staram się poznać adresy IP klienta za pomocą tych poleceń

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

i te polecenia wyświetlają adres IP modułu równoważącego obciążenie. To prawda, ale nie tego się ode mnie oczekuje. Pomimo opcji forwardfor te polecenia dały mi IP loadbalancera

Korzystając z opcji forwardfor, umożliwiamy HAproxy wstawianie nagłówka x-forwarded-for do żądań klienta wysyłanych na nasze serwery sieciowe. HAproxy umieścił to pole w nagłówku, ale zignorowałem to. Dziś zdałem sobie sprawę, że jest to pole nagłówka i muszę przeczytać ten nagłówek w ten sposób

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

Za pomocą tego polecenia uzyskałem adres IP klienta, a nie adres IP modułu równoważącego obciążenie.

Ale moja oferta ma na celu uzyskanie danych nagłówka w celu zbadania innych informacji o funkcji getallheaders () dla PHP.

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

Koniec całego mojego ostatniego pliku haproxy.cfg jest jak poniżej.

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

Niemniej jednak mam wiele brakujących informacji na temat HAproxy, takich jak znaczenie uid lub gid.

System
źródło
2

Jeśli potrzebujesz adresu IP klienta w dzienniku Apache, możesz zmienić swój apache conf, aby zalogować X-to-source zamiast oryginalnego źródła (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
źródło
Dziękuję za odpowiedź Marcelo, ale nie potrzebujemy adresu IP klienta w dzienniku Apache. staramy się uczyć poprzez nasze skrypty php.
System
1

Właśnie wypróbowałem rozwiązanie @ System i wygląda na to, że nazwa nagłówka została zmieniona z HTTP_X_FORWARDED_FORna x-forwarded-for. Prawdopodobnie jest to związane z wersją HAproxy, ponieważ odpowiedź została napisana 5 lat temu ...?

Na przykład działa to na produkcji:

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

Roc Boronat
źródło