Appunti di Iptables

Da Linux User Group Scandiano.
Crystal kedit.png
Questa pagina ha bisogno di aiuto.

Questa sezione è soltanto un abbozzo e necessita di essere sviluppata. Se vuoi contribuire allo sviluppo di questa sezione clicca sul pulsante modifica e inserisci i tuoi contenuti.

All'interno del Kernel di Linux esiste un componente chiamato Netfilter che permette di intercettare e manipolare i pacchetti di rete. Lo strumento che utilizzeremo per interagire con Netfilter si chiama Iptables. Questa pagina serve solo come spunto per configurare velocemente un firewall sotto GNU/Linux. Prima di tutto se non è presente installiamo il pacchetto:

aptitude install iptables

Alcuni comandi utili

Questo è il comando per visualizzare le regole in vigore di Iptables, utile per vedere quanti pacchetti sono stati filtrati.

iptables -L -v

Con questo comando resettiamo la configurazione (ATTENZIONE: non si resettano però le policy, quindi c'è la possibilità di "chiudersi fuori")

iptables -F

Abbiamo bisogno di questo comando per "vuotare" le policy:

iptables -X

Esempi di regole

Con questo comando accettiamo solo le connessioni sulla porta 22 (ssh) dalla rete 192.168.1.*.

iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

Se vogliamo bloccare l'accesso ad una sottorete possiamo usare questo comando:

iptables -A INPUT -p tcp --dport 80 -s 220.181.108.0/24 -j DROP

In questo caso blocchiamo l'accesso delle connessioni TCP sulla porta 80 agli indirizzi della rete 220.181.108.* (alcuni dei crawler di Google). Il /24 sta ad indicare la netmask 255.255.255.0 infatti avremmo potuto anche scrivere 220.181.108.0/255.255.255.0.

Con questo comando invece blocchiamo l'accesso delle connessioni TCP sulla porta 80 ad un determinato range di IP.

iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 65.52.0.0-65.55.255.255 -j DROP

In questo caso abbiamo "chiuso fuori" alcuni dei crawler di MSN, esattamente tutti quelli tra 65.52.0.0 e 65.55.255.255 (compresi).

Esempi di firewall

Vediamo uno script bash che può essere usato per eseguire alcune regole iptables:

#!/bin/sh

case "$1" in
'start')
 
        echo "Carico le regole di iptales..."
       
        #CONFIGURAZIONE DELLE POLICY

        ####################################
        #BLOCCA TUTTO IL TRAFFICO IN ENTRATA
        ####################################
        iptables -P INPUT DROP

        #######################################################       
        #BLOCCA TUTTO IL TRAFFICO REDIRETTO DAL NOSTRO COMPUTER
        ####################################################### 
        iptables -P FORWARD DROP

        #################################
        #ACCETTA TUTTO IL TRAFFICO LOCALE
        #################################
        iptables -A INPUT -i lo -j ACCEPT

        ###########################################
        #ACCETTA IL TRAFFICO CHE E' STATO RICHIESTO
        ###########################################
        iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

        ###############################################################################
        #BLOCCA LE RICHIESTE SSH DOPO 2 TENTATIVI DI CONNESSIONE FALLITI PER 60 SECONDI
        ###############################################################################
        iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
        iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 2 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
        iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 2 --rttl --name SSH -j DROP
        iptables -A INPUT -p tcp --dport 22 -j ACCEPT

        ;;
'stop')
        ################################
        #RIPRISTINA LE REGOLE DI DEFAULT
        ################################

        iptables -F
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT

        ;;
*)
        echo "Usage: $0 { start | stop }"
        ;;
esac
exit 0

Un altro esempio di firewall:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: firewall
# Description:       firewall 
### END INIT INFO

case "$1" in
'start')

	echo " Loading iptables rules..."
	iptables -P INPUT DROP
	iptables -P FORWARD DROP
	iptables -A INPUT -i lo -j ACCEPT
	iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH SERVER
##############

	iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
	iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
	iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
	iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
	iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT
	iptables -A INPUT -p tcp --dport 22 -j DROP

# BOT
###################

        #GOOGLE BOT
        iptables -A INPUT -p tcp --dport 80 -s 64.233.160.0/19 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 66.102.0.0/20 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 66.249.64.0/19 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 66.249.72.193 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 72.14.192.0/18 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 74.125.0.0/16 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 209.85.128.0/17 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 216.239.32.0/19 -j DROP
        #BAIDUSPIDER
        iptables -A INPUT -p tcp --dport 80 -s 220.181.108.0/24 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 180.76.0.0/16 -j DROP
        #MSN BOT
        iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 64.4.0.0-64.4.63.255 -j DROP
        iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 65.52.0.0-65.55.255.255 -j DROP
        iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 157.54.0.0-157.60.255.255 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 207.46.0.0/16 -j DROP
        iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 207.68.128.0-207.68.207.255 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 209.19.0.0/16 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 206.80.0.0/16 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 173.44.37.0/24 -j DROP
        #SPAMMER
        iptables -A INPUT -p tcp --dport 80 -s 96.44.143.0/24 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 96.44.144.0/24 -j DROP
        iptables -A INPUT -p tcp --dport 80 -s 96.47.0.0/16 -j DROP

# WEB SERVER
##################
# NOTA: questa regola va inserita DOPO i BOT che sono sulla stessa porta, altrimenti non vengono fermati
# perché questa regola accetta tutti: con iptables le limitazioni vanno PRIMA della regola generale

	iptables -A INPUT -p tcp --dport 80 -j ACCEPT
	iptables -A INPUT -p tcp --dport 443 -j ACCEPT
;;

'stop')
        iptables -F
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT

        ;;
*)
        echo "Usage: $0 { start | stop }"
        ;;
esac
exit 0

Un ulteriore esempio di firewall per il controllo di SSH, più performante che usa le funzioni per evitare di ripetere le varie sezioni. Attenzione al #!/bin/bash iniziale, necessario per function: utilizzando #!/bin/sh non funzionerebbe. Nell'opzione start è appositamente inserito un purge all'inizio per evitare di ricaricare più regole uguali involontariamente.

#!/bin/bash

### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    
# Required-Stop:     
# Should-Start:      
# Should-Stop:       
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts firewall
# Description:       Start firewall
#                    transport.
### END INIT INFO

function firewallstart {
        echo " Purge iptables rules..."
        iptables -F
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT
        echo " Loading iptables rules..."
        iptables -P INPUT DROP
        iptables -P FORWARD DROP
        iptables -A INPUT -i lo -j ACCEPT
        iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

        ###############################################################################
        #BLOCCA LE RICHIESTE SSH DOPO 3 TENTATIVI DI CONNESSIONE FALLITI PER 60 SECONDI
        ###############################################################################
        iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
        iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
        iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j DROP
        iptables -A INPUT -p tcp --dport 22 -j ACCEPT
        }

function firewallstop {
        echo " Purge iptables rules..."
        iptables -F
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT
        }

case "$1" in
'start')
        firewallstart ;
        ;;

'stop')
        firewallstop ;
        ;;

'restart')
        firewallstart ;
        ;;

*)
        echo "Usage: $0 { start | stop | restart }"
        ;;
esac
exit 0