Lutte contre le harcèlement (de connexion)

un BASH contre les DDOS

fred

 
Au cas où vos serveurs sont ciblés par un "BotNET" qui passe son temps à ouvrir des connexions depuis de multiples IP source.
Vous êtes victime d'une attaque par déni de service distribué (DDoS) !

Le rouge des alarmes nagios est à son niveau le plus vif. Il devient difficile de faire la différence entre les demandes de connexion tcp SYN usurpées, réelles et légitimes.

Si il y a un seuil clair entre le nombre de connexions ouvertes par des utilisateurs légitimes et le nombre élevé de connexions provenant d'IP réelles et usurpées qui font partie de l'attaque. En les identifiant et en envoyant des réinitialisations TCP (avec le drapeau RST activé) à toutes les demandes de connexion dépassant le seuil, nous pouvons aider le serveur à s'en sortir.

Voici un script (à adapter à votre situation) qui va compter le nombre de demande de connexion en provenance d'une même IP et rejeter celles qui dépassent un certain nombre (ici 10) avec "iptable".

 

#! /bin/bash
while [ 1 ] ;
 do
 for ip in `lsof -ni | grep http | grep -iv listen | awk '{print $9}' | cut -d : -f 2- | sort | uniq | sed s/"http->"//` ;
 # the line above gets the list of all connections and connection attempts, and produces a list of uniq IPs
 # and iterates through the list
  do
    noconns=`lsof -ni | grep $ip | wc -l`;
    # This finds how many connections there are from this particular IP address
    echo $ip : $noconns ;
    if [ "$noconns" -gt "10" ] ;
    # if there are more than 10 connections established or connecting from this IP
    then
      echo "Too many connection form $ip"

# Keep track of the IPs into log file for monitoring
      echo `date` "$ip has $noconns connections. Total connections to prod spider: \
            `lsof -ni | grep http | grep -iv listen | wc -l`" >> /var/log/Ddos/Ddos.log
# for these connections, add an iptables statement to send resets on any packets recieved       iptables -I INPUT -s $ip -p tcp -j REJECT --reject-with tcp-reset
else echo `date` "$ip has $noconns connections : OK" fi; done sleep 60 done

Cette solution est extraite du

Guide avancé d'écriture des scripts Bash