Nginx set_real_ip_from Indirizzo bilanciamento del carico AWS ELB


22

Ho un set di server Nginx dietro un bilanciamento del carico Amazon ELB. Sto usando set_real_ip (da HttpRealIpModule ) in modo da poter accedere all'indirizzo IP del client di origine su questi server (per passare a php-fpm e per l'uso in HttpGeoIPModule ).

Sembra che set_real_ip_fromnella configurazione nginx possa accettare solo un indirizzo IP. Tuttavia, per quanto riguarda le macchine ELB, Amazon afferma:

Nota: poiché l'insieme di indirizzi IP associati a LoadBalancer può cambiare nel tempo, non è mai necessario creare un record "A" con un indirizzo IP specifico. Se desideri utilizzare un nome DNS descrittivo per LoadBalancer anziché il nome generato dal servizio di bilanciamento del carico elastico, devi creare un record CNAME per il nome DNS di LoadBalancer o utilizzare Amazon Route 53 per creare una zona ospitata. Per ulteriori informazioni, consultare Utilizzo dei nomi di dominio con bilanciamento del carico elastico

Ma se devo inserire un indirizzo IP non posso usare un CNAME (né di Amazon né mio). C'è una soluzione a questo problema?

Risposte:


40

Se puoi garantire che tutte le richieste verranno dall'ELB (non ne ho familiarità), puoi provare:

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

Ciò dovrebbe dire a nginx di fidarsi di un header X-Forwarded-For di chiunque. Il rovescio della medaglia è che se qualcuno accede direttamente al tuo server, sarebbe in grado di falsificare un'intestazione X-Forwarded-For e nginx userebbe l'indirizzo IP client errato.


2
Grazie - Non mi ero reso conto di poter aggiungere un intervallo IP lì ... Verificherò se esiste un intervallo più specifico su cui potrebbe essere installato ELB (penso 10.0.0.1/8che funzionerebbe anche se potrebbe esserci qualcosa di più specifico)
vitch

Ho aggiunto una domanda di follow-up per scoprire se qualcuno conosce l'intervallo valido: serverfault.com/questions/331697/…
vitch

Se si tratta di un ALB VPC, i tuoi intervalli sono (sono) gli stessi dei tuoi intervalli di sottorete di cui l'LB fa parte.
Talonx,

17

La best practice di oggi è usare VPC, quindi, conoscerai il CIDR esatto per il tuo ELB. Quindi, puoi aggiungere qualcosa del genere al tuo file di configurazione Nginx:

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

Visto che la domanda è del 2011, è possibile che l'opzione non fosse disponibile allora. Includo solo tutte le possibili reti private poiché gli utenti esterni non possono accedervi facilmente.
Jordan Reiter,

7

Usa il VPC CIDR per set_real_ip_fromPuoi trovarlo nella console Amazon sotto VPC => Il tuo VPC (sostituiscilo <your VPC CIDR here>con esso):

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

4

L'impostazione dell'intervallo attendibile su 0.0.0.0/0 su Amazon ELB ti metterà sicuramente nei guai. Puoi garantire che le richieste provengano dall'ELB se puoi configurare il gruppo di sicurezza per il tuo server nginx, ma la richiesta originale proviene da qualsiasi fonte possibile (Amazon ELB sono interfacce pubbliche).

Un semplice test rivelerà questo:

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

I registri sul server nginx mostreranno quindi 1.2.3.4 come IP reale, che è falso. Vedi Intervallo IP per l'IP privato interno di Amazon ELB per risposte migliori.


3
Questo sarebbe un problema solo se imposti real_ip_recursive su, che non è l'impostazione predefinita, e non esisteva nemmeno quando inizialmente ho risposto alla domanda.
kolbyjack,

3

Il realip_module afferma che in caso di X-Forwarded-For, questo modulo utilizza l'ultimo indirizzo IP nell'intestazione X-Forwarded-For per la sostituzione. Questo modulo non funziona quando solo real_ip_headere set_real_ip_formsono impostati. Questo perché questo modulo utilizzerà un indirizzo IP proxy anziché un IP client. Per risolvere questa real_ip_recursivedirettiva dovrebbe essere abilitato.

Inoltre, se si dispone di certificati SSL che vengono distribuiti e rinnovati sull'istanza (come ad esempio i certificati letencrypt o certbot). Queste autorità di certificazione potrebbero tentare di convalidare tali certificati tramite IPV6.

Quindi è importante avere anche IPV6. Quindi il file di configurazione di Nginx dovrebbe contenere anche l'indirizzo IPV6 set_real_ip_from.

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

se si applicano ulteriori restrizioni di sicurezza, potrebbe essere necessario includere anche set_real_ip_fromVPC CIDR (sia IPV4 che IPV6) per le subnet cloudfront / elb / ec2.

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.