Impostare un firewall con uno script iptables

Da Guide@Debianizzati.Org.
Versione del 17 apr 2011 alle 13:51 di Ferdybassi (discussione | contributi) (Creata pagina con '== Introduzione == Questa guida non vuole essere il solito howto dove si spiega che in <code>iptables</code> ci sono le catene, le policy di default, quali sono e come funzionano...')
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

Introduzione

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:

  1. policy di default: drop di tutti i pacchetti
  2. permettere solo ai servizi che ci interessano di essere accessibili dall’esterno
  3. permettere a certi servizi di essere accessibili solo dalla LAN

Descrizione delle regole

Dopo aver dichiarato alcune variabili passiamo alla pulizia delle chains e alla reinizializzazione dei contatori:

iptables -F #Cancellazione delle regole presenti nelle chains
iptables -X #Eliminazione delle chains non standard vuote
iptables -Z #Inizializzazione dei contatori (utile per il debugging)

Definiamo in seguito le policy di default per le 3 chains predefinite, settando tutto a DROP (in questo modo, tutto ciò che non è esplicitamente permesso è di fatto proibito!):

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

Le 2 policy built-in sono ACCEPT (che accetta tutti i pacchetti su una data chain) e DROP, che abbiamo già visto. Sono inoltre presenti 2 estensioni: LOG (relativa al modulo che si occupa del logging dell'attività del firewall) e REJECT (che ha fondamentalmente lo stesso effetto di DROP, ma risponde ai tentativi di connessione con un ICMP "port unreachable").
Infine, è possibile utilizzare altri due target speciali, RETURN e QUEUE, che però non approfondiremo.
Siamo finalmente giunti alle regole vere e proprie. Cominciamo accettando esplicitamente tutto il traffico, in uscita ed in entrata, sull'interfaccia di loopback. Si tratta di una scelta consigliata e assolutamente sicura, poichè il loopback non rappresenta un collegamento alla rete, ma viene utilizzato da alcune applicazioni per il loro correttto funazionamento:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Come vediamo abbiamo specificato le due chains su cui agire (INPUT e OUTPUT), l'interfaccia relativa (lo) ed il target, ovvero la policy da seguire per i pacchetti che matchano la regola.
A questo punto vediamo all'opera una delle nuove funzionalità di iptables, il Rate Limiting, che ci permette di proteggerci dai SYN flood. Creando una nuova chain user-defined dove inviare TCP SYN, infatti, possiamo limitare il ratio di arrivo dei pacchetti ed evitare così attacchi di tipo Denial of Service (DoS), che mirano ad esaurire le risorse dei sistemi bersaglio:

iptables -N syn-flood
iptables -A INPUT -i $IFACE -p tcp syn -j syn-flood
iptables -A syn-flood -m limit limit 1/s limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP

Quello che abbiamo fatto è creare una nuova chain user-defined chiamata "syn-flood", attraverso l'opzione -N. A questo punto abbiamo comunicato al Packet Filter di inviare tutti i pacchetti TCP con flag SYN settato (-p tcp syn) a tale chain e di limitare il ratio di arrivo di tali pacchetti.
Ora utilizziamo la Stateful Inspection per assicurarci che le nuove connessioni TCP siano dei pacchetti SYN e per rifiutare di conseguenza tutte quelle che non lo sono (possibili FIN scan o pacchetti malformati):

iptables -A INPUT -i $IFACE -p tcp syn -m state state NEW -j DROP

Infine passiamo a impostare le regole sui servizi offerti dal nostro server:

  1. Accesso pubblico al servizio
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
  1. Accesso al servizio solo dalla nostra LAN
iptables -A INPUT -p tcp --dport 2605 -m state --state NEW -s 192.168.90.0/24 -j ACCEPT

Lo script

Creiamo quindi un nuovo file:

# nano /etc/iptables-firewall.sh

e diamogli questo contenuto, mettendo in pratica quanto visto nel paragrafo precedente: