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)

Author: Matteo Temporini

Nato nel 1979 a Udine (Italia), ho conseguito il diploma di scuola superiore come Programmatore. Ho proseguito gli studi ottenendo nel 2006 la Laurea in Informatica, presso l'università degli studi di Udine. Da sempre appassionato al mondo del Web, ho maturato un esperienza decennale come sistemista Linux e Windows presso varie aziende. Quello che state leggendo su questo sito è frutto della mia esperienza diretta, che continua a crescere grazie ad amici e colleghi.

Share This Post On

15 Comments

  1. finalmente, favoloso questo post: chiaro, preciso e completo…
    lo cercavo da tempo 🙂

  2. Ahahah grazie, spero possa essere utile anche ad altri 😉

  3. Grazie per la dritta! C’è una cosa però che non mi torna: una volta configurato il firewall in questo modo non mi è più possibile utilizzare l’apt-get! In teoria la connessione avviene sulla porta 80 vista la sorgente http, eppure non riesco a farlo funzionare!
    Ho provato anche a consentire la connessione in ingresso dal server sorgente, ma ogni volta mi restituisce un errore di unknown host: suggerimenti?

  4. Ciao, dovresti controllare che effettivamente l’apt che usi vada sulla porta 80, se hai la riga

    iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT

    non dovresti avere problemi.

    Può essere che apt scarichi file da server ftp, prova ad aggiungere la stringa

    iptables -A OUTPUT -p tcp –dport 21 -j ACCEPT

    in tal modo abiliti anche la porta 21 in uscita.

  5. io ho copiato il tuo setup, in cui le due porte in questione sono già aperte, no?

  6. Eh si sono già aperte entrambe

    per curiosità prova a dare un

    iptables -L

    e vedi se è tutto a posto, nel senso se le porte che ti interessano sono aperte.

    Oppure controlla che apt non vada magari a cercare di collegarsi su altre porte, nel qual caso prova ad aprirle temporaneamente.

  7. devi anche dire a iptables la porta sorgente
    iptables -A OUTPUT -p tcp -d 0/0 –dport 80 –sport 1024:65535 -j ACCEPT
    iptables -A OUTPUT -p tcp -d 0/0 –dport 21 –sport 1024:65535 -j ACCEPT

  8. Ciao, sto per mettere on line il mio server web ma…dove trovo iptables ? Lo apro con vi ?? dov’è ??

    Grazie

    teo

  9. Hai le idee un po’ confuse…

    apt-get install iptables

    quello sopra è uno script che richiama l’eseguibile di iptables.

  10. bella guida, grazie! ..completo per chi avesse una Redhat 5.5, o CentOS 5.5, con installato un MySQL:
    iptables -I RH-Firewall-1-INPUT -p tcp –dport 3306 -j ACCEPT

  11. Ciao.. Bella guida… Volevo chiedere però se era applicabile su un fw con 2 interfaccie di rete…
    Questa da quello che ho capito.. è per un pc con una interfaccia di rete.. giusto??

  12. Ciao Mano,
    in realtà questo firewall era installato su di un server con due itnerfacce di rete, queste policy si applicavano sull’itnerfaccia di default, mentre quella sulla rete interna non aveva alcun blocco.

    Ovviamente se vuoi puoi esplicitare le itnerfacce di rete su cui fare agire i comandi di iptables.

  13. Nella mia situazione ho un ubuntu 10.. installato su un pc… il quale utilizza una connessione wi fi per internet e una via cavo a cui vorrei collegare altri pc…
    Con la configurazione scritta da te, se io collego via ethernet un notebook in teoria quest’ultimo dovrebbe andare su internet tranquillamente passando per il pc con iptables configurato… giusto?
    La tua configurazione quindi funziona con eth0 e eth1 ?
    Scusami per il disturbo che ti reco ma ho l’idee un po confuse 🙁

  14. Ciao Mano, vai tranquillo se posso aiutarti con piacere 😉

    Ad ogni modo attenzione che questa configurazione non ti fa condividere la connessione, servono un paio di altre righe e soprattutto, devi abilitare l’ipv4 forwarding per usarlo per uscire su internet.

  15. ecco appunto 😀 … ip_forward dovrei implementarlo nello script per fare l’inoltro dei pacchetti da una interfaccia ad un altra?
    Ma bene o male il concetto l’ho capito.. + o – 😀 , Il mio problema è scriverlo nello script…
    Io vorrei determinate regole per la Lan…
    ad ogni regola inserita devo digli a quale interfaccia?
    es. voglio che dalla lan riescano ad entrare in un ftp all’esterno, la regola che io andrò a inserire potrebbe essere :

    Abilito il modulo ip_forward

    iptables -A OUTPUT -i eth1 -p tcp –dport 21 -j accept
    iptables -m state –established,related -j accept

    avrò sbagliato qualcosa credo..
    ma quello che voglio capire è se ad ogni regola inerente ad una interfaccia o l’altra devo inserire il comando -i …

Submit a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Per postare il commento, risolvi il quesito sottostante * Time limit is exhausted. Please reload CAPTCHA.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

All original content on these pages is fingerprinted and certified by Digiprove