Etichette

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../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..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)

10 comments to Configurare un firewall con iptables

  • finalmente, favoloso questo post: chiaro, preciso e completo…
    lo cercavo da tempo :-)

  • Ahahah grazie, spero possa essere utile anche ad altri ;)

  • pao

    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?

  • 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.

  • pao

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

  • 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.

  • lastfeel

    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

  • Teo

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

    Grazie

    teo

  • Hai le idee un po’ confuse…

    apt-get install iptables

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

  • 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

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>