nginx real_ip_header y X-Fordered-For parece incorrecto

Pregunta:

La descripción de wikipedia del encabezado HTTP X-Forwarded-For es:

X-Reenviado-Para: cliente1, proxy1, proxy2, …

La documentación de nginx para la directiva real_ip_header dice, en parte:

Esta directiva establece el nombre del encabezado utilizado para transferir la dirección IP de reemplazo.
En el caso de X-Fordered-For, este módulo utiliza la última ip en el encabezado X-Fordered-For para reemplazo. [Énfasis mío]

Estas dos descripciones parecen estar en desacuerdo entre sí. En nuestro escenario, el encabezado X-Forwarded-For es exactamente como se describe: la dirección IP "real" del cliente es la entrada más a la izquierda. Del mismo modo, el comportamiento de nginx es usar el valor más a la derecha , que, obviamente, es solo uno de nuestros servidores proxy.

Mi comprensión de X-Real-IP es que se supone que debe usarse para determinar la dirección IP real del cliente, no el proxy. ¿Me estoy perdiendo algo o es un error en nginx?

Y, más allá de eso, ¿alguien tiene alguna sugerencia sobre cómo hacer que el encabezado X-Real-IP muestre el valor más a la izquierda , como se indica en la definición de X-Forwarded-For ?

Respuesta:

Creo que la clave para resolver los problemas de X-Fordered-For cuando se encadenan varias direcciones IP es la opción de configuración introducida recientemente, real_ip_recursive (agregada en nginx 1.2.1 y 1.3.0). De los documentos de nginx realip :

Si la búsqueda recursiva está habilitada, una dirección de cliente original que coincida con una de las direcciones confiables se reemplaza por la última dirección no confiable enviada en el campo de encabezado de la solicitud.

nginx estaba tomando la última dirección IP de la cadena de forma predeterminada porque era la única que se suponía que era de confianza. Pero con el nuevo real_ip_recursive habilitado y con múltiples opciones de set_real_ip_from , puede definir múltiples proxies confiables y buscará la última IP no confiable.

Por ejemplo, con esta configuración:

set_real_ip_from 127.0.0.1;
set_real_ip_from 192.168.2.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

Y un encabezado X-Fordered-For que da como resultado:

X-Forwarded-For: 123.123.123.123, 192.168.2.1, 127.0.0.1

nginx ahora seleccionará 123.123.123.123 como la dirección IP del cliente.

En cuanto a por qué nginx no solo elige la dirección IP más a la izquierda y requiere que defina explícitamente proxies confiables, es para evitar la suplantación de IP fácil.

Digamos que la dirección IP real de un cliente es 123.123.123.123 . También digamos que el cliente no está tramando nada bueno y está tratando de falsificar su dirección IP para que sea 11.11.11.11 . Envían una solicitud al servidor con este encabezado ya en su lugar:

X-Forwarded-For: 11.11.11.11

Dado que los proxies inversos simplemente agregan IP a esta cadena X-Fordered-For, digamos que termina luciendo así cuando nginx llega a ella:

X-Forwarded-For: 11.11.11.11, 123.123.123.123, 192.168.2.1, 127.0.0.1

Si simplemente tomara la dirección más a la izquierda, eso le permitiría al cliente falsificar fácilmente su dirección IP. Pero con la configuración de nginx del ejemplo anterior, nginx solo confiará en las dos últimas direcciones como proxies. Esto significa que nginx seleccionará correctamente 123.123.123.123 como la dirección IP, a pesar de que esa IP falsificada es la más a la izquierda.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım