5 votos

Riesgos de habilitar keepalive de upstream de nginx

Usando nginx como proxy inverso HTTP para Apache con backend PHP (Necesito flexibilidad en .htaccess para los webmasters). Al ver que se usaba http/1.0 en los registros de Apache, busqué cómo habilitar la conexión keep-alive.

En mi búsqueda encontré esta publicación en el blog de Nginx https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives

Por defecto, NGINX abre una nueva conexión a un servidor upstream (backend) para cada nueva solicitud entrante. Esto es seguro pero ineficiente,[...]

Si el comportamiento por defecto es seguro, ¿cuáles son los riesgos de habilitar el keepalive en el upstream?

10voto

user439407 Puntos 106

La intermediación de una conexión con keepalive se considera un riesgo debido a los ataques de desincronización HTTP / contrabando de solicitudes. Esto ocurre cuando el backend no divide las diferentes solicitudes de clientes de la misma manera exacta que el frontend. Cerrar la conexión después de cada solicitud es la opción "segura", ya que esto delimita claramente cuándo ha terminado la solicitud actual.

Consulte https://book.hacktricks.xyz/pentesting-web/http-request-smuggling para obtener más información.

1voto

Ary09 Puntos 13

Como ya mencioné, KeepAlive es una optimización para almacenar en caché la conexión. Es para soportar un tráfico de alto rendimiento. No veo ningún riesgo al habilitarlo, de hecho, tendría mejores resultados en cualquier caso.

-1voto

Ary09 Puntos 13

El comportamiento por defecto, la creación de una conexión con el servidor upstream para cada solicitud no es seguro para cargas pesadas. Debido a las siguientes razones:

  1. una vez que una solicitud llega al servidor nginx desde el mismo cliente, este creará una nueva conexión con el servidor upstream, para lo cual utilizará el nuevo puerto local disponible.
  2. Una vez que completa la solicitud, la conexión en ese puerto local pasará de establecida a TIME_WAIT durante 120 segundos, lo que significa que durante 120 segundos, ese puerto local no puede ser reutilizado para ninguna nueva solicitud.
  3. ahora la segunda solicitud llega del mismo cliente, se repetirá el paso 1.
  4. de esta manera, para cargas pesadas,
    1. puedes terminar usando todos los puertos locales disponibles en el nginx (65k)
    2. La creación y terminación de la conexión en cada solicitud es una operación muy costosa

Por lo tanto, para evitar esto, lo mejor que puedes hacer es Cachear la conexión, para que cuando llegue una solicitud, puedas reutilizar la misma conexión con el servidor upstream (en el mismo puerto local, como hiciste en la última solicitud)

Saludos Vj

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X