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"
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;
}
- El equilibrador de carga agrega el campo
X-Forwarded-For
con la IP del cliente
X-Forwarded-For
=aaaa
- NGinx busca el IP real del cliente en el encabezado
X-Forwarded-For
al omitir LB IP (bbbb
) y cambiar$remote_addr
debbbb
aaaaa
entoncesproxy_set_header X-Real-IP $remote_addr
hace realidad (OK, eso es lo que quiero!)
PERO, NGinx también completa el encabezadoX-Forwarded-For
conaaaa
IP en lugar debbbb
- WEBAPP recibe los siguientes encabezados:
X-Forwarded-For
=aaaa, aaaa
X-Real-IP
=aaaa
->X-Forwarded-For
debería seraaaa, 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