Come negare l'accesso alle risorse in base alle intestazioni X-forwarded-for


13

Sto cercando di limitare l'accesso alle risorse dietro Nginx in base all'IP client passato nelle intestazioni X-forwarded-for. Nginx è in esecuzione in un contenitore su un cluster Kubernetes su Google Cloud Platform e i client reali vengono passati in intestazione x-forwarded-for

Finora sono riuscito a farlo per un singolo IP con il seguente codice:

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

Ma come posso farlo per intere gamme di IP? Specificare manualmente centinaia di IP non ha molto senso.

Tutto l'aiuto è apprezzato

Risposte:


11

Utilizzare il modulo RealIP per onorare il valore X-Forwarded-Fordell'intestazione. Impostare set_real_ip_fromsull'indirizzo IP del proxy inverso (il valore corrente di $remote_addr).

Per esempio:

server {
    ...
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;
    ...
}

Ora dovresti essere in grado di usare $remote_addre allow/ o le denydirettive usando il vero indirizzo IP del client. Vedi questo documento per ulteriori informazioni.


quindi ho provato inutilmente quanto segue, lo sto confondendo? 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;
1

Dopo aver esaminato i documenti di Google Load Balancing ho trovato quanto segue: X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only) La voce <IP client immediato> è il client che si è collegato direttamente al bilanciamento del carico.
p

1
Per questo al lavoro, è necessario identificare gli intervalli di indirizzi per <global forwarding rule external IP>e <proxies running in GCP>ed aggiungere set_real_ip_fromle dichiarazioni che coprono tutti loro.
Richard Smith,

<global forwarding rule external IP>è l'ip esterno del mio servizio, non ci sono altri proxy in GCP, nei miei registri nginx vedo richieste nel seguente formato in [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"cui ccc.ccc.ccc.ccc è la regola di inoltro globale, bbb.bbb.bbb.bbb un client immediato ip - corrisponde a quello che vedo in whatsmyip.org. Qualche possibilità che puoi consigliare su come estrarre quella parte?
p

1
Ok, ora mi sto confondendo. È necessario set_real_ip_fromper tutti gli indirizzi a destra di quello che si desidera consentire / negare. Come indicato nella real_ip_recursivesezione.
Richard Smith,

5

La risposta di Richard conteneva già le informazioni su come ottenere il migliore indirizzo IP reale su nginx.

Nel frattempo, per quanto riguarda la questione della specifica degli intervalli IP, è possibile utilizzare http://nginx.org/en/docs/http/ngx_http_geo_module.html .

Il geomodulo funziona come il mapmodulo, ovvero a una variabile vengono assegnati valori in base al valore dell'indirizzo IP.

Un esempio:

geo $allow {
    default 0;
    192.168.168.0/24 1;
}

server {
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;

    if ($allow = 0) {
        return 403;
    }
}

Qui assegniamo la geomappa, dove il valore predefinito $allowè 0. Se l'indirizzo IP è nella sottorete 192.168.168.0/24, $allowotterrà il valore 1 e la richiesta è consentita.

Puoi avere tutte le linee nel geoblocco di cui hai bisogno per definire i tuoi intervalli IP.


Grazie! sembra funzionare davvero bene, l'ultima cosa che sto affrontando è che client_ip da X-forwarded-for. Al momento, da 3 indirizzi IP passati viene utilizzato l'ultimo. Ho aggiunto di real_ip_recursive on;seguito set_real_ip_fromma non ha fatto alcuna differenza
p 31hr

Vuoi dire che la tua X-Forwarded-Forintestazione ha tre indirizzi separati, cioè la richiesta arriva attraverso più proxy? Hai qualche altra intestazione lì che puoi usare, che contiene solo l'IP client?
Tero Kilkanen,

Ogni proxy nella catena aggiungerà il suo indirizzo IP all'intestazione X-Forwarded-For. Oltre ad aggiungere real_ip_recursive onè anche necessario aggiungere set_real_ip_fromdirettive per ciascun indirizzo IP del server di fiducia nella catena del proxy. Nginx lavorerà quindi su ciascuna di queste direttive e restituirà l'IP client come primo valore che colpisce X-Forwarded-Fornell'intestazione che non corrisponde a nessuno dei set_real_ip_fromvalori specificati
miknik

FWIW, questa combinazione non ha funzionato per me con AWS ALB. Quello che ha funzionato è stato usare la direttiva proxy all'interno del blocco geografico, con lo stesso ip di set_real_ip - nginx.org/en/docs/http/ngx_http_geo_module.html
talonx

3

Ho funzionato per me.

geo $remote_addr $giveaccess {
      proxy 172.0.0.0/8; <-- Private IP range here
      default 0;
      11.22.33.44 1; <-- Allowed IP here
    }


server{
##
    location ^~ /secure_url_here {
        if ($giveaccess = 0){
          return 403; 
        }
        try_files $uri $uri/ /index.php?$args; <-- Add this line specific for your CMS, if required.
    }

Rif: http://nginx.org/en/docs/http/ngx_http_geo_module.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.