Ich versuche, den Zugriff auf Ressourcen hinter Nginx basierend auf der Client-IP zu beschränken, die in X-Forwarded-For-Headern übergeben wird. Nginx wird in einem Container in einem Kubernetes-Cluster auf der Google Cloud Platform ausgeführt, und echte Client-IPs werden nur im x-forwarded-for-Header übergeben
Bisher habe ich es geschafft, dies für eine einzelne IP mit dem folgenden Code zu tun:
set $allow false;
if ($http_x_forwarded_for ~* 123.233.233.123) {
set $allow true;
}
if ($http_x_forward_for ~* 10.20.30.40) {
set $allow false;
}
if ($allow = false) {
return 403;
}
Aber wie kann ich das für ganze IP-Bereiche tun? Die manuelle Angabe von Hunderten von IPs macht wenig Sinn.
Jede Hilfe wird geschätzt
location / { real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/8; real_ip_recursive on; allow xxx.xxx.xxx.xxx;
X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only)
Der Eintrag <Sofort-Client-IP> ist der Client, der eine direkte Verbindung zum Load Balancer hergestellt hat.<global forwarding rule external IP>
und identifizieren<proxies running in GCP>
undset_real_ip_from
Anweisungen hinzufügen , die alle abdecken.<global forwarding rule external IP>
Ist die externe IP meines Dienstes, gibt es keine anderen Proxys in GCP. In meinen Nginx-Protokollen werden Anforderungen im folgenden Format[31/Jul/2017:20:05:46 +0000] "GET / HTTP/1.1" 403 169 "-" "curl/7.54.0" "aaa.aaa.aaa.aaa, bbb.bbb.bbb.bbb, ccc.ccc.ccc.ccc"
angezeigt, wobei ccc.ccc.ccc.ccc die globale Weiterleitungsregel ist, bbb.bbb.bbb.bbb ein sofortiger Client ip - stimmt mit dem überein, was ich auf whatsmyip.org sehe. Gibt es eine Chance, wie Sie diesen Teil extrahieren können?set_real_ip_from
für alle Adressen rechts von der Adresse, die Sie zulassen / verweigern möchten. Wie imreal_ip_recursive
Abschnitt angegeben.Richards Antwort enthielt bereits Informationen darüber, wie man die echte IP-Adresse am besten an nginx weiterleitet.
Was die Frage der Angabe von IP-Bereichen betrifft, können Sie http://nginx.org/en/docs/http/ngx_http_geo_module.html verwenden .
Das
geo
Modul funktioniert wie dasmap
Modul, dh eine Variable erhält abhängig vom Wert der IP-Adresse zugewiesene Werte.Ein Beispiel:
Hier weisen wir die
geo
Karte zu, wobei der Standardwert für$allow
0 ist. Wenn sich die IP-Adresse im Subnetz befindet192.168.168.0/24
,$allow
wird der Wert 1 angezeigt , und die Anforderung ist zulässig.Sie können so viele Zeilen im
geo
Block haben, wie Sie zum Definieren Ihrer IP-Bereiche benötigen.quelle
real_ip_recursive on;
unten hinzugefügt,set_real_ip_from
aber es hat keinen Unterschied gemachtX-Forwarded-For
Header hat drei separate Adressen, dh die Anfrage kommt über mehrere Proxys? Haben Sie dort einen anderen Header, den Sie verwenden können und der nur die Client-IP enthält?X-Forwarded-For
Header an. Zusätzlich zum Hinzufügen müssenreal_ip_recursive on
Sieset_real_ip_from
Anweisungen für jede vertrauenswürdige Server-IP-Adresse in Ihrer Proxy-Kette hinzufügen . Nginx wird dann jede dieser AnweisungenX-Forwarded-For
set_real_ip_from
Habe diese für mich arbeiten lassen.
Ref: http://nginx.org/en/docs/http/ngx_http_geo_module.html
quelle