El campo de encabezado HTTP X-Forwarded-For ( XFF ) es un método común 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 equilibrador de carga .
El X-Forwarded-For
encabezado de solicitud HTTP fue introducido por los desarrolladores del servidor proxy de almacenamiento en caché Squid . [ cita necesaria ]
X-Forwarded-For
También es un encabezado de correo electrónico que indica que un mensaje de correo electrónico fue reenviado desde una o más cuentas (probablemente automáticamente). [1]
Sin el uso de XFF u otra técnica similar, cualquier conexión a través del proxy revelaría sólo la dirección IP de origen del servidor proxy, convirtiendo efectivamente el servidor proxy en un servicio anónimo , haciendo así la detección y prevención de accesos abusivos significativamente más difícil que si la dirección IP de origen estaba disponible. La utilidad de XFF depende de que el servidor proxy informe verazmente la dirección IP del host original; Por esta razón, el uso eficaz de XFF requiere saber qué servidores proxy son confiables, por ejemplo, buscándolos en una lista blanca de servidores en cuyos mantenedores se puede confiar.
El formato general del campo es: [2]
X-Reenviado-Para: cliente, proxy1, proxy2
donde el valor es una lista de direcciones IP separadas por comas y espacios, la más a la izquierda es el cliente original y cada proxy sucesivo que pasó la solicitud agrega la dirección IP de donde recibió la solicitud. En este ejemplo, la solicitud pasó por proxy1 , proxy2 y luego proxy3 (no se muestra en el encabezado). proxy3 aparece como dirección remota de la solicitud.
Ejemplos: [3]
X-reenviado para: 203.0.113.195, 70.41.3.18, 150.172.238.178X-reenviado-para: 203.0.113.195X-reenviado-para: 2001:db8:85a3:8d3:1319:8a2e:370:7348
Debido a que el encabezado X-Forwarded-For no está formalmente estandarizado, existen algunas variaciones en el formato de la dirección IP. Por ejemplo, algunas implementaciones [ ¿cuáles? ] incluya el número de puerto de los clientes o incluya las direcciones IPv6 entre corchetes incluso sin el número de puerto, similar al formato del Forwarded
encabezado más nuevo. Ejemplos:
X-reenviado-para: 203.0.113.195:41237, 198.51.100.100:38523X-reenviado-para: [2001:db8::1a2b:3c4d]:41237, 198.51.100.100:26321X-reenviado-para: [2001:db8::aa:bb]
Los servidores proxy HTTP agregan o editan el encabezado X-Forwarded-For al reenviar una solicitud. El servidor agrega la dirección del cliente a un encabezado X-Forwarded-For existente separado por una coma, o crea un nuevo encabezado X-Forwarded-For con la dirección del cliente como valor.
Dado que es fácil falsificar un campo X-Forwarded-For, la información proporcionada debe usarse con cuidado. La dirección IP de la derecha es siempre la dirección IP que se conecta al último proxy, lo que significa que es la fuente de información más confiable. Los datos X-Fordered-For se pueden utilizar en un escenario de proxy directo o inverso. Si el servidor está detrás de un proxy inverso confiable y solo permite conexiones desde ese proxy, generalmente se puede asumir que el valor del encabezado es confiable.
Simplemente registrar el campo X-Forwarded-For no siempre es suficiente, ya que la última dirección IP del proxy en una cadena no está contenida en el campo X-Forwarded-For, sino que está en el encabezado IP real. Un servidor web debe registrar tanto la dirección IP de origen de la solicitud como la información del campo X-Forwarded-For para que esté completa.
RFC 7239 estandarizó un Forwarded
encabezado HTTP con un propósito similar pero con más funciones en comparación con el X-Forwarded-For
encabezado HTTP. [4] Un ejemplo de la Forwarded
sintaxis de un encabezado:
Reenviado: for=192.0.2.60;proto=http;by=203.0.113.43Reenviado: for="[2001:db8::1234]"
HAProxy define el protocolo PROXY que puede comunicar la dirección IP del cliente de origen sin utilizar el encabezado X-Forwarded-For
o Forwarded
. [5] Este protocolo se puede utilizar en múltiples protocolos de transporte y no requiere inspeccionar el protocolo interno, por lo que no se limita a HTTP.