Configurare un firewall con iptables
Questa guida non vuole essere il solito howto dove si spiega, che in iptables, ci sono le catene, le policy di default, quali sono e come funzionano, ma vuole essere una versione più pratica di un howto, e spiegare come configurare un firewall per linux con le seguenti caratteristiche:
- policy di default: drop di tutti i pacchetti
- permettere solo ai servizi che ci interessano di essere accessibili all’esterno
- permettere certi servizi accessibili solo dalla LAN
caso tipico di confiurazione di un firewall in ambito aziendale.
Per prima cosa impostiamo le policy di default in DROP, in modo che qualunque cosa venga scartata se non permessa dalle nostre regole successive
# Imposto le policy di default
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
ora tutti i pacchetti in arrivo verranno droppati (ovviamente se lavorate in remoto non lanciate questi comandi o non sarete più in grado di accedere alla shell Ndr.).
Ora abilitamo un paio di servizi utili per un normalissimo server
# Abilito i ping alla macchina
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
In questo modo abilitamo la macchina a rispondere ai ping da qualunque macchina sulla rete (ovviamente se non volete basta non inserire la regola, ma secondo me è buona norma farlo).
# Imposto regole generiche sulle connessioni in ingresso
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Questa è una regola generica sullo stato delle connessioni.
Ipotizziamo ora che sulla nostra macchina girino i seguenti 3 servizi:
- http (porta 80)
- https (porta 443)
- ssh (è una macchina remota e vogliamo potervi accedere ovviamente)
non ci resta altro che usare le seguenti regole
# Accetto le connessioni del webserver
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Accetto connessioni webserver in https
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Accetto le connessioni ssh in ingresso
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Ipotizziamo ora di avere un server mysql, che ovviamente in locale grazie alle prime regole è accessibile, ma vogliamo che sia accessibile anche dalla lan, la soluzione è
# Accetto le connessioni in ingresso di mysql
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 3306 -j ACCEPT
consentiamo così l’accesso diretto a mysql dai client della nostra LAN.
Tutto quanto visto sino ad ora è velido per le connessioni in ingresso, per le connessioni in uscita la faccenda è molto simile, solamente che al posto di -A INPUT dovremo mettere -A OUTPUT, un esempio tipico è il seguente
# Abilito i ping in uscita
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
# Imposto regole generiche sulle connessioni in uscita
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# permetto di inviare email via smtp solo dal localhost
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
# Webserver esterni
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
# webserver esterni https su 443 e 8443
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 8443 -j ACCEPT
# ftp in uscita (serve per gli aggiornamenti del sistema)
iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT
# abilito l'utilizzo del whois
iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT
iptables -A OUTPUT -p udp --dport 43 -j ACCEPT
# nameserver in uscita per gli slave
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
# ntp in uscita per aggiornare l'ora
iptables -A OUTPUT -p tcp --dport 123 -j ACCEPT
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
# abilito mysql in uscito per il db di eastitaly.com
iptables -A OUTPUT -p tcp -d 192.168.0.2 --dport 3306 -j ACCEPT
Infine chiudiamo il tutto con
#####
# Tutti gli altri pacchetti (reject+reset)
###
iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
In modo che qualunque cosa sfugga se abbiamo fatto qualche errore venga sicuramente buttata.
Mettiamo il tutto in un bel file (firewall.sh con opportuni permessi) e abbiamo il nostro firewall!
(Questo articolo è stato pubblicato anche su tuxblog)
![Validate my CSS [Valid CSS]](wp-content/themes/silver-lexus-08/images/vcss.gif)
![Validate my RSS feed [Valid RSS]](wp-content/themes/silver-lexus-08/images/valid-rss.png)