Zdalne adresy IP z HAProxy


19

Testuję nową konfigurację serwera WWW, która ma kilka problemów. Zasadniczo mamy serwer WWW, w którym kod używa zdalnego adresu IP do niektórych interesujących rzeczy, a także niektóre katalogi apache zabezpieczone do niektórych określonych adresów IP (nasze biuro itp.).

Jednak właśnie zarzuciliśmy to za ha_proxy, abyśmy mogli spojrzeć na dodanie kolejnych serwerów aplikacji, ale teraz zdalny adres IP zawsze pojawia się jako adres IP serwera proxy, a nie prawdziwy zdalny użytkownik. Oznacza to, że nie możemy dostać się do niektórych lokalizacji, a nasza aplikacja zachowuje się nieco dziwnie tam, gdzie ważne jest IP użytkownika.

Nasza konfiguracja wygląda następująco:

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

Odpowiedzi:


31

Cytat z dokumentu HAProxy na haproxy.1wt.eu .

- jeśli aplikacja musi zarejestrować adres IP oryginalnego klienta, użyj
  Opcja „forwardfor”, która doda nagłówek „X-Forwarded-For” wraz z
  oryginalny adres IP klienta. Aby to zapewnić, musisz również użyć „httpclose”
  że przepiszesz każde żądanie, a nie tylko każde pierwsze
  sesja:
        opcja httpclose
        opcja przekazania do

Stwierdzono, że aplikacja musi traktować nagłówek HTTP X-Forwarded-For, aby poznać adres IP klienta. Wydaje się, że to jedyna droga w twojej sprawie.

Zaktualizowano dla HAProxy 1.4

Haproxy 1.4 wprowadził nowy tryb z opcją „zamknij serwer http”. Nadal zamknął połączenie z serwerem, ale jeśli to możliwe, utrzymywał połączenie z klientem. W większości konfiguracji prawdopodobnie chcesz tego użyć, ponieważ pomaga to w opóźnieniu pojedynczej części połączenia o wysokim opóźnieniu (między Haproxy a klientem).

   option http-server-close
   option forwardfor

2
Lepsze wykorzystanie, option forwardfor header X-Real-IPa reqidel ^X-Real-IP:to zatrzymuje fałszywe adresy IP w dziennikach. FYI: X-Real-IPjest domyślnym nagłówkiem NginXopcji „ set_real_ip_from.
Tino

Pytanie nie wspomina o nginx. X-Real-IP nie będzie działać.
Rick Fletcher

1. czy te dwie opcje muszą być ustawione w sekcji frontend lub konfiguracja backend? (Ponieważ wydaje się, że tutaj nie działają) 2. Czy jakikolwiek typ konfiguracji jest wymagany również na poziomie Tomcat?
yglodt,

6

Istnieje sposób na rekompilację HAproxy, aby uwzględnić Tproxy, co pozwoli na przekazywanie adresu źródłowego.

Jest tutaj post na blogu: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Kilka uwag:

Najnowsze jądro Linuksa (2.6.28-11-serwer) zawiera obsługę TProxy, więc rekompilacja jądra nie jest konieczna.

Pamiętaj, aby skonfigurować serwery w swojej farmie internetowej z domyślnym adresem bramy, który wskazuje na serwer HAProxy.



1

Zauważ, że wydaje się, że możesz przesłonić to, co widzi aplikacja zmieniając nagłówki Apache:

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

Nie działa to jednak w przypadku dostępu do Apache poprzez „Zezwól z” itp.


Może to spowodować nieprzewidywalne wyniki, jeśli klient wyśle ​​istniejący X-Forwarded-Fornagłówek, gdy nowy adres IP zostanie dodany na końcu istniejącej listy, oddzielony przecinkiem i spacją. Zmień na, (.*)aby ([^ ]*)$pobrać tylko ostatni adres IP ... lub użyj mod_rpaflub mod_remoteipdla Apache 2.4 lub nowszego.
Ladadadada

1

HAProxy z założenia nie może przekazać oryginalnego adresu IP do prawdziwego serwera, podobnie jak inne serwery proxy.

Jednym rozwiązaniem może być, jeśli twoim jedynym problemem jest serwer WWW, zajrzenie do nagłówka HTTP przesyłanego przez X, który powinien zawierać adres klienta. Teraz jest to dość specyficzne dla aplikacji / języka, ale spójrz na ten przykład w php:

$headers = apache_request_headers();

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

Jeśli chcesz również zapisać oryginalny adres, możesz zmodyfikować LogFormat w httpd.conf, aby wyglądał mniej więcej tak:

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


źle, możesz z opcją „do przodu”
wittwerch

Tak, i ta opcja jest domyślnie włączona, ale ustawia nagłówek HTTP X-Forwarded-For. To, co mówiłem i wydaje mi się, że o to pytał pytający, dotyczyło faktycznego adresu źródłowego pakietu IP
Thiagodrv

0

Wygląda na to, że X-Forwarded-for nie działa dobrze w twojej konfiguracji. Czy jest więc jakiś szczególny powód, aby trzymać się haproksy? Wygląda na to, że IPVS jest bardziej odpowiedni dla twoich potrzeb (faktycznie używam ldirectora, który z kolei używa ipvs).

Spojrzeć na:

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

i

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

Korzystanie z IPVS w trybie „Tunelowanie IP” lub „Bezpośredni routing” zachowuje adres klienta.


0

Wypróbuj mod_extract_forwarded z 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

-1

Prosty sposób dzięki haproxy w trybie tcp i nginx:

dodaj send-proxy jako opcję serwera:

haproxy.conf:

.

.

posłuchaj ssl 0.0.0.0:443

tryb tcp

bilansuj najmniej połącz

opcja httpchk GET / ping

opcja sprawdzanie kondycji dziennika

serwer w1 192.168.1.1:443 send-proxy sprawdź sprawdź-ssl sprawdź brak

serwer w2 192.168.1.1:443 send-proxy sprawdź sprawdź-ssl sprawdź brak

.

.

Nginx potrzebuje obsługi protokołu proxy

nginx.conf:

.

.

Listen 192.168.1.1:443 ssl proxy_protocol;

.

.

set_real_ip_od 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.