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
option forwardfor header X-Real-IP
areqidel ^X-Real-IP:
to zatrzymuje fałszywe adresy IP w dziennikach. FYI:X-Real-IP
jest domyślnym nagłówkiemNginX
opcji „set_real_ip_from
.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.
źródło
Użyj modułu apache rpaf http://stderr.net/apache/rpaf/ Wiem, że to jest stary post, ale znalezienie go zajęło mi kilka dni. Spowoduje to przedstawienie każdej aplikacji adresu IP przesłanego przez x.
źródło
Zauważ, że wydaje się, że możesz przesłonić to, co widzi aplikacja zmieniając nagłówki Apache:
Nie działa to jednak w przypadku dostępu do Apache poprzez „Zezwól z” itp.
źródło
X-Forwarded-For
nagłó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żyjmod_rpaf
lubmod_remoteip
dla Apache 2.4 lub nowszego.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
źródło
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.
źródło
Wypróbuj mod_extract_forwarded z http://www.openinfo.co.uk/apache/
źródło
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;
.
.
źródło