Se trata de HTTP keep-alive, que permite que múltiples solicitudes de recursos lleguen a través de una sola sesión TCP (y, con SSL, una sola sesión SSL). Esto es de gran importancia para el rendimiento de un sitio SSL, ya que sin mantener vivo, se necesitaría un protocolo de enlace SSL para cada recurso solicitado.
Entonces, la preocupación aquí es una gran sesión de mantenimiento desde el cliente hasta el servidor de fondo. Es una cosa importante para el rendimiento, y se toma como una rutina para los servidores HTTP modernos, pero este parche dice que no es compatible. Veamos por qué ...
Una sesión de mantenimiento es solo más solicitudes una tras otra: una vez que el servidor finaliza su respuesta a una solicitud, el servidor no envía un FIN
paquete para finalizar la sesión TCP; el cliente simplemente puede enviar otro lote de encabezados.
Para comprender qué está haciendo ese parche, aquí hay un ejemplo de una conversación para mantener vivo:
Cliente:
GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Servidor:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>
Aquí es donde se detendría una conexión que no se mantiene viva. Pero, keep-alive permite al cliente disparar a otro:
GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Para la identificación del cliente en el proxy, algunos proxy inversos pueden agregar el X-Forwarded-For
encabezado en cada solicitud del cliente. Eso le dice al servidor ascendente de dónde proviene la solicitud (en lugar de que cada solicitud se inicie desde la IP del proxy inverso), para la cordura en el registro y otras necesidades de aplicación.
El X-Forwarded-For
encabezado debe inyectarse en todas y cada una de las solicitudes de recursos del cliente enviadas a través de la conexión de mantenimiento, ya que los encabezados completos se envían cada vez; el manejo del X-Forwarded-For
encabezado y la traducción a él como la solicitud "real" IP se realiza por solicitud, no por sesión de TCP-keep-alive. Y oye, tal vez hay un increíble software de proxy inverso que usa una sola sesión de mantenimiento para atender solicitudes de múltiples clientes.
Aquí es donde falla este parche.
El parche en ese sitio observa el búfer de la sesión TCP para el final del primer conjunto de encabezados HTTP en la secuencia e inyecta el nuevo encabezado en la secuencia después del final de ese primer conjunto de encabezados. Una vez hecho esto, considera el X-Forwarded-For
trabajo realizado y deja de buscar el final de nuevos conjuntos de encabezados. Este método no tiene conocimiento de todos los encabezados futuros que lleguen a través de solicitudes posteriores.
Realmente no puedo culparlos; Stunnel no fue realmente creado para manejar y traducir el contenido de sus transmisiones.
El efecto que esto tendría en su sistema es que la primera solicitud de una secuencia de mantenimiento mantendrá el X-Forwarded-For
encabezado inyectado correctamente, y todas las solicitudes posteriores funcionarán bien, pero no tendrán el encabezado.
A menos que exista otro parche de inyección de encabezado que pueda manejar múltiples solicitudes de clientes por conexión (u obtener este ajustado con la ayuda de nuestros amigos en Stack Overflow), es posible que deba buscar otras opciones para su terminación SSL.
STunnel 4.45 corrige esto correctamente usando algunas capacidades nuevas (protocolo proxy) que vienen con HAProxy 1.15
También soluciona los problemas con parches anteriores y Keep Alive
fuente
Similar a lo que publiqué en otro hilo, HAProxy admite SSL nativo en ambos lados desde 1.5-dev12. Entonces, tener X-Fordered-For, HTTP keep-alive y un encabezado que le dice al servidor que la conexión se realizó a través de SSL es tan simple como lo siguiente:
Es mucho más fácil que parchear stunnel y mucho mejor que tener que dejar de mantener vivo.
fuente
Extendiendo la excelente respuesta de Shane, podría usar Nginx como terminador SSL frente a HAproxy. Maneja correctamente keep-alive entre el cliente y nginx, que es el lado más sensible a la latencia y hace una nueva conexión al back-end para cada solicitud del cliente, enviando el X-FORWARDED-FOR en cada uno.
fuente