Ora è arrivato il momento di creare il proprio file con le
regole per il firewall, in modo da rendere sicura la rete interna.
Ci sono delle complicazioni nel fare questo, perché non tutte le
funzionalità del firewall sono disponibili sui pacchetti inoltrati
dal bridge. Inoltre, c'è una differenza tra i pacchetti che stanno
per essere inoltrati dal bridge e quelli indirizzati alla macchina locale.
In generale, i pacchetti che entrano nel bridge vengono processati dal
firewall solo una volta, non due come al solito; infatti vengono filtrati
solo in ingresso, quindi qualsiasi regola che usi out
oppure xmit
non verrà mai eseguita. Personalmente
uso in via
che è una sintassi più antica,
ma che ha un senso quando la si legge.
Un'altra limitazione è che si possono usare solo i comandi
pass
e drop
per i pacchetti filtrati
dal bridge. Cose avanzate come divert
,
forward
o reject
non sono disponibili.
Queste opzioni possono ancora essere usate, ma solo per il traffico da
e verso la macchina bridge stessa (sempre che le sia stato assegnato
un IP).
Nuovo in FreeBSD 4.0 è il concetto di stateful filtering. Questo è un grande miglioramento per il traffico UDP, che consiste tipicamente di una richiesta in uscita, seguita a breve termine da una risposta con la stessa coppia di indirizzi IP e numeri di porta (ma con mittente e destinatario invertiti, ovviamente). Per i firewall che non supportano il mantenimento di stato, non c'è modo di gestire questo breve scambio di dati come una sessione unica. Ma con un firewall che può «ricordarsi» di un pacchetto UDP in uscita e permette una risposta nei minuti successivi, gestire i servizi UDP è semplice. L'esempio seguente mostra come fare. La stessa cosa è possibile farla con i pacchetti TCP. Questo permette di evitare qualche tipo di attacco denial of service e altri sporchi trucchi, ma tipicamente fa anche crescere velocemente la tabella di stato.
Vediamo un esempio di configurazione. Bisogna notare che all'inizio
del file /etc/rc.firewall
ci sono già delle
regole standard per l'interfaccia di loopback
lo0
, quindi non ce ne occuperemo più ora.
Le regole personalizzate andrebbero messe in un file a parte (per esempio
/etc/rc.firewall.local
) e caricate all'avvio
modificando la riga del file /etc/rc.conf
dove era
stata definita la modalità open
con:
Bisogna specificare il path completo del file, altrimenti non verrà caricato con il rischio di rimanere tagliati fuori dalla rete.
Per il nostro esempio immaginiamo di avere l'interfaccia
fxp0
collegata all'esterno (Internet) e la
xl0
verso l'interno (LAN).
La macchina bridge ha assegnato l'IP
1.2.3.4
(è impossibile che il vostro ISP vi assegni un
indirizzo simile a questo, ma per l'esempio va bene).
Coloro che hanno configurato un firewall in precedenza potrebbero aver notato che manca qualcosa. In particolare, non ci sono regole contro lo spoofing, difatti non abbiamo aggiunto:
Ovvero, non far entrare dall'esterno pacchetti che affermano di venire dalla rete interna. Questa è una cosa che solitamente viene fatta per essere sicuri che qualcuno non provi a eludere il packet filter, generando falsi pacchetti che sembrano venire dall'interno. Il problema è che c'è almeno un host sull'interfaccia esterna che non si può ignorare: il router. Solitamente, però, gli ISP eseguono il controllo anti-spoof sui loro router e quindi non ce ne dobbiamo preoccupare.
L'ultima riga sembra un duplicato della regola di default, ovvero non far passare nulla che non sia stato specificatamente permesso. In verità c'è una differenza: tutto il traffico sospetto verrà loggato.
Ci sono due regole per permettere il traffico SMTP e DNS verso il mail server e il name server, se ne avete. Ovviamente l'intero set di regole deve essere personalizzato per le proprie esigenze, questo non è altro che uno specifico esempio (il formato delle regole è spiegato dettagliatamente nella man page ipfw(8)). Bisogna notare che, affinché «relay» e «ns» siano interpretati correttamente, la risoluzione dei nomi deve funzionare prima che il bridge sia attivato. Questo è un chiaro esempio che dimostra l'importanza di settare l'IP sulla corretta scheda di rete. In alternativa è possibile specificare direttamente l'indirizzo IP anziché il nome host (cosa necessaria se la macchina è IP-less).
Le persone che sono solite configurare un firewall probabilmente
avranno sempre usato una regola reset
o
forward
per i pacchetti
ident (porta 113 TCP). Sfortunatamente, questa non
è una scelta applicabile con il bridge, quindi la cosa migliore
è lasciarli passare fino alla destinazione. Finché la
macchina di destinazione non ha un demone ident attivo, questa tecnica
è relativamente sicura. L'alternativa è proibire le
connessioni sulla porta 113, creando qualche problema con servizi tipo
IRC (le richieste ident devono andare in
timeout).
L'unica altra cosa un po' particolare che potete aver notato è
che c'è una regola per lasciar comunicare la macchina bridge e
un'altra per gli host della rete interna. Ricordate che questo è
dovuto al fatto che i due tipi di traffico prendono percorsi differenti
attraverso il kernel e di conseguenza anche dentro il packet filter. La
rete interna passerà attraverso il bridge, mentre la macchina
locale userà il normale stack IP per le connessioni. Perciò
due regole per gestire due casi differenti. Le regole in via
funzionano in entrambi i casi.
In generale, se usate regole fxp0
in via
attraverso il
packet filter, dovrete fare un'eccezione per i pacchetti generati
localmente, in quanto non entrano tramite nessuna interfaccia.
Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Per domande su FreeBSD, leggi la
documentazione prima di contattare
<questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a
<doc@FreeBSD.org>.