Resumen
- Al obtener la "IP real del cliente" desde el encabezado X-Forwarded-For, se debe usar la IP más a la derecha
- La IP más a la izquierda en el encabezado XFF suele considerarse la "más cercana al cliente" y "casi real", pero se puede falsificar (
spoofable). No debe usarse para nada relacionado con seguridad
- Al seleccionar la IP XFF más a la derecha, se debe usar la última instancia de ese encabezado
- Los valores de "True Client IP" establecidos por el reverse proxy (
X-Real-IP, True-Client-IP, etc.) también pueden ser útiles, pero
- depende de cómo el reverse proxy establezca ese valor
- no se sabe si el propio reverse proxy ya fue engañado (
spoofed)
- depende de cómo esté configurado el reverse proxy
- No se puede confiar en encabezados que el reverse proxy no haya configurado explícitamente
- Por ejemplo, si no está detrás de Nginx o no está configurado para establecer siempre ese encabezado, no se debe leer
X-Real-IP. De lo contrario, podrías leer un valor falsificado
- Muchas implementaciones de rate limiter usan IPs falsificables y son vulnerables a evasión de rate limiting y ataques de agotamiento de memoria
- Si en tu código o infraestructura estás usando algo relacionado con la "IP real del cliente", revisa el contenido técnico que sigue
Detalle (como es largo, solo se trasladan los títulos)
- Introducción: averiguar la "IP real del cliente" hoy en día es terrible
- Trampas
- No se puede confiar en los encabezados
- Múltiples encabezados
- IP privadas
- División de IP
- Nunca se puede confiar en datos no cifrados
- Cosas como
X-Client-IP y True-Client-IP se pueden falsificar
- Entender
X-Forwarded-For
- Cómo evitar las trampas
- Algoritmo para obtener la IP real
- Obtener todos los valores de IP
- Elegir cuál usar según el nivel de seguridad
- La más a la izquierda, la más a la derecha
- Ejemplos prácticos
- Cloudflare, Nginx, Apache
- Akamai
- Fastly
- Azure
- go-chi/chi
- didip/tollbooth
- ulule/limiter
- sethvargo/go-limiter
- Let's Encrypt
- Express
- Traefik
- phpList
- IIS
- Tor
- Avanzado: trampas teóricas y métodos de ataque
- RFC 7239: Forwarded HTTP Extension, June 2014
3 comentarios
Creo que esta parte está ligeramente mal traducida. El original dice lo siguiente.
Por ejemplo, si no estás detrás de Nginx o no está configurado para establecer siempre el encabezado, no debes leer el encabezado X-Real-IP. Esto se debe a que terminarás leyendo un valor falsificado.
Ah, lo corregiré. ¡Gracias!
Normalmente, el método común es usar la variable de entorno
TRUSTED_PROXYpara ir descartando uno por uno, desde la derecha, los proxies "confiables", y usar la primera IP que aparezca.También se suele tratar a las IP internas (192.168.0.0/16), entre otras, como proxies confiables.