Proteger un servidor de ataques DDoS con Iptables (Parte 2 de 2).
Segunda parte del manual anti DDos con Iptables. Puedes ver el primero “aquí”.
…… Continuamos con nuestro manual.
Establecemos opciones diversas muy útiles a la hora de frenar ataques DDos.
1 | iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP |
SYN y FIN.
1 | iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP |
SYN y RST.
1 | iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP |
FIN y RST.
1 | iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP |
Establecemos FIN sin ACK.
1 | iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP |
Establecemos PSH sin el ACK.
1 | iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP |
URG sin el ACK.
1 | iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP |
Bien, llegado este punto hacemos un inciso.
Ya deberías de saber que cuando iptables recopila muchas disecciones IP, ralentiza el sistema (depende de tu maquina, pero normalmente a partir de 100 direcciones empieza a disminuir progresivamente).
Para evitar este problema usaremos IPSet
Lo instalamos en nuestra distribución Linux.
Redhat, CentOS y derivados:
1 | yum install ipset |
Debian, Ubuntu y derivados:
1 | apt-get install ipset |
Una vez instalado agregaremos la regla de bloqueo en iptables (dos, es la tabla de IPset).
1 | iptables -I INPUT 1 -m set --set dos src -j DROP |
Creamos un “hash” para la tabla dos.
1 | ipset -N dos iphash |
Nota: si en vez de bloquear una ip, quieres bloquear la subred completa, cambia iphash por nethash.
Guardamos las reglas de Iptables.
1 | /sbin/service iptables save |
Ya lo tenemos, tan solo nos falta un script para detener automáticamente los ataques “syn flood”
Creamos el script *.sh.
1 | nano anti-ddos.sh |
Copia y pega lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash IFCONFIG=/sbin/ifconfig GREP=/bin/grep AWK=/bin/awk CUT=/bin/cut NETSTAT=/bin/netstat IPSET=/usr/sbin/ipset IPTABLES=/sbin/iptables SORT=/bin/sort UNIQ=/usr/bin/uniq srvIP=`$IFCONFIG eth0 | $GREP 'inet addr' | $AWK '{print $2}' | $CUT -f2 -d ":"` for i in `$NETSTAT -ntu | $GREP SYN_RECV | $AWK '{print $5}' | $CUT -f1 -d ":" | $SORT | $UNIQ | $GREP -v ${srvIP}` do $IPSET -A dos $i done $IPSET -S > /etc/sysconfig/ipset |
Guarda el archivo y cierra el editor.
Lo puedes ejecutar en el momento que notes un ataque, con:
1 | bash anti-ddos.sh |
Pero mi consejo es que crees una tarea cron que ejecute el sh (se recomienda su ejecución entre 1 y 5 minutos).
Puedes ver las direcciones que están bloqueadas, con:
1 | ipset -L | head |
ejemplo de salida….
1 2 3 4 5 6 7 8 9 10 11 | ipset -L | head Name: dos Type: hash:ip Header: family inet hashsize 1024 maxelem 65536 Size in memory: 20104 References: 1 Members: 200.170.151.14 196.21.39.13 180.250.209.2 203.89.27.150 |
Otros detalles de un ataque, con:
1 | netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n |
Espero te resulte de util este tutorial.