GNU/Linux >> Linux Esercitazione >  >> Linux

Blocco di tutto il traffico dai singoli paesi utilizzando IPSet e IPTables

Introduzione:
Guardando il syslog ho scoperto troppo spesso che gli attacchi di accesso SSH provenivano dalla Cina o dalla Russia. Ne ho abbastanza e comunque non mi aspetto traffico da nessuno di questi paesi, anche se utilizzo fail2ban comunque ho deciso di bloccare tutto il traffico proveniente da questi 2 paesi. Fail2ban è un ottimo strumento per bloccare i tentativi di accesso non riusciti. MA sembra che molti tentativi (migliaia) al giorno siano ancora in corso. Posso solo presumere che l'attaccante stia utilizzando l'invio parallelo di tentativi e finché Fail2ban (basato sui log di autenticazione) non reagisce a molti sono passati.
Per eseguire un blocco completo degli IP con elenchi precaricati di intervalli IP, ho iniziato utilizzando iptables con una regola per intervallo IP, MA il caricamento delle regole richiedeva troppo tempo e, cosa più importante, il caricamento di tutti gli intervalli IP, poiché le regole di iptables pure, rendevano il mio server instabile, il che significa che... si è bloccato!!! Si dice che più di max. 25.000 regole in iptables, in particolare più grandi di 27.000, le regole possono mettere il kernel in uno stato instabile.
Per rimediare a ciò utilizzo ipset con iptables . ipset è appositamente concepito per gestire elenchi di intervalli IP di grandi dimensioni (tabelle hash ad accesso rapido) che possono contenere fino a 65536 voci.

NOTA: Lo script seguente è valido solo per le distribuzioni Linux basate su Debian. Per altre distribuzioni dovrai adattare lo script di conseguenza.

Principio di questo Paese Protezione del blocco :
Gli intervalli IP in formato CIDR vengono prelevati dal sito Web http://www.ipdeny.com/ipblocks/data/countries/ e inseriti negli elenchi individuali dell'IPSet che sono denominati dai codici paese e quindi referenziati da iptables per definire il TARGET (cosa fare con gli IP che corrispondono:DROP )
NOTA: In questo esempio lo script imposta la destinazione delle regole di iptables su DROP invece di RIFIUTA per evitare un traffico elevato di risposte di rifiuto dello stack TCP/IP. DROP non risponde nulla.

NOTA IMPORTANTE: Questo script di seguito deve essere eseguito DOPO hai caricato le normali regole del firewall. INSERISCI le nuove regole di iptables in modo tale che tutti i pacchetti in arrivo da quei paesi definiti vengano bloccati PRIMA qualsiasi ulteriore elaborazione nel tuo firewall.

Passaggi:
#!/bin/bash
# Description: Uses IPSET and IPTABLES to block full countries from accessing the server for all ports and protocols
# Syntax: countries_firewall.sh countrycode [countrycode] ......
# Use the standard locale country codes to get the proper IP list. eg.
# countries_firewall.sh cn ru ro
# Will create tables that block all requests from China, Russia and Romania
# Changes: 13.11.2016 Initial creation of script
# Note: To get a sorted list of the inserted IPSet IPs for example China list(cn) run the command:
# ipset list cn | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
# #############################################################################
# Defining some defaults
iptables="/sbin/iptables"
tempdir="/tmp"
sourceURL="http://www.ipdeny.com/ipblocks/data/countries/"
#
# Verifying that the program 'ipset' is installed
if ! (dpkg -l | grep '^ii ipset' &>/dev/null) ; then
echo "ERROR: 'ipset' package is not installed and required."
echo "Please install it with the command 'apt-get install ipset' and start this script again"
exit 1
fi
[ -e /sbin/ipset ] && ipset="/sbin/ipset" || ipset="/usr/sbin/ipset"
#
# Verifying the number of arguments
if [ $# -lt 1 ]; then
echo "ERROR: wrong number of arguments. Must be at least one."
echo "countries_firewall.sh countrycode [countrycode] ......"
echo "Use the standard locale country codes to get the proper IP list. eg."
echo "countries_firewall.sh cn ru ro"
exit 2
fi
#
# Now load the rules for blocking each given countries and insert them into IPSet tables
for country ; do
# Read each line of the list and create the IPSet rules
# Making sure only the valid country codes and lists are loaded
if wget -q -P $tempdir ${sourceURL}${country}.zone ; then
# Destroy the IPSet list if it exists
$ipset flush $country &>/dev/null
# Create the IPSet list name
echo "Creating and filling the IPSet country list: $country"
$ipset create $country hash:net &>/dev/null
(for IP in $(cat $tempdir/${country}.zone) ; do
# Create the IPSet rule from each IP in the list
echo -n "$ipset add $country $IP --exist - "
$ipset add $country $IP -exist && echo "OK" || echo "FAILED"
done) > $tempdir/IPSet-rules.${country}.txt
# Destroy the already existing rule if it exists and insert the new one
$iptables -D INPUT -p tcp -m set --match-set $country src -j DROP &>/dev/null
$iptables -I INPUT -p tcp -m set --match-set $country src -j DROP
# Delete the temporary downloaded counties IP lists
rm $tempdir/${country}.zone
else
echo "Argument $country is invalid or not available as country IP list. Skipping"
fi
done
# Display the result of the iptables rules in INPUT chain
echo "======================================"
echo "IPSet lists registered in iptables:"
$iptables -L INPUT -n -v | grep 'match-set'
# Dispaly the number of IP ranges entered in the IPset lists
echo "--------------------------------------"
for country ; do
echo "Number of ip ranges entered in IPset list '$country' : $($ipset list $country | wc -l)"
done
echo "======================================"
#
#eof

Login dell'operazione di script:

Come puoi vedere nello script, l'aggiunta di intervalli IP nelle tabelle IPSet viene registrata:$tempdir/IPSet-rules.${country}.txt che viene sovrascritto ogni volta che lo script viene eseguito per lo stesso paese.

Avvio dello script

Per assicurarmi che questo componente aggiuntivo del firewall si avvii correttamente ad ogni avvio, ma dopo il firewall definito dall'utente, lo avvio tramite cron @reboot job dopo un ritardo di circa 40 sec. (che può essere modificato in base alle proprie esigenze) per consentire l'avvio di altri servizi, incluso il servizio firewall. Sono consapevole del fatto che questo metodo per avviare lo script non è molto elegante, ma si adatta praticamente a tutte le variazioni delle distribuzioni Linux, siano esse basate su Sysinit-V o su Systemd. Esempio di root cron job:
@reboot /bin/sleep 40 ; /bin/bash -c ". /root/.bashrc ; /root/bin/countries_firewall.sh cn ru"

Invio di rapporti sul traffico per e-mail

Per inviare rapporti sul traffico per e-mail ogni giorno, raccolgo ogni giorno i dati sul traffico da iptables, lo formatto e lo invio via e-mail utilizzando il seguente script bash. Questo script verrà quindi eseguito ogni giorno da cron (inserito in /etc/cron.daily/) e il contatore del traffico verrà ripristinato.
#!/bin/bash
# Purpose: Sends the blocked traffic report per email and resets the counter
# Syntax: iptables_report
# Dependencies: Systems tools: iptables, awk, column, whois, sendmail
# Changes: 13.11.2016 First implementation of script
#----------------------------------------------------------
HOST=$(cat /etc/hostname | tr 'a-z' 'A-Z')
email="[email protected]"
reportsender="cron@$HOST"
subject="BLOCKED Packets report on $(hostname | tr 'a-z' 'A-Z')"
tempdir="/tmp"
file1="iptables_report1.txt"
file2="iptables_report2.txt"
#
#------------ Build the header of the mail to send ------------
echo "From: $reportsender" > $tempdir/$file1
echo "To: $email" >> $tempdir/$file1
echo "Subject: $subject" >> $tempdir/$file1
echo "MIME-Version: 1.0" >> $tempdir/$file1
echo 'Content-Type: text/html; charset="ISO-8859-15"' >> $tempdir/$file1
echo "" >> $tempdir/$file1
echo "<br />" >> $tempdir/$file1
echo -e "<font size=3 FACE='Courier'><pre>" >> $tempdir/$file1
# Formatted message starts here
# Add the country at the end of each line
# Load the header and data to the temporary file 2
echo -e "Packets Bytes Source \n======= ========= ======" >$tempdir/$file2
/sbin/iptables -L -n -v | /bin/grep -v '^ 0' | /bin/grep 'match-set' | /usr/bin/awk '{print $1" "$2" "$11}' >> $tempdir/$file2
#
# Format temp file2 into temp file1
cat $tempdir/$file2 | column -t >> $tempdir/$file1
#
#
# Add the last HTML preformatting End
echo -e "</pre>" >> $tempdir/$file1
echo "" >> $tempdir/$file1
#
#----------------- Send the prepared email ---------------------------
# now format the report and send it by email
cat $tempdir/$file1 | /usr/sbin/sendmail -t
rm $tempdir/$file1 $tempdir/$file2
#
# Reset the iptables counters
/sbin/iptables -Z
#
# eof

Creazione del lavoro cron per rapporti giornalieri regolari
Salva quel file ad es. /etc/cron.daily/iptables_report
Rendilo eseguibile:
chmod 755 /etc/cron.daily/iptables_report
Esempio di email di segnalazione:
Packets Bytes Source
======= ========= ======
188 7852 ru
19295 1150K cn

Stato manuale:
Per ottenere lo stato manuale delle regole di iptables per la catena INPUT, eseguire il comando:
iptables -L INPUT -v -n
Per ottenere un elenco ordinato di un elenco di IP IPSet, eseguire il comando (ad es. per la Russia):
ipset list ru | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4


Linux
  1. Blocco host blacklist e iptables

  2. Come elencare, caricare e scaricare file da un server SFTP utilizzando golang

  3. Converti tutto il testo da maiuscolo a minuscolo e viceversa?

  4. IPTables Flush:elimina / rimuovi tutte le regole su RedHat e CentOS Linux

  5. Come installare MongoDB dal sorgente (e usando YUM) su Linux

Come convertire da RPM a DEB e DEB a RPM utilizzando Alien

Tutto sui file tar e su come tar, untar file in Linux usando il terminale

CentOS / RHEL:come bloccare le porte in entrata e in uscita usando iptables

Rimuovi tutti i caratteri speciali e le maiuscole dalla stringa in bash

somma tutti i numeri da du

Utilizzando Linux IPTables, come bloccare i torrent o qualsiasi protocollo P2P?