La descripción de Wikipedia del encabezado HTTP X-Forwarded-For
es:
X-Forward-For: cliente1, proxy1, proxy2, ...
La documentación de nginx para la directiva real_ip_header
lee, 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 el reemplazo. [El énfasis es mío]
Estas dos descripciones parecen estar en desacuerdo entre sí. En nuestro escenario, el X-Forwarded-For
encabezado 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 utilizar el valor más adecuado , que, obviamente, es solo uno de nuestros servidores proxy.
Según tengo entendido X-Real-IP
, se supone que debe usarse para determinar la dirección IP del cliente real , 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 X-Real-IP
encabezado muestre el valor más a la izquierda , como lo indica la definición de X-Forwarded-For
?
fuente
El análisis del
X-Forwarded-For
encabezado es realmente defectuoso en el módulo nginx real_ip.Comienza en el extremo derecho de la cadena del encabezado, y tan pronto como ve un espacio o una coma, deja de buscar y pega la parte a la derecha del espacio o la coma en la variable IP. Por lo tanto, trata la dirección proxy más reciente como la dirección del cliente original .
No está jugando bien según las especificaciones; Este es el peligro de no explicarlo en términos dolorosamente obvios en un RFC.
Aparte: es difícil incluso encontrar una buena fuente primaria en el formato, que fue originalmente definido por Squid: una excavación en su documentación confirma el pedido; el más a la izquierda es el cliente original, el más a la derecha es el anexo más reciente. Estoy muy tentado a agregar una [cita requerida] a esa página de wikipedia. Una edición anónima parece ser la autoridad de Internet sobre el tema.
Si es posible, ¿puede hacer que sus proxies intermedios dejen de agregarse al final del encabezado, dejándolo solo con la dirección real del cliente?
fuente
X-Forwarded-For
ya existe un. (es la dirección IP correcta del cliente) nginx se agrega la dirección IP de nuestro equilibrador de carga (el salto anterior) alX-Forwarded-For
encabezado. (presumiblemente agregando lo que ve como la "dirección remota") Si simplemente no hiciera eso, podría usar elX-Forwarded-For
encabezado como antes. (recientemente hemos estado migrando a nginx)proxy_pass
- e incluso entonces, solo cuando estáproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
en su lugar.X-Forwarded-For
encabezado con posiblemente la dirección del cliente original a la izquierda y posiblemente cualquier proxy anterior adjunto a eso. Por lo tanto, el proxy actualmente en servicio agregaría el proxy anterior (= iniciador) al final de esa lista y serviría elX-Forwarded-For
encabezado así aumentado al siguiente salto ascendente. Por supuesto, podrían haber elegido una redacción más obvia.X-Real-IP es la dirección IP del cliente real con el que está hablando el servidor (el cliente "real" del servidor), que, en el caso de una conexión proxy, es el servidor proxy. Es por eso que X-Real-IP contendrá la última IP en el encabezado X-Fordered-For.
fuente
X-Real-IP
regresaba dirección IP de mi propio servidor proxy cada vez sea útil?