Linux: evitar la inundación de TCP saliente

Linux: evitar la inundación de TCP saliente

Manejo varios cientos de servidores web detrás de balanceadores de carga, alojando muchos sitios diferentes con una gran cantidad de aplicaciones (sobre las cuales no tengo control). Aproximadamente una vez al mes, uno de los sitios es pirateado y se carga un script de inundación para atacar algún banco o institución política. En el pasado, siempre se trataba de inundaciones UDP que se resolvían eficazmente bloqueando el tráfico UDP saliente en el servidor web individual. Ayer comenzaron a inundar un gran banco estadounidense desde nuestros servidores utilizando muchas conexiones TCP al puerto 80. Como este tipo de conexiones son perfectamente válidas para nuestras aplicaciones, simplemente bloquearlas no es una solución aceptable.

Estoy considerando las siguientes alternativas. ¿Cuál recomendarías? ¿Los ha implementado y cómo?

  • Límite de paquetes TCP salientes del servidor web (iptables) con puerto de origen! = 80
  • Lo mismo pero con cola (tc)
  • Límite de velocidad del tráfico saliente por usuario por servidor. Una gran carga administrativa, ya que potencialmente hay miles de usuarios diferentes por servidor de aplicaciones. Tal vez esto:¿Cómo puedo limitar el ancho de banda por usuario?
  • ¿Algo más?

Naturalmente, también estoy buscando formas de minimizar la posibilidad de que los piratas informáticos ingresen a uno de nuestros sitios alojados, pero como ese mecanismo nunca será 100% impermeable, quiero limitar severamente el impacto de una intrusión.

Actualización: actualmente estoy probando con estas reglas, que habrían evitado este ataque específico. ¿Cómo propondrías hacerlos más genéricos? ¿Me estoy perdiendo un ataque TCP DoS conocido cuando solo califico el límite de paquetes SYN?

iptables -A OUTPUT -p tcp --syn -m limit --limit 100/min -j ACCEPT
iptables -A OUTPUT -p tcp --syn -m limit --limit 1000/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A OUTPUT -p tcp --syn -j REJECT --reject-with tcp-reset

¡Salud!

Respuesta1

La mejor solución posible en mi opinión y la que me ha funcionado muy bien es limitar el número de conexiones/paquetes por ip de destino. Establecer el límite a una velocidad razonable evitará que el atacante envíe una gran cantidad de conexiones al objetivo. Configurar el puerto y el protocolo no es una buena idea porque si el atacante envía una inundación http hoy, mañana utilizará un tipo de ataque diferente. por lo que limitar las conexiones por ip en general sería una solución a su problema.

Espero que ayude :)

Respuesta2

La postura que siempre he adoptado es que un servidor web no debería realizar ninguna conexión TCP saliente, solo enviar tráfico como un servidor que responde a las solicitudes entrantes. (También permito TCP entrante solo para el servidor web y SSH). (En relación con esto, también creo que un servidor web nunca es el host adecuado para enviar correo). Esto no solo evitará ataques salientes, sino que también agrega un poco de dificultad. a los ataques realizados a sus sistemas (los piratas informáticos no pueden obtener una ventana xterm ni enviar su kit de herramientas a su host).

información relacionada