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.
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
SYN y FIN.
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
SYN y RST.
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
FIN y RST.
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
Establecemos FIN sin ACK.
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
Establecemos PSH sin el ACK.
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
URG sin el ACK.
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:
yum install ipset
Debian, Ubuntu y derivados:
apt-get install ipset
Una vez instalado agregaremos la regla de bloqueo en iptables (dos, es la tabla de IPset).
iptables -I INPUT 1 -m set --set dos src -j DROP
Creamos un «hash» para la tabla dos.
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.
/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.
nano anti-ddos.sh
Copia y pega lo siguiente:
#!/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:
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:
ipset -L | head
ejemplo de salida….
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:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
Espero te resulte de util este tutorial.
que tal genios me gustaria aprender a como crear una tarea cron que ejecute el sh ya que entre al otro articulo pero no entendi ya que soy muy novato en linux
Hola Andres.
Al final de este articulo… https://www.sololinux.es/alerta-de-bateria-baja-script-bash/, tienes un ejemplo sencillo de tarea cron cada 30 minutos.
Un saludo.
Hola! cuando ya tengo instaldo el ipset v6.30
usando el comando «iptables -I INPUT 1 -m set –set dos src -j DROP»
me devuelve esto
root@d0269:~# iptables -I INPUT 1 -m set –set dos src -j DROP
–set option deprecated, please use –match-set
Buenos días Collavino.
Te dice que agregues match-set, más o menos así…
iptables -I INPUT 1 -m set --match-set dos src -j DROP
Hola;
Es importante primero crear el hash de la «tabla dos» antes de referenciarla
Cambiar de orden dos pasos casi al final
Un saludo, gran pareja de articulos