xff real proxy_set_header proxy_pass http_x_forwarded_for nginx http-headers

real - proxy_set_header nginx



NGinx $ proxy_add_x_forwarded_for y real_ip_header (3)

$ proxy_add_x_forwarded_for es igual a "$ http_x_forwarded_for, $ remote_addr", y la variable $ remote_addr se cambiará cuando se use http_realip_module, por lo que no obtendrá la última dirección proxy en ese encabezado, cambiando el orden de las directivas no tendrá efecto porque simplemente cambian las opciones que determinan cómo nginx maneja las solicitudes.

mientras se usa http_realip_module, la variable $ realip_remote_addr se puede usar como la dirección remota real conectada, puede configurar su encabezado para reenvío x de esta manera:

proxy_set_header X-Forwarded-For "$http_x_forwarded_for,$realip_remote_addr"

explicación de la variable $ realip_remote_addr

Tengo una aplicación web bajo NGinx y otro balanceador de carga frontal, algo como abajo (xxxx = dirección IP):

Cliente (aaaa) -> LB (bbbb) -> NGX (cccc) -> WEBAPP (dddd)

Aquí hay un fragmento de mi configuración NGinx:

location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; real_ip_header X-Forwarded-For; set_real_ip_from b.b.b.b; real_ip_recursive on; }

  1. El equilibrador de carga agrega el campo X-Forwarded-For con la IP del cliente
    X-Forwarded-For = aaaa
  2. NGinx busca el IP real del cliente en el encabezado X-Forwarded-For al omitir LB IP ( bbbb ) y cambiar $remote_addr de bbbb a aaaa entonces proxy_set_header X-Real-IP $remote_addr hace realidad (OK, eso es lo que quiero!)
    PERO, NGinx también completa el encabezado X-Forwarded-For con aaaa IP en lugar de bbbb
  3. WEBAPP recibe los siguientes encabezados:
    X-Forwarded-For = aaaa, aaaa
    X-Real-IP = aaaa
    -> X-Forwarded-For debería ser aaaa, bbbb

Lo que necesito es la capacidad de configurar el primer proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for y luego buscar IP real y reemplazar el valor de $remote_addr .

¿Alguien me puede ayudar a resolver este problema?


El mismo problema aqui. Es molesto, y no estoy realmente seguro de si esto es una característica o error :)

Sé que no es una solución, pero eliminé real_ip_header , y simplemente uso X-Forwarded-For first ipaddress para obtener la dirección IP del cliente donde sea que lo necesite (por ejemplo, los registros).


Recientemente encontré el mismo "problema" y llegué a la conclusión de que este comportamiento es causado por el real_ip_recursive on; directiva.

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 de confianza se reemplaza por la última dirección no confiable enviada en el campo del encabezado de la solicitud.

Ha especificado confiar en bbbb (debido a su set_real_ip_from bbbb;

Entonces, lo que esperas, es decir, aaaa, bbbb será reemplazado por aaaa, aaaa .

La fuente que me aclaró esto es: https://serverfault.com/questions/314574/nginx-real-ip-header-and-x-forwarded-for-seems-wrong