Transparent Firewall Dallavalle A. Dallavalle F. Sozzi 18 Febbraio 2006 In un sistema operativo Linux con un kernel aggiornato alla versione 2.6.x è possibile realizzare un transparent firewall utilizzando le catene di EBTABLES. Nel nostro caso, abbiamo creato un transparent firewall che protegga una rete così strutturata: LAN1 LAN1 192.168.0.254 Rete Pubblica 192.168.0.x 192.135.11.x 160.78.x.x FIREWALL Router etc... BRIDGE Il traffico proveniente dalle reti 192.135.11.0/24 e 160.78.33.0/24 verso qualunque macchina 192.168.0.0/24 non deve avere limitazioni. E' permesso a qualunque indirizzo della rete pubblica (internet) di accedere al server 192.168.0.2 per i servizi ssh, http, https. Qualunque altra comunicazione proveniente dalla rete pubblica alla lan deve essere bloccata. Le macchine nella LAN1 devono poter uscire verso qualunque IP esterno con il solo protocollo ssh (porta 22). La macchina nella LAN1 192.168.0.1 deve poter accedere alla rete pubblica senza limitazioni (proxy). Il server 192.168.0.2 non deve poter accedere direttamente alla rete pubblica. E' stata inoltre creata una catena vuota chiamata SNORT CHAIN per permettere l'attivazione di eventuali filtri automatici generati dal sistema di Intrusion Detection SNORT. Durante la progettazione abbiamo considerato che la rete nella quale inserire il firewall fosse già configurata come in figura, ovvero alla LAN interna sia assegnato il range di indirizzi privati 192.168.0.x/24 e, in particolare, gli indirizzi del server, del proxy e del default gateway siano, rispettivamente, 192.168.0.2, 192.168.0.1 e 192.168.0.254. Per chiarezza, EBTABLES utilizza tre tabelle: filter è la tabella di default e contiene tre catene: INPUT (per i frames destinati al firewall stesso, a livello MAC), OUTPUT (per i frames generati localmente) e FORWARD (per i frames che devono essere inoltrati dal firewall). nat è usata per il Network Address Translation. Effettua il NAT degli indirizzi ip per far transitare i pacchetti delle reti che attraversano il firewall. Anche qui ci sono tre catene predefinite. La prima è PREROUTING che viene utilizzata per modificare i pacchetti prima 1
che vengano processati dal firewall. La seconda, OUTPUT, viene utilizzata per alterare i pacchetti generati localmente prima che vengano prese decisioni di routing. L ultima catena è POSTROUTING e viene utilizzata sui pacchetti che stanno per lasciare il firewall. broute è utilizzata per creare un brouter ed ha un'unica catena predefinita: BROUTING. PREPARAZIONE DEL SISTEMA Download dei pacchetti La distro di Linux fornita è la Fedora Core 4, per questo motivo dato che la versione del kernel presente non permetteva il corretto funzionamento delle ebtables, abbiamo provveduto ad aggiornare il kernel e ad apportare alcune modifiche per permettere il funzionamento del progetto. 1. sfruttando il repository del dipartimento di Fisica (dist serv.fis.unipr.it) abbiamo scaricato una versione aggiornata del kernel (/rep/fc i386/rpms.updates/kernel smp 2.6.15 1.1831_FC4.i686.rpm) 2. sempre dal repository di Fisica, abbiamo scaricato il pacchetto udev 071 0.FC4.2.i386.rpm per soddisfare le dipendenze del kernel 3. abbiamo poi provveduto a scaricare una versione aggiornata di ebtables per Fedora Core 4 (ebtables 2.0.6 7.fc4.i386.rpm) e, dal sito http://linux. net.osdl.org/index.php/bridge, abbiamo scaricato l' ultima versione disponibile di bridge utils (la 1.1) per gestire il bridge Installazione e configurazione dei pacchetti Innanzitutto abbiamo installato il pacchetto udev: # rpm -i udev-071-0.fc4.2.i386.rpm successivamente abbiamo installato l' rpm del kernel # rpm -i kernel-smp-2.6.15-1.1831_fc4.i686.rpm abbiamo poi installato l' rpm di ebtables # rpm -i ebtables-2.0.6-7.fc4.i386.rpm per quanto riguarda invece brctl, dopo aver scaricato il paccheto tar abbiamo provveduto alla compilazione dello stesso: # tar xvfz bridge-utils-1.1.tar.gz # cd bridge-utils-1.1 #./configure # make # cd brctl # cp brctl /sbin/ 2
Creazione degli scripts di ebtables Script di avvio: Per avviare il firewall abbiamo creato uno script di avvio (startebfw): #!/bin/bash echo "EBTables Transparent Firewall Start..." # Comandi EBTABLES=/sbin/ebtables BRCTL=/sbin/brctl IFCONFIG=/sbin/ifconfig # Definizione nomi interfacce INSIDE_IF_NAME=eth0 OUTSIDE_IF_NAME=eth1 BRIDGE_IF_NAME=br0 # echo "Creazione delle catene" $EBTABLES -N lanwww # traffico da lan a internet (da eth0 a eth1) $EBTABLES -N wwwlan # traffico da internet a lan (da eth1 a eth0) $EBTABLES -N SNORT_CHAIN # catena aggiuntiva per l' uso di SNORT # Settaggio policy di default $EBTABLES -P FORWARD DROP # la policy della catena FORWARD viene impostata a DROP $EBTABLES -A FORWARD -j SNORT_CHAIN In questo modo impostiamo le policy, ovvero la politica che intendiamo adottare per il trattamento dei pacchetti che attraversano la catena FORWARD, in particolare tutti i pacchetti che non rispetteranno le regole definite in seguito verranno scartati (DROP) #################### # vengono cancellate tutte le regole presenti precedentemente nelle catene $EBTABLES -F # # Assegnazione ai 2 flussi di dati delle rispettive catene di regole $EBTABLES -A FORWARD -i $INSIDE_IF_NAME -o $OUTSIDE_IF_NAME -j lanwww $EBTABLES -A FORWARD -i $OUTSIDE_IF_NAME -o $INSIDE_IF_NAME -j wwwlan Con questi comandi specifichiamo che il traffico proveniente dall' interfaccia eth0 e diretto all' interfaccia eth1 (traffico uscente dalla lan) verrà gestito dalla catena lanwww, mentre invece il traffico proveniente dall' interfaccia eth1 e diretto all' interfaccia eth0 (traffico entrante nella lan) verrà gestito dalla catena wwwlan 3
# echo "Definizione delle regole" $EBTABLES -A wwwlan -p 0x800 --ip-src 160.78.33.0/24 --ip-dst 192.168.0.0/24 -j ACCEPT $EBTABLES -A wwwlan -p 0x800 --ip-src 192.135.11.0/24 --ip-dst 192.168.0.0/24 -j ACCEPT $EBTABLES -A wwwlan -p 0x800 --ip-dst 192.168.0.2 --ip-proto tcp --ip-dport 22 -j ACCEPT $EBTABLES -A wwwlan -p 0x800 --ip-dst 192.168.0.2 --ip-proto tcp --ip-dport 80 -j ACCEPT $EBTABLES -A wwwlan -p 0x800 --ip-dst 192.168.0.2 --ip-proto tcp --ip-dport 443 -j ACCEPT $EBTABLES -A lanwww -p 0x800 --ip-src 192.168.0.0/24 --ip-proto tcp --ip-dport 22 -j ACCEPT $EBTABLES -A lanwww -p 0x800 --ip-src 192.168.0.1 -j ACCEPT $EBTABLES -A lanwww -p 0x800 --ip-src 192.168.0.2 -j DROP in questa sezione vengono definite le regole che gestiscono il traffico secondo quanto specificato dalle richieste del progetto echo "Configurazione Bridge" $BRCTL addbr br0 $BRCTL addif br0 eth0 $BRCTL addif br0 eth1 $IFCONFIG br0 192.168.0.123 up echo "Fine configurazione" # # END ##################################################### Script di stop: Nello script di stop (stopebfw) eliminiamo tutte le catene e le regole da noi impostate, ripristinado la situazione iniziale: #!/bin/bash echo "EBTables Transparent Firewall Stop..." # Comandi EBTABLES=/sbin/ebtables BRCTL=/sbin/brctl IFCONFIG=/sbin/ifconfig # Definizione nomi interfacce INSIDE_IF_NAME=eth0 OUTSIDE_IF_NAME=eth1 BRIDGE_IF_NAME=br0 echo "Rimozione bridge" 4
$IFCONFIG br0 down $BRCTL delif br0 eth0 $BRCTL delif br0 eth1 $BRCTL delbr br0 echo "Pulizia catene di Ebtables" $EBTABLES -F $EBTABLES -X lanwww $EBTABLES -X wwwlan $EBTABLES -X SNORT_CHAIN $EBTABLES -P FORWARD ACCEPT echo "Firewall Disattivato" # # END # Installazione del Firewall La procedura di installazione e' molto semplice. Dopo aver scompattato il file tar con il comando: # tar xvfz ebtables.tar.gz possiamo procedere all'installazione sfruttando il makefile contenuto: # make install Eventuali altri target disponibili sono: make doc, make dist, make uninstall e make clean. Strumenti utilizzati Per la realizzazione di questo progetto sono stati utilizzati i seguenti strumenti: 1. Vim, un editor di testo con cui abbiamo scritto e/o modificato la maggior parte dei files del progetto 2. DocBook per la creazione della documentazione in html e pdf 5