≡En resumen
- X-Forwarded-For transporta la IP del cliente original cuando la petición atraviesa proxies, balanceadores o una CDN.
- Cada proxy añade al final de la lista la IP de quien le ha conectado: la primera es el cliente y la última, el proxy más reciente.
- El cliente puede escribir lo que quiera en la cabecera, así que solo son fiables las IP añadidas por tus propios proxies.
- Para usos de seguridad (bloqueos, límites de peticiones) lee la lista desde la derecha y salta los proxies de confianza.
- La cabecera estandarizada es Forwarded (RFC 7239), pero X-Forwarded-For sigue siendo mucho más usada.
01 ¿Qué es X-Forwarded-For?
La cabecera la crearon los desarrolladores de Squid, un proxy caché muy extendido en los años noventa y dos mil. Nunca llegó a ser un estándar oficial: el prefijo X- se usaba para cabeceras experimentales o propietarias. Aun así, la adoptaron casi todos los proxies, servidores y CDN, y hoy es un estándar de facto. En junio de 2014 el IETF publicó el RFC 7239, que define la cabecera Forwarded como versión normalizada.
Cuando la gente busca «x forwarded» suele referirse a esta cabecera o a su familia: X-Forwarded-For para la IP, X-Forwarded-Proto para el protocolo y X-Forwarded-Host para el dominio original.
02 ¿Para qué sirve la cabecera X-Forwarded-For?
Cuando hay un intermediario, la conexión TCP que ve tu servidor es la del proxy, no la del visitante. Sin XFF, todos los registros mostrarían la misma IP, la de tu balanceador o tu CDN. La cabecera sirve para recuperar ese dato en tareas como estas:
Logs y analítica
Registrar la IP real de cada visita en los logs de acceso en lugar de la del proxy.
Seguridad
Limitar peticiones por IP, bloquear atacantes o aplicar listas de acceso tras un balanceador.
Geolocalización
Mostrar idioma, moneda o contenido según el país del visitante.
Depuración
Seguir el recorrido de una petición a través de varios proxies para localizar un fallo.
Análisis SEO de logs
Distinguir las visitas reales de Googlebot de los bots que se hacen pasar por él, comprobando la IP de origen.
03 Sintaxis de X-Forwarded-For y ejemplos
La cabecera contiene una lista de IP separadas por comas. Según la documentación de MDN, la IP más a la izquierda es la del cliente original y la más a la derecha, la del proxy más reciente, siempre que el cliente y los proxies se comporten correctamente. Cada proxy añade al final la IP desde la que recibió la conexión; no la pone al principio.
X-Forwarded-For: 203.0.113.195, 2001:db8:85a3:8d3:1319:8a2e:370:7348, 198.51.100.178
El cliente es 203.0.113.195. El primer proxy tiene la IPv6 2001:db8:85a3:8d3:1319:8a2e:370:7348 y el último, 198.51.100.178. La IP del proxy que conecta directamente con tu servidor no aparece en la cabecera: la ves como dirección remota de la conexión.
| Salto | Quién conecta | Valor de X-Forwarded-For que se envía |
|---|---|---|
| 1 | Navegador (203.0.113.195) → CDN | Sin cabecera (o lo que el cliente haya inventado) |
| 2 | CDN (198.51.100.10) → balanceador | 203.0.113.195 |
| 3 | Balanceador (10.0.0.5) → servidor web | 203.0.113.195, 198.51.100.10 |
| 4 | El servidor lee la conexión | Dirección remota: 10.0.0.5 |
04 Cómo obtener la IP real del cliente de forma segura
Cualquiera puede enviar una cabecera X-Forwarded-For falsa desde su navegador o con un script. Tu proxy no la borra: añade su dato al final. Por eso la primera IP de la lista no es de fiar. MDN distingue dos casos:
| Uso | Qué IP tomar | ¿Es fiable? |
|---|---|---|
| Estadísticas, idioma, personalización | La primera IP válida y pública empezando por la izquierda | No: puede estar falsificada |
| Seguridad con número de proxies conocido | Contar desde la derecha tantas posiciones como proxies tengas menos una | Sí, si todos los proxies son tuyos |
| Seguridad con lista de proxies de confianza | Recorrer desde la derecha saltando las IP de tus proxies; la primera que no esté en la lista | Sí |
- ✓Nunca uses la IP más a la izquierda para bloquear, limitar peticiones o dar acceso.
- ✓Configura en tu servidor o framework la lista de proxies de confianza.
- ✓Valida que cada valor sea una IP real: los valores falsificados pueden ser texto cualquiera.
- ✓Descarta IP privadas (10.x, 192.168.x, 172.16-31.x) al buscar la IP pública del cliente.
- ✓Recuerda que la IP es un dato personal: trátala conforme al RGPD en tus logs.
05 Configurar X-Forwarded-For en Nginx, Apache, Laravel y Cloudflare
-
1
Nginx como proxy inverso
Reenvía la cabecera con proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; esta variable añade la IP del cliente a la cabecera recibida.
-
2
Nginx como servidor final
Con el módulo ngx_http_realip_module usa set_real_ip_from con las IP de tus proxies, real_ip_header X-Forwarded-For y real_ip_recursive on para tomar la última IP que no sea de confianza. El módulo no se compila por defecto.
-
3
Apache
El módulo mod_remoteip sustituye la IP remota con RemoteIPHeader X-Forwarded-For y RemoteIPTrustedProxy o RemoteIPInternalProxy para declarar los proxies fiables.
-
4
Laravel
Declara los proxies con trustProxies en bootstrap/app.php; después, $request->ip() devuelve la IP del cliente calculada con esa lista.
-
5
Cloudflare y balanceadores cloud
Cloudflare añade X-Forwarded-For y su propia cabecera CF-Connecting-IP; los balanceadores de AWS o Google Cloud también añaden la IP del cliente al final de la lista.
En proyectos de desarrollo de aplicaciones web a medida este ajuste se olvida con frecuencia: el resultado son logs con una sola IP, límites de peticiones que bloquean a todos los usuarios a la vez o formularios antispam que no funcionan. Si además sirves la web con una CDN para la optimización de la velocidad web, revisa la configuración antes de publicar.
06 X-Forwarded-For vs. Forwarded vs. X-Real-IP
| Cabecera | Qué transmite | Estándar | Ejemplo |
|---|---|---|---|
| X-Forwarded-For | IP del cliente y de cada proxy | De facto (Squid) | X-Forwarded-For: 192.0.2.60, 198.51.100.17 |
| Forwarded | IP (for), proxy (by), host y protocolo en una sola cabecera | RFC 7239 (2014) | Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43 |
| X-Real-IP | Una sola IP: la del cliente según el proxy | De facto (habitual en Nginx) | X-Real-IP: 192.0.2.60 |
| X-Forwarded-Proto | Protocolo original (http o https) | De facto | X-Forwarded-Proto: https |
| X-Forwarded-Host | Dominio que pidió el cliente | De facto | X-Forwarded-Host: www.ejemplo.com |
El RFC 7239, firmado por Andreas Petersson y Martin Nilsson, reconoce que la forma habitual de dar esta información son cabeceras no estándar como X-Forwarded-For, X-Forwarded-By y X-Forwarded-Proto, y propone Forwarded para unificarlas. En la práctica, MDN señala que Forwarded se usa mucho menos. X-Forwarded-Proto es clave para que una aplicación detrás de un proxy sepa que la visita llegó por HTTPS y no genere redirecciones infinitas.
07 Riesgos de seguridad y privacidad de X-Forwarded-For
Suplantación de IP
Un atacante envía una IP falsa en la cabecera para saltarse un bloqueo o hacerse pasar por una IP permitida.
Evitar límites de peticiones
Si el rate limiting usa la primera IP, basta con cambiarla en cada petición para no ser bloqueado nunca.
Inyección en logs
Valores que no son IP pueden romper el análisis de logs o colar datos maliciosos en paneles de administración.
Exposición de datos
La cabecera revela IP internas y la del usuario a cada servidor de la cadena, algo a tener en cuenta en privacidad.
Preguntas frecuentes sobre X-Forwarded-For
Es una cabecera HTTP que añaden los proxies, balanceadores y CDN para indicar la IP del cliente original y de los intermediarios por los que pasa una petición.
«Forwarded» significa reenviado. Las cabeceras X-Forwarded-* informan de datos de la petición original que se pierden al reenviarla: la IP (For), el protocolo (Proto) o el dominio (Host).
La primera IP de la izquierda es la que dice ser el cliente, pero puede estar falsificada. Para usos de seguridad toma la IP añadida por tu primer proxy de confianza, leyendo la lista desde la derecha.
Sí. El cliente puede enviar la cabecera con cualquier valor y los proxies solo añaden datos al final. Solo son fiables las IP que añaden proxies que controlas.
Forwarded es la versión estandarizada en el RFC 7239 de 2014 y agrupa IP, proxy, host y protocolo en una cabecera. X-Forwarded-For es anterior, no estándar y mucho más usada.
X-Forwarded-For es una lista con el cliente y todos los proxies; X-Real-IP contiene una única IP, la que el proxy considera del cliente.
Sí. Contiene direcciones IP, que en la Unión Europea se consideran datos personales, así que su registro y conservación deben cumplir el RGPD.
Fuentes consultadas
Sobre el autor
Germán Gutiérrez
Development Manager en appyweb
Dirige el equipo de desarrollo de appyweb: aplicaciones web y móviles, SaaS, integraciones y arquitectura de software.
Ver perfil en LinkedIn ↗