18-11
Bloquer des attaques dDos
Aujourd'hui, un potentiel client me contacte en me disant qu'il subit des attaques de type dDos et BotNet sur son serveur. Ne connaissant pas l'étendu de l'attaque, je me permet de lui dire que je peux essayer quelque chose, et, comme à mon habitude, si je n'y arrive pas, il ne me devra rien. Le site en question est un site de vidéo coquine et donc les attaques viennent principalement d'IP vietnamiennes, japonaises et chinoises. Le client me donne cette nuit les accès à son serveur, je me connecte (le load average est à plus de 80) je regarde donc la liste des IPs effectuant du dDos:netstat -tanpu|grep SYN_RECV |wc -lLe nombre est plutôt impressionnant (aux alentours de 26K si mes souvenirs sont bons). Je commence donc à regarder d'où viennent ces attaques. Je fais d'abord les modifications sur le sysctl.conf (il suffit de lire les commentaires de ce fichier pour voir quels éléments décommenter):
net.ipv4.conf.all.rp_filter=1 net.ipv4.tcp_syncookies=1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 # Prise en compte des modifs : sysctl -p /etc/sysctl.confCeci ne change pas grand chose. Je redémarre quand même Apache entre chaque opération et je me décide d'installer le mod-evasive d'Apache. Le client ayant déjà installé pas mal de tools dessus, le mod evasive ne fonctionne pas à moins de complètement réinstaller Apache, ça ne vaut pas trop le coup mais surtout je n'ai pas encore son autorisation. Je me décide donc à passer par IPTables et de voir quelles sont les règles déjà installées. Il n'y a, pour le moment, rien. J'ai donc carte blanche, et ceci n'est pas plus mal. Je recherche donc quelles sont les IPs les plus virulentes, et je bannis les ranges IPs les plus virulent:
# Le dernier if a pour valeur 5, on va ensuite le réduire, mais pour le moment, on le laisse ainsi netstat -tan | grep "SYN_RECV" | awk {'print $5'} | cut -f 1 -d ":" | sort | uniq -c | sort -n | awk {'if ($1 > 5) print $2'} 113.167.119.* 115.75.20.* 115.75.215.* 124.43.69.* etc... # On regarde a quel pays correspond quelques unes de ces IPs: whois -Fr 124.43.69.* *in: 124.43.69.0 - 124.43.69.255 *na: SLTADSL-SLT-LK *de: ADSL SECTION-DYNAMIC POOL *de: ADSL - SRI LANKA TELECOM *de: COLOMBO *cy: LK *ac: NS198-AP *tc: NS198-AP *st: ASSIGNED NON-PORTABLE *mb: MNT-SLT-LK *ch: hostmaster@slt.lk 20081016 *so: APNIC # On regarde la ligne *cy qui signifie "Country" et indique, dans ce cas, le Sri Lanka. # La FAI contient le range IP 124.43.69.0/16Pour apprendre à trouver correctement les ranges IP, vous pouvez utiliser le post précédent. Enfin, on banni ce range IP:
iptables -A BLACKLIST-IN -s 124.43.69.0/16 -j DROPOn continu pour les autres ranges IP étant vraiment virulent. Pour les IPs restantes, on peut plus simplement utiliser un script étant quelque peu plus sélectif.
#!/bin/bash # Demarrage de la Boucle while true; do # On regarde les IPs effectuant du Syn Flood for i in ` netstat -tan | grep "SYN_RECV" | awk {'print $5'} | cut -f 1 -d ":" | sort | uniq -c | sort -n | awk {'if ($1 > 2) print $2'}` ; do # On affiche les IPs echo $i; # On les insert dans notre script d'IPTables habituel echo "iptables -A BLACKLIST-IN -s $i -j DROP" >> /root/iptables.sh; # On banni les IPs à la chaine iptables -A BLACKLIST-IN -s $i -m comment --comment "BAN-dDos" -j DROP done; # Pour fini on redémarre Apache (les connexions établies n'étant pas fermées par IPTables) /etc/init.d/apache2 stop; sleep 1; /etc/init.d/apache2 start; # On attends 600 secondes avant de refaire une recherche # Les gens pourront ainsi surfer correctement sur le site sleep 600 doneVoilà, maintenant le site de mon client fonctionne correctement. Il nous aura fallu 3h pour bloquer cette attaque qui le gênait depuis plus d'un mois.
1 Commentaire pour ce billet.
Votre commentaire
Petite commande iptables :
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
--limit 1/s : Nombre maximum "moyen" de connexion par seconde
--limit-burst 3 : Nombre maximum de connexion avant qu'un paquet "MATCH"