Los encabezados de proxy HTTP, como X-Forwarded-For y Via, son utilizados por los servidores proxy para transmitir información sobre el cliente original, la ruta de la solicitud y otros datos contextuales al servidor ascendente, que de otro modo quedarían ocultos por la presencia del proxy.
Cuando una solicitud HTTP pasa a través de uno o más servidores proxy, el servidor ascendente inmediato normalmente ve la dirección IP del último proxy, no la del cliente original. Los encabezados de proxy abordan esto añadiendo o modificando encabezados HTTP específicos, permitiendo que la IP, el protocolo, el host del cliente original y la secuencia de proxies se comuniquen al servidor de destino final.
X-Forwarded-For
El encabezado X-Forwarded-For (XFF) es un encabezado estándar de facto utilizado para identificar la dirección IP de origen de un cliente que se conecta a un servidor web a través de un proxy HTTP o un balanceador de carga.
Propósito
Su propósito principal es permitir que el servidor web acceda a la dirección IP del cliente original para fines de registro, análisis, seguridad y lógica específica de la aplicación (por ejemplo, control de acceso basado en IP, geolocalización). Sin XFF, todas las solicitudes parecerían originarse desde la dirección IP del servidor proxy.
Formato y Ejemplos
El encabezado XFF puede contener una lista de direcciones IP separadas por comas. Cuando una solicitud pasa a través de múltiples proxies, cada proxy añade la dirección IP del cliente que se conectó a él al encabezado XFF.
X-Forwarded-For: <cliente>, <proxy1>, <proxy2>
Ejemplo 1: Proxy Único
Un cliente (192.0.2.1) se conecta a un proxy (198.51.100.1), que luego se conecta al servidor de origen.
El proxy añade:
X-Forwarded-For: 192.0.2.1
El servidor de origen ve la solicitud proveniente de 198.51.100.1 y X-Forwarded-For: 192.0.2.1.
Ejemplo 2: Múltiples Proxies
Un cliente (192.0.2.1) se conecta al Proxy A (198.51.100.1), que se conecta al Proxy B (203.0.113.1), que luego se conecta al servidor de origen.
1. Cliente a Proxy A: El Proxy A añade X-Forwarded-For: 192.0.2.1.
2. Proxy A a Proxy B: El Proxy B recibe X-Forwarded-For: 192.0.2.1. El Proxy B le añade 198.51.100.1.
El encabezado se convierte en: X-Forwarded-For: 192.0.2.1, 198.51.100.1.
3. Proxy B a Servidor de Origen: El servidor de origen recibe X-Forwarded-For: 192.0.2.1, 198.51.100.1.
En una cadena de proxies, la dirección IP más a la izquierda es típicamente la del cliente original. La dirección IP más a la derecha es la IP del proxy ascendente inmediato (el cliente que se conectó al proxy actual).
Consideraciones de Seguridad para X-Forwarded-For
El encabezado X-Forwarded-For puede ser fácilmente falsificado por un cliente malicioso. Un cliente puede enviar una solicitud con un encabezado X-Forwarded-For fabricado.
GET / HTTP/1.1
Host: example.com
X-Forwarded-For: 10.0.0.1, 1.1.1.1
Si un proxy simplemente lo añade, el encabezado recibido por el servidor de origen podría verse como X-Forwarded-For: 10.0.0.1, 1.1.1.1, <ip_del_proxy>.
Por lo tanto, las aplicaciones descendentes no deben confiar directamente en todo el valor del encabezado X-Forwarded-For. La práctica generalmente aceptada es confiar solo en la dirección IP no confiable más a la derecha de la lista como la IP real del cliente, después de eliminar cualquier entrada que pertenezca a proxies de confianza conocidos. Muchos servidores web y frameworks de aplicaciones proporcionan mecanismos para especificar una lista de proxies de confianza.
Via
El encabezado Via es un encabezado HTTP estándar que indica los proxies y gateways intermedios por los que ha pasado una solicitud (o respuesta).
Propósito
El encabezado Via tiene varios propósitos:
* Trazabilidad: Proporciona un rastro de la cadena de proxies, útil para depurar rutas de red.
* Detección de Bucles: Puede ayudar a detectar bucles de solicitud en cadenas de proxies.
* Compatibilidad de Protocolo: Señala las versiones de protocolo utilizadas por cada proxy intermedio, lo que puede ser relevante para las conversiones de protocolo.
Formato y Ejemplos
Cada proxy añade su propia entrada Via al encabezado. El formato para cada entrada es nombre-protocolo/versión-protocolo host:puerto (comentario). El campo comentario es opcional y puede contener información arbitraria.
Via: <nombre-protocolo>/<versión-protocolo> <host>:<puerto> (comentario)
Ejemplo:
Un cliente envía una solicitud que pasa por el Proxy A (nombre de host proxy-a.example.com, puerto 8080) y el Proxy B (nombre de host proxy-b.example.com, puerto 80).
- Cliente a Proxy A: El Proxy A añade
Via: HTTP/1.1 proxy-a.example.com:8080. - Proxy A a Proxy B: El Proxy B recibe
Via: HTTP/1.1 proxy-a.example.com:8080. El Proxy B antepone su propia entrada.
El encabezado se convierte en:Via: 1.1 proxy-b.example.com, 1.1 proxy-a.example.com:8080.
(Nota:HTTP/a menudo se omite si es HTTP, y el puerto 80/443 podría omitirse). - Proxy B a Servidor de Origen: El servidor de origen recibe el encabezado
Viacompleto.
Consideraciones de Privacidad y Operativas
El encabezado Via expone la topología de red interna y los nombres de host, lo que podría ser una preocupación de seguridad o privacidad en algunas implementaciones. Las organizaciones podrían optar por eliminar o modificar este encabezado para proxies orientados al exterior para evitar la divulgación de la red interna.
Forwarded
El encabezado Forwarded es un encabezado estandarizado definido en la RFC 7239, destinado a reemplazar los encabezados de facto X-Forwarded-For, X-Forwarded-Host y X-Forwarded-Proto.
Propósito
Proporciona una forma más estructurada y extensible de transmitir información sobre el cliente original, el propio proxy y el contexto de la solicitud original (host, protocolo) al servidor ascendente.
Formato y Ejemplos
El encabezado Forwarded puede contener uno o más conjuntos de parámetros, separados por comas, que representan cada proxy en la cadena. Cada conjunto de parámetros utiliza pares clave-valor. Los parámetros comunes incluyen:
* for: La dirección IP (o identificador ofuscado) del cliente original.
* by: La dirección IP (o identificador ofuscado) del proxy que reenvió la solicitud.
* host: El encabezado Host original solicitado por el cliente.
* proto: El protocolo original (por ejemplo, http o https) utilizado por el cliente.
Forwarded: for=<ip_cliente>; proto=<protocolo>; host=<host_original>
Forwarded: for=<ip_cliente>, for=<ip_proxy>; proto=<protocolo>
Ejemplo 1: Proxy Único
Un cliente (192.0.2.1) se conecta vía HTTPS a un proxy (198.51.100.1) solicitando example.com.
El proxy añade:
Forwarded: for=192.0.2.1; proto=https; host=example.com
Ejemplo 2: Múltiples Proxies
Cliente (192.0.2.1) -> Proxy A (198.51.100.1) -> Proxy B (203.0.113.1) -> Servidor de Origen.
1. Cliente a Proxy A: El Proxy A añade Forwarded: for=192.0.2.1; proto=https; host=example.com.
2. Proxy A a Proxy B: El Proxy B recibe el encabezado. El Proxy B añade su propia entrada, incluyendo by para identificarse.
El encabezado se convierte en:
Forwarded: for=192.0.2.1; proto=https; host=example.com, for=198.51.100.1; by=203.0.113.1
(Nota: Los parámetros host y proto suelen incluirse solo en la primera entrada para el cliente original, a menos que un proxy realice una reescritura de protocolo o host).
Comparación: X-Forwarded-For vs. Forwarded
| Característica | X-Forwarded-For |
Forwarded |
|---|---|---|
| Estado Estándar | Estándar de facto (encabezado X- no estándar) |
Estándar RFC 7239 |
| Información | Solo direcciones IP del cliente | IP del cliente, IP del proxy (by), host original, protocolo original (proto) |
| Estructura | Lista de direcciones IP separadas por comas | Lista de conjuntos de parámetros clave-valor estructurados, separados por comas |
| Extensibilidad | Limitada a direcciones IP | Altamente extensible con parámetros adicionales |
| Adopción | Ampliamente soportado por software e infraestructura existentes | Adopción creciente, pero menos ubicuo que XFF actualmente |
| Seguridad | Vulnerable a la suplantación; requiere un análisis cuidadoso | Todavía vulnerable a la suplantación; el análisis estructurado ayuda a la robustez |
Otros Encabezados de Proxy
X-Forwarded-Host
Este encabezado de facto identifica el Host original solicitado por el cliente en el encabezado de solicitud HTTP Host. Es útil cuando un proxy o balanceador de carga modifica el encabezado Host (por ejemplo, para enrutamiento interno) antes de reenviar la solicitud al servidor ascendente, pero la aplicación necesita conocer el host original solicitado por el cliente para tareas como generar URL absolutas o manejar hosts virtuales.
Ejemplo:
El cliente solicita example.com. El proxy reenvía al host interno app-server-1.
Host: app-server-1
X-Forwarded-Host: example.com
X-Forwarded-Proto
Este encabezado de facto identifica el protocolo (HTTP o HTTPS) que el cliente utilizó para conectarse al proxy o balanceador de carga. Esto es crucial cuando el proxy realiza la terminación SSL/TLS, lo que significa que el cliente se conecta a través de HTTPS, pero el proxy se comunica con el servidor backend a través de HTTP simple. La aplicación necesita conocer el protocolo original para generar enlaces correctos (por ejemplo, https:// en lugar de http://).
Ejemplo:
El cliente se conecta vía HTTPS a un balanceador de carga. El balanceador de carga se conecta vía HTTP al backend.
X-Forwarded-Proto: https
X-Real-IP
Este es otro encabezado de facto, comúnmente utilizado por NGINX, para transmitir la dirección IP del cliente original. A diferencia de X-Forwarded-For, típicamente contiene solo una dirección IP, la del cliente original o la del proxy de confianza ascendente inmediato. A menudo lo establece el primer proxy en una cadena después de validar el encabezado X-Forwarded-For.
Ejemplo:
X-Real-IP: 192.0.2.1
Implicaciones Prácticas y Casos de Uso
Los encabezados de proxy son fundamentales para el correcto funcionamiento y la seguridad en las arquitecturas web modernas que involucran proxies, balanceadores de carga y CDNs.
- Registro y Análisis: Las direcciones IP precisas del cliente son esenciales para los registros de acceso del servidor web, el análisis de tráfico y el seguimiento del comportamiento del usuario.
- Seguridad:
- Control de Acceso Basado en IP: Restringir el acceso a ciertos recursos basándose en las direcciones IP del cliente.
- Limitación de Tasa: Prevenir abusos o ataques DDoS limitando las solicitudes por IP de cliente.
- Firewalls de Aplicaciones Web (WAFs): Aplicar reglas de seguridad basadas en la identidad del cliente original.
- Geolocalización: Determinar la ubicación geográfica de un usuario para la personalización de contenido o el cumplimiento normativo.
- Lógica de la Aplicación:
- Generación de URL: Las aplicaciones necesitan
X-Forwarded-HostyX-Forwarded-Protopara construir URL absolutas correctas (por ejemplo, para redirecciones o enlaces dentro de la aplicación) que coincidan con la solicitud original del cliente. - Gestión de Sesiones: Algunos mecanismos de sesión pueden estar vinculados a direcciones IP.
- Aplicaciones Multi-inquilino: Distinguir inquilinos basándose en el encabezado
Hostoriginal.
- Generación de URL: Las aplicaciones necesitan
- Depuración y Resolución de Problemas: El encabezado
Viay la cadena completa deX-Forwarded-Forpueden ayudar a diagnosticar problemas de ruta de red e identificar proxies problemáticos.
Configuración de Proxy y Mejores Prácticas de Seguridad
Configurar los proxies para manejar correctamente estos encabezados es crucial.
- Límites de Confianza: Confíe solo en las entradas
X-Forwarded-For(oForwarded) de proxies ascendentes conocidos y de confianza. Implemente lógica para analizar el encabezado, identificar las IP de proxy de confianza y derivar la verdadera IP del cliente de la entrada no confiable más a la derecha. - Eliminación/Sanitización de Encabezados: Para proxies orientados al exterior, considere eliminar o sanitizar los encabezados
Viay cualquier encabezadoX-personalizado interno para evitar la divulgación de información sobre la topología de la red interna. - Consistencia: Asegúrese de que todos los proxies y balanceadores de carga en una cadena estén configurados de manera consistente para añadir o establecer estos encabezados correctamente.
- Estándar vs. Personalizado: Si bien
Forwardedes el estándar,X-Forwarded-For,X-Forwarded-HostyX-Forwarded-Protosiguen siendo ampliamente utilizados. Las implementaciones a menudo soportan ambos o priorizan el encabezadoForwardedsi está presente.