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