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