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_from
w 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?
źródło
10.0.0.1/8
że zadziałałoby, chociaż może być coś bardziej szczegółowego)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:
źródło
Użyj VPC CIDR, ponieważ
set_real_ip_from
możesz go znaleźć w konsoli Amazon pod VPC => Twój VPC (zastąp<your VPC CIDR here>
go):źródło
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:
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.
źródło
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_header
iset_real_ip_form
są ustawione. Wynika to z faktu, że ten moduł użyje adresu IP serwera proxy zamiast adresu IP klienta. Aby rozwiązać tęreal_ip_recursive
dyrektywę, 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.
jeśli obowiązują dodatkowe ograniczenia bezpieczeństwa, może być konieczne dołączenie
set_real_ip_from
VPC CIDR (zarówno IPV4, jak i IPV6) dla podsieci cloudfront / elb / ec2.źródło