Nginx reemplaza REMOTE_ADDR con X-Forwarded-For

2 minutos de lectura

Soy bastante nuevo en Nginx, y parece todo muy confuso. Tengo mi servidor configurado perfectamente, pero el problema es que mi servidor está protegido mediante un proxy HTTP; en lugar de registrar las IP de los usuarios reales, está registrando la IP del servidor proxy.

Lo que intenté hacer fue configurar $_SERVER['REMOTE_ADDR']; a $_SERVER['X-Forwarded-For']; pero recibo un error de índice indefinido, así que supongo que tengo que definir X-Forwarded-For en Nginx? Pero no sé cómo hacerlo, tengo una configuración simple, es solo Nginx con PHP. Nada más y nada menos.

He buscado en toda la web, pero en realidad no puedo encontrar información que sea fácil de entender.

Tengo acceso al código fuente, si eso ayuda un poco. He intentado muchas soluciones, pero fue en vano.

La forma correcta de hacerlo es configurando el real_ip_header configuración en nginx.

Ejemplo con IP de proxy HTTP de confianza:

set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;

De esta forma, el $_SERVER[‘REMOTE_ADDR’] se llenará correctamente en PHP fastcgi.

Enlace de documentación – nginx.org

  • He estado buscando EN TODAS PARTES una solución que realmente funcione. ¡¡¡¡Muchas gracias!!!! ¡IMPRESIONANTE! Simplemente colóquelo en su… servidor { ubicación ~ \.php$ { sección de bloque. y todo funciona!!!! ¡GRAN TRABAJO!

    – CGris

    08/07/2015 a las 15:50


  • usar 0.0.0.0/0 y ::/0 para hacer coincidir todas las direcciones IP

    – pravdomil

    3 de julio de 2018 a las 15:58

avatar de usuario de fredrik
fredrick

$http_x_forwared_for puede contener varias direcciones IP, donde la primera debe ser la IP del cliente. REMOTE_ADDR solo debe ser la ip del cliente.

Entonces, al usar expresiones regulares en su nginx.confpuede establecer REMOTE_ADDR a la primera ip de $http_x_forwarded_for al igual que:

  set $realip $remote_addr;
  if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
    set $realip $1;
  }
  fastcgi_param REMOTE_ADDR $realip;

  • Como no es posible utilizar set directiva en http bloque, podría ser mejor usar map en cambio.

    – antonbormotov

    5 de diciembre de 2018 a las 10:47

  • ¡Esto no funciona como está y no admite direcciones IPv6!

    – LassePoulsen

    22 de julio de 2020 a las 9:01

  • @LassePoulsen sí, esta expresión regular solo funciona para ipv4, pero estoy seguro de que sería posible modificarla para ipv6. ¿Qué más no está funcionando “como está”?

    – Fredrik

    22 de julio de 2020 a las 11:19


avatar de usuario de antonbormotov
antonbormotov

Una adición a la respuesta de @ fredrik.
Tal vez sea mejor establecer $real_ip usando map directiva:

map $http_x_forwarded_for $real_ip {
        ~^(\d+\.\d+\.\d+\.\d+) $1;
        default $remote_addr;
    }

Luego, establezca fastcgi_param REMOTE_ADDR en fastcgi_params archivo o un bloque de ubicación:

fastcgi_param  REMOTE_ADDR          $real_ip;

editar: error tipográfico corregido en el nombre de la variable

Resolví mi propio problema, dado que PHP se filtra a través de FastCGI, simplemente agregué un parámetro CGI rápido que configuró REMOTE_ADDR a la variable http_x_forwarded_forentonces algo similar a esto:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;

¿Ha sido útil esta solución?