Frage Nginx set_real_ip_from AWS ELB Load Balancer-Adresse


Ich habe eine Reihe von Nginx-Servern hinter einem Amazon ELB Load Balancer. Ich benutze set_real_ip (von der HttpRealIpModule) damit ich auf diesen Servern auf die ursprüngliche Client - IP - Adresse zugreifen kann (für den Zugriff auf php - fpm und für die Verwendung in der HttpGeoIPModule).

Es scheint, dass set_real_ip_from in der Nginx-Konfiguration kann nur eine IP-Adresse annehmen. In Bezug auf ELB-Maschinen sagen Amazon jedoch:

Hinweis: Da sich die mit einem LoadBalancer verbundenen IP-Adressensätze im Laufe der Zeit ändern können, sollten Sie niemals einen "A" -Datensatz mit einer bestimmten IP-Adresse erstellen. Wenn Sie einen benutzerfreundlichen DNS-Namen für Ihren LoadBalancer anstelle des vom Elastic Load Balancing-Dienst generierten Namens verwenden möchten, sollten Sie einen CNAME-Eintrag für den LoadBalancer-DNS-Namen erstellen oder Amazon Route 53 zum Erstellen einer gehosteten Zone verwenden. Weitere Informationen finden Sie unter Verwenden von Domänennamen mit elastischem Lastenausgleich

Aber wenn ich eine IP-Adresse eingeben muss, kann ich keinen CNAME verwenden (weder von Amazon noch von meinem). Gibt es eine Lösung für dieses Problem?


19
2017-11-16 13:14


Ursprung




Antworten:


Wenn Sie garantieren können, dass alle Anfragen von ELB kommen (ich bin nicht damit vertraut), könnten Sie versuchen:

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

Das sollte nginx sagen, einem X-Forwarded-For-Header von jedem zu vertrauen. Der Nachteil ist, dass jemand, der direkt auf Ihren Server zugreift, einen X-Forwarded-For-Header fälschen könnte und nginx die falsche Client-IP-Adresse verwenden würde.


37
2017-11-16 16:25



Danke - Ich wusste nicht, dass ich dort einen IP-Bereich hinzufügen könnte ... Ich werde prüfen, ob es einen spezifischeren Bereich gibt, auf dem der ELB sein könnte (denke ich 10.0.0.1/8 würde funktionieren, obwohl es etwas spezifischer sein kann) - vitch
Ich habe eine Follow-up-Frage hinzugefügt, um herauszufinden, ob jemand den gültigen Bereich kennt: serverfault.com/questions/331697/ ... - vitch
Wenn es sich um einen VPC-ALB handelt, sind Ihre Bereiche die gleichen wie Ihre Subnetzbereiche, zu denen der LB gehört. - talonx


Die beste Vorgehensweise ist heute die Verwendung von VPC, also kennen Sie die genaue CIDR für Ihren ELB. Dann können Sie Ihrer Nginx-Konfigurationsdatei so etwas hinzufügen:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;

17
2018-02-16 20:13



Da die Frage von 2011 stammt, ist es möglich, dass die Option damals nicht verfügbar war. Ich schließe einfach alle möglichen privaten Netzwerke ein, da externe Benutzer nicht einfach zu ihnen gelangen. - Jordan Reiter


Verwenden Sie die VPC-CIDR für set_real_ip_from Sie finden es in der Amazon-Konsole unter VPC => Your VPC (ersetzen <your VPC CIDR here> damit):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;

6
2017-07-31 16:01





Wenn Sie den vertrauenswürdigen Bereich auf 0.0.0.0/0 auf Amazon ELB setzen, werden Sie sicherlich in Schwierigkeiten geraten. Sie können garantieren, dass die Anfragen vom ELB kommen, wenn Sie die Sicherheitsgruppe für Ihren nginx Server konfigurieren können, aber der Original Die Anfrage stammt von einer beliebigen Quelle (Amazon ELBs sind öffentliche Schnittstellen).

Ein einfacher Test zeigt dies:

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

Die Protokolle auf Ihrem Nginx-Server zeigen dann 1.2.3.4 als echte IP-Adresse an, was eine gefälschte ist. Sehen IP-Bereich für interne private IP von Amazon ELB 100 100 100 100 100 100 100 sch 100 100 100 sch sch sch sch sch sch sch sch sch sch sch sch dieser


4
2017-07-23 07:59



Dies wäre nur ein Problem, wenn Sie festlegen real_ip_rekursiv auf, was nicht der Standard ist und nicht einmal existierte, als ich die Frage ursprünglich beantwortete. - kolbyjack