Nginx set_real_ip_from AWS ELB-Lastenausgleichsadresse

22

Ich habe eine Reihe von Nginx-Servern hinter einem Amazon ELB-Load-Balancer. Ich verwende set_real_ip (aus dem HttpRealIpModule ), damit ich auf die IP-Adresse des Ursprungsclients auf diesen Servern zugreifen kann (zur Weiterleitung an php-fpm und zur Verwendung im HttpGeoIPModule ).

Es scheint, dass set_real_ip_fromin der Nginx-Konfiguration nur eine IP-Adresse akzeptiert werden kann. In Bezug auf ELB-Maschinen sagt Amazon jedoch:

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

Wenn ich jedoch eine IP-Adresse eingeben muss, kann ich keinen CNAME verwenden (weder bei Amazon noch bei mir). Gibt es eine Lösung für dieses Problem?

Vitch
quelle

Antworten:

40

Wenn Sie garantieren können, dass alle Anfragen von ELB kommen (ich kenne mich damit nicht aus), können Sie Folgendes versuchen:

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

Das sollte nginx anweisen, einem X-Forwarded-For-Header von jedermann zu vertrauen. Der Nachteil ist, dass jeder, der direkt auf Ihren Server zugreift, einen X-Forwarded-For-Header fälschen kann und nginx die falsche Client-IP-Adresse verwendet.

kolbyjack
quelle
2
Danke - Ich wusste nicht, dass ich dort einen IP-Bereich hinzufügen könnte ... Ich werde prüfen, ob es einen spezifischeren Bereich gibt, in dem sich der ELB befinden könnte (ich denke, es 10.0.0.1/8würde funktionieren, obwohl es etwas spezifischeres geben könnte)
vitch
Ich habe eine Folgefrage hinzugefügt, um herauszufinden, ob jemand den gültigen Bereich kennt: serverfault.com/questions/331697/…
vitch
Wenn es sich um einen VPC-ALB handelt, stimmen Ihre Bereiche mit den Teilnetzbereichen überein, zu denen der LB gehört.
Talonx
17

Die heutige bewährte Methode ist die Verwendung von VPC. Daher kennen Sie den genauen CIDR für Ihre ELB. Anschließend können Sie Ihrer Nginx-Konfigurationsdatei Folgendes hinzufügen:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
nikolay
quelle
Da es sich um eine Frage aus dem Jahr 2011 handelt, ist es möglich, dass diese Option zu diesem Zeitpunkt nicht verfügbar war. Ich schließe nur alle möglichen privaten Netzwerke ein, da externe Benutzer nicht leicht zu ihnen gelangen.
Jordan Reiter
7

Verwenden Sie die VPC CIDR für set_real_ip_fromSie finden sie in der Amazon-Konsole unter VPC => Ihre VPC (durch <your VPC CIDR here>sie ersetzen ):

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

Das Festlegen des vertrauenswürdigen Bereichs auf 0.0.0.0/0 in Amazon ELB wird Sie mit Sicherheit in Schwierigkeiten bringen. Sie können sicherstellen, dass die Anforderungen von der ELB stammen, wenn Sie die Sicherheitsgruppe für Ihren Nginx-Server konfigurieren können. Die ursprüngliche Anforderung stammt jedoch aus einer beliebigen Quelle (Amazon ELBs sind öffentliche Schnittstellen).

Ein einfacher Test wird dies zeigen:

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

In den Protokollen auf Ihrem Nginx-Server wird dann 1.2.3.4 als die echte IP angezeigt, die gefälscht ist. Bessere Antworten finden Sie unter IP-Bereich für die interne private IP von Amazon ELB .

Sogar André Fiskvik
quelle
3
Dies wäre nur dann ein Problem, wenn Sie real_ip_recursive auf setzen, was nicht die Standardeinstellung ist und nicht einmal existierte, als ich die Frage ursprünglich beantwortete.
Kolbyjack
3

Das realip_module gibt an, dass dieses Modul im Fall von X-Forwarded-For die letzte IP-Adresse im X-Forwarded-For-Header zum Ersetzen verwendet. Dieses Modul wird nicht funktionieren , wenn nur real_ip_headerund set_real_ip_formeingestellt. Dies liegt daran, dass dieses Modul eine Proxy-IP-Adresse anstelle einer Client-IP verwendet. Zur Lösung dieser real_ip_recursiveRichtlinie sollte aktiviert sein.

Wenn Sie über SSL-Zertifikate verfügen, die für die Instanz bereitgestellt und erneuert werden (z. B. Letsencrypt- oder Certbot-Zertifikate). Diese Zertifizierungsstellen versuchen möglicherweise, diese Zertifikate über IPV6 zu validieren.

Es ist also wichtig, auch IPV6 zu haben. Die Nginx-Konfigurationsdatei sollte daher auch set_real_ip_from IPV6-Adresse enthalten.

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>;

Wenn zusätzliche Sicherheitsbestimmungen gelten, müssen wir möglicherweise auch set_real_ip_fromVPC CIDR (sowohl IPV4 als auch IPV6) für Cloudfront / Elb / Ec2-Subnetze einbeziehen.

Harish Chennamsetty
quelle