Como mitigar ataques de tipo SYN Flood en Linux

En esta entrada veremos como mitigar los ataques de tipo SYN Flood en Linux. Cuando se intenta crear una conexión utilizando el protocolo TCP, los pasos que se realizan son tres:

  1. El cliente envía una paquete SYN al servidor para solicitar una nueva conexión

  2. el servidor contesta con un SYN/ACK indicando que reconoció la solicitud. A partir de este momento se queda a la espera de la confirmación definitiva del cliente dejando abierto un puerto y recursos para esa eventual conexión

  3. el cliente confirma con un ACK indicando que recibió el paquete procedente del servidor. A partir de este momento la creación de la conexión termina y sobre esa conexión cliente y servidor podrán intercambiar todos los datos que necesiten.

Visto Gráficamente:

Este tipo de ataque se puede realizar de tres formas distintas:

  • enviando un alto numero de solicitudes SYN desde IP reales y no contestando el SYN/ACK recibido por el servidor. Como los recursos disponibles en el servidor son finitos, cuando se alcancen, el servidor no podrá atender más solicitudes de ese tipo enviadas por usuarios reales

  • enviando un alto numero de solicitudes presentándose con IP que no son realmente aquellas desde donde salen las solicitudes; el atacante, previamente, se habrá asegurado que desde esas IP nunca se contesten los paquetes SYN/ACK enviados por el servidor

  • el tercer y más efectivo ataque es de tipo distribuido; el atacante ha tomado el control de distintos servidores (botnet) y desde ahí inicia el ataque que le permite tener un mucho más alto volumen de paquetes

En Linux podemos mitigar estos tipos de ataques utilizando dos tipos de defensas:

  • la configuración de algunos parámetros relativos al Kernel

  • añadiendo algunas reglas a el cortafuegos (IPTables)

Para el primer punto se realiza la siguiente configuración:

nano /etc/sysctl.conf

al final del archivo se añaden las siguientes lineas:

net.ipv4.tcp_max_syn_backlog=2048

net.ipv4.tcp_syncookies=1

net.ipv4.tcp_synack_retries=2

net.ipv4.conf.all.rp_filter=1

net.ipv4.conf.default.rp_filter=1

net.ipv4.conf.eth0.rp_filter=1

net.ipv4.conf.lo.rp_filter=1

cuyo significado es respectivamente:

  • se aumenta el numero de solicitudes de conexiones, que todavía no han recibido una respuesta definitiva, de que el servidor mantendrá memoria. Si el numero es bajo, el sistema se saturaría muy rápido. Si el numero es demasiado alto y el servidor no tiene muchos recursos disponibles, se podría crear problemas generales de funcionamiento

  • utilizado para evitar que un servicio quede totalmente inhabilitado por un ataque de tipo SYN FLOOD

  • numero de envíos de SYN/ACK si no se recibe una respuesta al primero enviado. Con un valor bajo el tiempo que quedará abierta un intento de conexión TCP será menor liberando el recurso de manera más rápida

  • las ultima 4 lineas se utilizan para descartar paquetes procedentes de IP Falsas a las que no es posible enrutar adecuadamente las respuestas

Cerramos el archivo. La nueva configuración aplicará al reiniciar el servidor; para que apliquen en seguida:

sysctl --system

Ahora podemos pasar al cortafuegos donde antes de cualquier tipo de configuración se añaden las siguientes reglas:

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Con esta regla se bloquean todo los paquetes vacíos;

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

con esta regla se rechazan paquetes de tipo SYN de nuevos intentos de conexión cuyo objetivo es crear una ataque de sipo SYN Flood;

iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

esta regla nos permite mitigar ataques de tipo XMAS que se utilizan para conocer el tipo de router utilizado y de esta forma aprovechar cualquier tipo de vulnerabilidad presente en ese router. Estos paquetes se reconocen porque tienen todas las banderas (Flag) permitidas activadas;

Después de estas tres lineas pueden empezar con su configuración habitual, ejemplo:

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -j ACCEPT

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

etcétera. Terminando con:

iptables -A INPUT -j REJECT

iptables -A FORWARD -j REJECT

service iptables save

systemctl start iptables

Me comentan

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Como mitigar ataques de tipo SYN Flood en Linux" Suscribirse a VozToVoice - Todos los comentarios