Script di shell per vietare un IP


8

Alcuni IP stanno aprendo migliaia di connessioni del mio server. Ho un server Ubuntu 14. Controllo le connessioni totali usando il seguente comando:

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

Quindi uso la seguente regola iptables per bloccare l'IP colpevole.

iptables -I INPUT 1 -s xxxx -j DROP

Funziona tutto bene e blocca l'indirizzo IP. Tuttavia, non posso rimanere online 24/7 per monitorare il server. Mi chiedevo se c'è qualche script Shell che posso usare per farlo automaticamente? Ad esempio, se un IP apre più di X numero di connessioni in qualsiasi momento, dovrebbe essere automaticamente escluso dalla regola iptables sopra.


6
Hai cercato di vedere se fail2ban soddisfa le tue esigenze?
Giovanni 1024,

Scusa la mia conoscenza limitata. Fail2ban non è per l'autenticazione ssh? Non sono sicuro di usarlo sulla porta 80. Inoltre, il mio server è un server di chat, quindi un utente può provare a connettersi / eseguire il ping più volte. In questo caso, fail2ban creerebbe molti allarmi falsi positivi e vieterebbe il traffico legittimo. Qualche pensiero?
user3404047

Risposte:


10

Prima di tutto, non reinventare la ruota. Questo è esattamente ciò che denyhostsserve per:

   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.

Per quanto ne so, denyhostsè solo per le sshconnessioni, ma c'è anche fail2banche si occupa praticamente di tutto:

   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.

Entrambi sono disponibili nei repository:

sudo apt-get install denyhosts fail2ban

Puoi anche scrivere questo script, se vuoi. Qualcosa di simile a:

#!/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

Il awkestrarrà i progetti integrati e le considero e stampare solo quelli che appaiono più di maxvolte (qui, -vmax=100, cambia di conseguenza). Gli IP vengono quindi inviati a un ciclo while che esegue la iptablesregola pertinente .

Per eseguire questo 24/7, farei un cronjob che esegue il comando sopra ogni minuto o giù di lì. Aggiungi questa linea a/etc/crontab

* * * * * root /path/to/script.sh

Grazie per la risposta precisa. AFAIK, fail2ban è per l'autenticazione ssh. Tutte le connessioni vengono aperte sulla porta 80. Esplorerò se posso usare fail2ban sulla porta 80. Per lo script personalizzato, come potrei eseguirlo 24/7 in background? comando schermo? O installa cron? BTW. Sto usando il server come un server di chat in modo che una persona possa eseguire il ping più volte (o aprire più connessioni), quindi potrei scegliere lo script personalizzato che hai fornito.
user3404047

2
@ user3404047 potresti eseguirlo come cronjob, sì. Vedi la risposta aggiornata. Tuttavia, fail2bannon è solo per ssh. Funziona bene anche per la porta 80. Vedi, per esempio qui , qui e qui .
terdon,

1

Una possibile opzione alternativa è identificare e gestire gli indirizzi IP problematici all'interno del set di regole iptables, usando il recentmodulo. La sfida con questo metodo è il limite di hitcount predefinito di 20, quindi è necessario deviare dalle impostazioni predefinite o creare contatori di trasporto di livello superiore per ottenere un punto di attivazione di hitcount più elevato.

L'esempio seguente proviene dal mio set di regole iptables e vieterà un indirizzo IP per poco più di 1 giorno se crea 80 nuove connessioni TCP sulla porta 80 in meno di 12 minuti. Una volta nella lista dei cattivi, qualsiasi tentativo di connessione reimposterà il contatore di 1 giorno a 0. Questo metodo potrebbe arrivare a un massimo di 400 colpi prima che fosse necessaria l'espansione in un altro carry (e ho testato un'altra catena di carry). Si noti che il codice come pubblicato ha l'infrastruttura da utilizzare per vietare a lungo solo su più trigger più brevi. Attualmente, ho impostato per vietare a lungo il primo trigger.

#######################################################################
# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.