Nginx set_real_ip_from z AWS ELB adres modułu równoważenia obciążenia

22

Mam zestaw serwerów Nginx za modułem równoważenia obciążenia Amazon ELB. Korzystam z set_real_ip (z HttpRealIpModule ), aby uzyskać dostęp do adresu IP klienta źródłowego na tych serwerach (do przekazywania do php-fpm i do używania w HttpGeoIPModule ).

Wygląda na to, że set_real_ip_fromw konfiguracji nginx akceptuje tylko adres IP. Jednak w odniesieniu do maszyn ELB Amazon powiedział:

Uwaga: Ponieważ zestaw adresów IP skojarzonych z LoadBalancer może się zmieniać w czasie, nigdy nie należy tworzyć rekordu „A” z żadnym konkretnym adresem IP. Jeśli chcesz użyć przyjaznej nazwy DNS dla LoadBalancer zamiast nazwy generowanej przez usługę elastycznego równoważenia obciążenia, powinieneś utworzyć rekord CNAME dla nazwy DNS LoadBalancer lub użyć Amazon Route 53, aby utworzyć strefę hostowaną. Aby uzyskać więcej informacji, zobacz Używanie nazw domen z elastycznym równoważeniem obciążenia

Ale jeśli muszę wprowadzić adres IP, nie mogę użyć nazwy CNAME (amazońskiej lub mojej). Czy istnieje rozwiązanie tego problemu?

czarownica
źródło

Odpowiedzi:

40

Jeśli możesz zagwarantować, że wszystkie żądania będą pochodzić od ELB (nie jestem z tym zaznajomiony), możesz spróbować:

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

To powinno powiedzieć nginx, aby ufał nagłówkowi X-Forwarded-For od kogokolwiek. Minusem jest to, że jeśli ktoś uzyska bezpośredni dostęp do twojego serwera, będzie mógł sfałszować nagłówek X-Forwarded-For, a nginx użyje niewłaściwego adresu IP klienta.

kolbyjack
źródło
2
Dzięki - nie zdawałem sobie sprawy, że mogę tam dodać zakres adresów IP ... Sprawdzę, czy istnieje bardziej szczegółowy zakres, w którym ELB mógłby być włączony (myślę, 10.0.0.1/8że zadziałałoby, chociaż może być coś bardziej szczegółowego)
vitch
Dodałem pytanie uzupełniające, aby dowiedzieć się, czy ktoś zna prawidłowy zakres: serverfault.com/questions/331697
vitch
Jeśli jest to ALPC VPC, zakresy są takie same jak zakresy podsieci, których częścią jest LB.
talonx
17

Dzisiejszą najlepszą praktyką jest używanie VPC, więc poznasz dokładny CIDR dla twojego ELB. Następnie możesz dodać coś takiego do pliku konfiguracyjnego Nginx:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
nikolay
źródło
Ponieważ pytanie pochodzi z 2011 roku, możliwe jest, że opcja nie była wtedy dostępna. Podaję tylko wszystkie możliwe sieci prywatne, ponieważ użytkownicy zewnętrzni nie będą mieli do nich łatwego dostępu.
Jordan Reiter
7

Użyj VPC CIDR, ponieważ set_real_ip_frommożesz go znaleźć w konsoli Amazon pod VPC => Twój VPC (zastąp <your VPC CIDR here>go):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;
Alexander Paramonov
źródło
4

Ustawienie zaufanego zakresu na 0.0.0.0/0 w Amazon ELB z pewnością sprawi ci kłopoty. Możesz zagwarantować, że żądania pochodzą od ELB, jeśli możesz skonfigurować grupę zabezpieczeń dla swojego serwera nginx, ale pierwotne żądanie będzie pochodziło z dowolnego możliwego źródła (ELB Amazon są interfejsami publicznymi).

Prosty test ujawni to:

curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"

Logi na twoim serwerze nginx będą wtedy pokazywały 1.2.3.4 jako prawdziwe IP, które jest sfałszowane. Zobacz IP Range dla wewnętrznego prywatnego adresu IP Amazon ELB, aby uzyskać lepsze odpowiedzi.

Nawet André Fiskvik
źródło
3
Byłby to problem tylko wtedy, gdy włączysz real_ip_recursive , co nie jest ustawieniem domyślnym i nawet nie istniało, kiedy pierwotnie odpowiedziałem na pytanie.
kolbyjack
3

Moduł realip_module stwierdza, że ​​w przypadku X-Forwarded-For ten moduł używa do zamiany ostatniego adresu IP w nagłówku X-Forwarded-For. Moduł ten nie będzie działać, gdy tylko real_ip_headeri set_real_ip_formsą ustawione. Wynika to z faktu, że ten moduł użyje adresu IP serwera proxy zamiast adresu IP klienta. Aby rozwiązać tę real_ip_recursivedyrektywę, należy ją włączyć.

Ponadto, jeśli masz certyfikaty SSL, które są wdrażane i odnawiane w instancji (na przykład certyfikaty letsencrypt lub certbot). Te urzędy certyfikacji mogą próbować sprawdzić te certyfikaty za pomocą IPV6.

Dlatego ważne jest, aby mieć również IPV6. Tak więc plik konfiguracyjny Nginx powinien również zawierać set_real_ip_z adresu IPV6.

real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from <your VPC IPV4 CIDR here>;
set_real_ip_from <your VPC IPV6 CIDR here>;

jeśli obowiązują dodatkowe ograniczenia bezpieczeństwa, może być konieczne dołączenie set_real_ip_fromVPC CIDR (zarówno IPV4, jak i IPV6) dla podsieci cloudfront / elb / ec2.

Harish Chennamsetty
źródło