Script shell pour interdire une IP

8

Certaines adresses IP ouvrent des milliers de connexions de mon serveur. J'ai un serveur Ubuntu 14. Je vérifie le nombre total de connexions à l'aide de la commande suivante:

netstat -an | grep tcp | awk '{print $ 5}' | coupe -f 1 -d: | trier | uniq -c | trier -n

Ensuite, j'utilise la règle iptables suivante pour bloquer l'IP coupable.

iptables -I INPUT 1 -s xxxx -j DROP

Cela fonctionne très bien et bloque l'adresse IP. Cependant, je ne peux pas rester en ligne 24/7 pour surveiller le serveur. Je me demandais s'il y avait un script Shell que je peux utiliser pour le faire automatiquement? Par exemple, si une adresse IP ouvre plus de X nombre de connexions à tout moment, elle devrait être automatiquement interdite par la règle iptables ci-dessus.

user3404047
la source
6
Avez-vous cherché à savoir si fail2ban répond à vos besoins?
John1024
Excusez mes connaissances limitées. N'est-ce pas fail2ban pour l'authentification ssh? Je ne suis pas sûr de l'utiliser sur le port 80. De plus, mon serveur est un serveur de chat, donc un utilisateur peut essayer de se connecter / ping plusieurs fois. Dans ce cas, fail2ban créerait de nombreuses fausses alarmes positives et interdirait le trafic légitime. Toute pensée?
user3404047

Réponses:

10

Tout d'abord, ne réinventez pas la roue. C'est précisément à cela que denyhostssert:

   DenyHosts  is a python program that automatically blocks ssh attacks by
   adding entries to /etc/hosts.deny.  DenyHosts will  also  inform  Linux
   administrators  about  offending  hosts,  attacked users and suspicious
   logins.

Pour autant que je sache, denyhostsc'est uniquement pour les sshconnexions mais il y a aussi fail2banqui traite à peu près n'importe quoi:

   Fail2Ban consists of a client, server and configuration files to  limit
   brute force authentication attempts.

   The  server  program  fail2ban-server is responsible for monitoring log
   files and issuing ban/unban commands.  It  gets  configured  through  a
   simple  protocol  by fail2ban-client, which can also read configuration
   files and issue corresponding configuration commands to the server.

Les deux sont disponibles dans les référentiels:

sudo apt-get install denyhosts fail2ban

Vous pouvez également l'écrire si vous le souhaitez. Quelque chose comme:

#!/usr/bin/env sh
netstat -an | 
    awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}}
    END{for(ip in c){if(c[ip]>max){print ip}}}' |
        while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

Le awkva extraire les adresses IP et les compter et imprimer uniquement celles qui apparaissent plusieurs maxfois (ici -vmax=100, modifiez-les en conséquence). Les adresses IP sont ensuite introduites dans une boucle while qui exécute la iptablesrègle appropriée .

Pour exécuter ce 24/7, je ferais un cronjob qui exécute la commande ci-dessus toutes les minutes environ. Ajoutez cette ligne à/etc/crontab

* * * * * root /path/to/script.sh
terdon
la source
Merci terdon pour une réponse précise. AFAIK, fail2ban est pour l'authentification ssh. Toutes les connexions sont ouvertes sur le port 80. J'explorerai si je peux utiliser fail2ban sur le port 80. Pour le script personnalisé, comment pourrais-je l'exécuter 24/7 en arrière-plan? commande d'écran? Ou installer cron? BTW. J'utilise le serveur comme serveur de discussion afin qu'une personne puisse cingler plusieurs fois (ou ouvrir plusieurs connexions), donc je pourrais opter pour le script personnalisé que vous avez fourni.
user3404047
2
@ user3404047 vous pouvez l'exécuter en tant que cronjob, oui. Voir la réponse mise à jour. Cependant, ce fail2bann'est pas seulement pour ssh. Cela fonctionne également très bien pour le port 80. Voir, par exemple ici , ici et ici .
terdon
1

Une autre option possible consiste à identifier et à traiter les adresses IP problématiques dans l'ensemble de règles iptables, à l'aide du recentmodule. Le défi avec cette méthode est la limite de comptage par défaut de 20, il faut donc soit dévier des valeurs par défaut, soit créer des compteurs de portage de niveau supérieur pour atteindre un point de déclenchement de décompte plus élevé.

L'exemple ci-dessous provient de mon ensemble de règles iptables et interdira une adresse IP pendant un peu plus d'un jour s'il établit 80 nouvelles connexions TCP sur le port 80 en moins de 12 minutes. Une fois sur la liste des méchants, toute tentative de connexion remettra le compteur 1 jour à 0. Cette méthode pourrait atteindre un maximum de 400 hits avant d'être étendu à un autre report (et j'ai testé une autre chaîne de transfert). Notez que le code tel qu'il est publié possède l'infrastructure à utiliser pour interdire pendant longtemps uniquement plusieurs déclencheurs à temps plus court. Actuellement, je dois l'interdire pendant longtemps sur le premier déclencheur.

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in4
#
# A NEW Connection on port 80 part 4.
#
# multiple hits on the banned list means you get a one day ban.
# (I re-load the firewall rule set often, so going longer makes
# little sense.)
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
# Place holder routine, but tested. Logs if a day ban would have
# been activated.
#
$IPTABLES -N http-new-in4
#$IPTABLES -A http-new-in4 -m recent --set --name HTTP_BAN_DAY

$IPTABLES -A http-new-in4 -j LOG --log-prefix "DAY80:" --log-level info
$IPTABLES -A http-new-in4 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in3
#
# A NEW Connection on port 80 part 3.
#
# carry forward to the actual banned list:
# Increment this count. Leave the previous count.
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
$IPTABLES -N http-new-in3
$IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02
$IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4
$IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN

$IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info
$IPTABLES -A http-new-in3 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in2
#
# A NEW Connection on port 80 part 2.
#
# carry forward from previous max new connections per unit time:
# Increment this count and clear the lesser significant count.
#
$IPTABLES -N http-new-in2
$IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01
$IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3
$IPTABLES -A http-new-in2 -m recent --set --name HTTP_02

$IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info
$IPTABLES -A http-new-in2 -j ACCEPT

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in
#
# A NEW Connection on port 80:
#
$IPTABLES -N http-new-in

echo Allowing EXTERNAL access to the WWW server

# . check the static blacklist.
#
# http related
$IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP
... delete a bunch on entries ...
$IPTABLES -A http-new-in -i $EXTIF -s 195.211.152.0/22 -j DROP
$IPTABLES -A http-new-in -i $EXTIF -s 198.27.126.38 -j DROP

# . check the dynamic banned list
#
# The 1 Hour banned list (bumped to more than a day):
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP

# A generic log entry. Usually only during degugging
#
#$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info

# Dynamic Badguy List. Least significant hit counter.  Detect and DROP Bad IPs that do excessive connections to port 80.
#
$IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2
$IPTABLES -A http-new-in -m recent --set --name HTTP_01

$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info
$IPTABLES -A http-new-in -j ACCEPT

... a bunch of stuff not included here

# Allow any related traffic coming back to the server in.
#
#
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

... the above is needed before the below ...

# If required, go to NEW HTTP connection sub-routine
#
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in
Doug Smythies
la source