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.