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_from
en 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?
10.0.0.1/8
que funcionaría, aunque puede haber algo más específico)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:
fuente
Use el VPC CIDR para
set_real_ip_from
que pueda encontrarlo en la consola de Amazon en VPC => Su VPC (reemplace<your VPC CIDR here>
con él):fuente
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:
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.
fuente
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_header
yset_real_ip_form
está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 estareal_ip_recursive
directiva 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.
Si se aplican restricciones de seguridad adicionales, es posible que también necesitemos incluir
set_real_ip_from
VPC CIDR (tanto IPV4 como IPV6) para subredes cloudfront / elb / ec2.fuente