Nginx set_real_ip_desde la dirección del equilibrador de carga de AWS ELB

22

Tengo un conjunto de servidores Nginx detrás de un equilibrador de carga de Amazon ELB. Estoy usando set_real_ip (del HttpRealIpModule ) para poder acceder a la dirección IP del cliente de origen en estos servidores (para pasar a php-fpm y para usar en el HttpGeoIPModule ).

Parece que set_real_ip_fromen la configuración de nginx solo se puede aceptar una dirección IP. Sin embargo, con respecto a las máquinas ELB, Amazon dice:

Nota: Debido a que el conjunto de direcciones IP asociadas con un LoadBalancer puede cambiar con el tiempo, nunca debe crear un registro "A" con ninguna dirección IP específica. Si desea utilizar un nombre DNS amigable para su LoadBalancer en lugar del nombre generado por el servicio Elastic Load Balancing, debe crear un registro CNAME para el nombre DNS de LoadBalancer, o usar Amazon Route 53 para crear una zona alojada. Para obtener más información, consulte Uso de nombres de dominio con Elastic Load Balancing

Pero si necesito ingresar una dirección IP, no puedo usar un CNAME (ya sea el de Amazon o el mío). ¿Hay una solución a este problema?

vitch
fuente

Respuestas:

40

Si puede garantizar que todas las solicitudes vendrán de ELB (no estoy familiarizado con él), puede intentar:

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

Eso debería decirle a nginx que confíe en un encabezado X-Fordered-For de cualquiera. La desventaja es que si alguien accede directamente a su servidor, podría falsificar un encabezado X-Fordered-For y nginx usaría la dirección IP del cliente incorrecta.

kolbyjack
fuente
2
Gracias, no me di cuenta de que podía agregar un rango de IP allí ... Comprobaré si hay un rango más específico en el que el ELB podría estar (creo 10.0.0.1/8que funcionaría, aunque puede haber algo más específico)
vitch
He añadido una pregunta de seguimiento para averiguar si alguien sabe el rango válido: serverfault.com/questions/331697/...
vitch
Si se trata de un VPC ALB, su (s) rango (s) es (n) igual que los rangos de subred de los cuales forma parte el LB.
talonx
17

La mejor práctica de hoy es usar VPC, por lo tanto, sabrá el CIDR exacto para su ELB. Luego, puede agregar algo como esto a su archivo de configuración de Nginx:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
nikolay
fuente
Como la pregunta es de 2011, es posible que esa opción no estuviera disponible en ese momento. Solo incluyo todas las redes privadas posibles, ya que los usuarios externos no las accederán fácilmente.
Jordan Reiter
7

Use el VPC CIDR para set_real_ip_fromque pueda encontrarlo en la consola de Amazon en VPC => Su VPC (reemplace <your VPC CIDR here>con él):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;
Alexander Paramonov
fuente
4

Establecer el rango de confianza en 0.0.0.0/0 en Amazon ELB seguramente lo meterá en problemas. Puede garantizar que las solicitudes procedan del ELB si puede configurar el grupo de seguridad para su servidor nginx, pero la solicitud original se originará en cualquier fuente posible (los ELB de Amazon son interfaces públicas).

Una prueba simple revelará esto:

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

Los registros en su servidor nginx mostrarán 1.2.3.4 como la IP real, que es falsa. Consulte Rango de IP para obtener una IP privada interna de Amazon ELB para obtener mejores respuestas.

Incluso André Fiskvik
fuente
3
Esto solo sería un problema si activa real_ip_recursive , que no es el predeterminado, y ni siquiera existía cuando originalmente respondí la pregunta.
kolbyjack
3

Los realip_module establece que en caso de reenviado-X-A, este módulo utiliza la última dirección IP en el X-reenviado-For cabecera para su sustitución. Este módulo no funcionará cuando solamente real_ip_headery set_real_ip_formestán ajustadas. Esto se debe a que este módulo utilizará una dirección IP de proxy en lugar de una IP de cliente. Para resolver esta real_ip_recursivedirectiva se debe habilitar.

Además, si tiene certificados SSL que se implementan y renuevan en la instancia (como digamos los certificados letsencrypt o certbot). Estas autoridades certificadoras podrían intentar validar esos certificados a través de IPV6.

Por eso es importante tener también IPV6. Por lo tanto, el archivo de configuración de Nginx también debe contener set_real_ip_de la dirección IPV6.

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

Si se aplican restricciones de seguridad adicionales, es posible que también necesitemos incluir set_real_ip_fromVPC CIDR (tanto IPV4 como IPV6) para subredes cloudfront / elb / ec2.

Harish Chennamsetty
fuente