No creo que te estén atacando,
¿Tu sitio web se vio lento en la avalancha de visitas?. Lo primero que podrías hacer es denegar el acceso a la IP "atacante".
Verifica las conexiones entrantes al servidor, y a qué servicios se conectan:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
netstat -np | grep SYN_RECV | awk '{print $5}' | cut -d. -f1-4 | cut -d: -f1
| sort -n | uniq -c | sort -n
Ejemplo:
tcp 0 0 192.168.0.3:80 192.168.0.5:60808 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60761 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60876 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60946 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60763 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60955 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60765 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60961 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60923 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:61336 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:61011 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60911 SYN_RECV
tcp 0 0 192.168.0.3:80 192.168.0.5:60758 SYN_RECV
Donde la IP 192.168.0.3 es la IP del servidor y 192.168.0.5 la del atacante, claramente es un SYN Flooding al servidor de apache que conecta por el puerto 80, también se llama SYN_RECV.
Puedes mirar los logs del
mod_evasive.
Deteniendo el ataque
Hay varias formas de hacerlo, te recopilaré algunas:
Confirma que el uso de CPU no es muy alto y tienes muchos procesos corriendo en apache
Comandos como Uptime - "w":
Server@work >w
12:00:36 up 2 day, 15:28, 6 users, load average: 0.60, 0.60, 0.47
Cuenta los procesos HTTP, para hacer una comparación.
[root@server root]# ps -aux|grep -i HTTP|wc -l
22
Determinar la red atacante
Las conexiones a un servidor oscilan entre 100 más o menos, en un ataque estas obviamente se incrementan, es en ese momento cuando debes saber qué redes están lanzando ese ataque, como serán muchas máquinas esclavas, lo que más importa es la red, para poder bloquearla, ejecuta este comando para ver las conexiones:
bash# netstat -lpn|grep :80|awk '{print $5}'|sort
Si vez muchas conexiones de una IP entrante, probablemente sea esa la red atacante, claro, estamos más o menos repitiendo el primer proceso, pero esto en tiempo real.
Parar el ataque
1. Intenta usar 'iptables' o 'apf'
iptables -A INPUT -s <Source IP> -j DROP
Pero mira el syslog, porque hay falsos positivos, que son ips que no hacen flood, para prevenirlas con mod_evasive:
<IfModule mod_evasive.c>
# añadir estas líneas que corresponden a rangos de los bots de google
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
</IfModule>
Recuerda darle buen funcionamiento al mod_evasive:
MaxRequestsPerChild 0, ponerle un valor alto como MaxRequestsPerChild 10000, no Ilimitado!.
Acá hay ejemplos de configuración: Mod_evasive | eth0.us - Server admin info for cPanel, plesk, ensim and linux!
Si usas apf entonces añade esas direcciones a /etc/apf/deny_hosts.rules, es una estrategia para bloquear la red, sin embargo, debes contactar al datacenter, tu proveedor, informales de la situación.
Instala Portsentry para evitar los escaneos al host.
2. Con mod_evasive.
Esto es más de prevención, añadiendo esto, hará que 60 conexiones por 3/2 segundos es ya alarma de ataque:
<IfModule mod_evasive.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 60
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 900
</IfModule>
<IfModule mod_evasive.c>
DOSHashTableSize 3097
DOSPageCount 1
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
</IfModule>
4. Usando firewalls dinámicos tcplimit, ipdrop, ipblock...
5. Usando reglas del iptables
# todo el trafico syn
-P INPUT DROP
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp ! --syn -j REJECT --reject-with tcp-reset
-A INPUT -m state --state INVALID -j DROP
-P OUTPUT DROP
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p tcp ! --syn -j REJECT --reject-with tcp-reset
-A OUTPUT -m state --state INVALID -j DROP
-P FORWARD DROP
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p tcp ! --syn -j REJECT --reject-with tcp-reset
-A FORWARD -m state --state INVALID -j DROP
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A FORWARD -i lo -o lo -j ACCEPT
# sube las cargas pero muchos wwww buena señal
-A INPUT -p tcp --syn -j REJECT --reject-with icmp-port-unreachable
# la que mejor va
-N syn-flood
-A syn-flood -m limit --limit 100/second --limit-burst 150 -j RETURN
-A syn-flood -j LOG --log-prefix "SYN flood: "
-A syn-flood -j DROP
# igual que el de arriba pero muy bestia
-N syn-flood
-A INPUT -i eth0:2 -p tcp --syn -j syn-flood
-A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
-A syn-flood -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit
1/sec -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit
--limit 1/sec -j ACCEPT
# no es muy efectivo
-A INPUT -s 0/0 -p tcp --syn --source-port 1000:5000
--destination-port 80 -j DROP
# no es muy efectivo
-A INPUT -p tcp -m tcp --dport 80 --sport 1000:5000 --tcp-flags SYN SYN -j DROP
# Descartar paquetes mal formados
-N PKT_FAKE
-A PKT_FAKE -m state --state INVALID -j DROP
-A PKT_FAKE -p tcp --dport 80 --tcp-flags ALL ACK,RST,SYN,FIN -j DROP
-A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j DROP
-A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,RST SYN,RST -j DROP
-A PKT_FAKE -p tcp --dport 80 ! --syn -m state --state NEW -j DROP
-A PKT_FAKE -f -j DROP
-A PKT_FAKE -j RETURN
# syn-flood
-N syn-flood
-A INPUT -i eth+ -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood
-A FORWARD -i eth+ -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood
-A syn-flood -m limit --limit 4/s --limit-burst 16 -j RETURN
-A syn-flood -m limit --limit 75/s --limit-burst 100 -j RETURN
-A syn-flood -j LOG --log-prefix "SYN FLOOD " --log-tcp-sequence --log-tcp-options --log-ip-options -m limit --limit 1/second
-A syn-flood -j DROP
# By pepel. Requiere módulo "recent"
-A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
-A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP
#explicación:
Se añade cada ip que se conecte a la tabla de recent
Por por cada ip en la tabla de recent si hace mas de x hits en x segundos, se dropea.
iptables -I INPUT -p tcp –syn -m recent –set
iptables -I INPUT -p tcp –syn -m recent –update –seconds 10 –hitcount 30 -j DROP
Lo que hace es contar el número de paquetes SYN (inicio de conexión TCP) para
cada dirección IP en los últimos 10 segundos. Si llega a 30 descarta ese paquete por
lo que no se establecerá la conexión (el TCP volverá a intentar varias veces,
cuando baje del límite podrá establecerse).(elhacker)
Hay muchas formas más!.
Prevenir el ataque
Bueno, no es mucho que decir, no es posible rehusar totalmente un ataque DDoS/DoS, es posible prevenirlo, y en general estar muy atento, ya sea que tu red termine de esclava o tu máquina atacada, hay que saber defenderse y tener paciencia.
- Instalar un firewall que tenga filtros de seguridad. Cómo APF Projects | R-fx Networks
- Usar un HIDS, Sistema de detección de intrusos en un Host, para alertar de escaneos a puertos y posibles intentos de hackeo.
Pues de pronto me dedique a hacer una mega-tutorial recopilando toda la documentación respecto a ataques a servidores web, ya que es un tema interesante y de mucha ayuda.
Byebye.