Firewall trasparente (bridge) su White Russian RC4

Questa configurazione consente di installare un firewall trasparente (che non richiede modifiche alla topologia della rete) che puo` essere infilato in qualsiasi pezzo di ethernet e gestisce i pacchetti sia a layer 2 che a layer 3. Usa ebtables per il layer2 e iptables per il layer3. Attenzione, il wrt non e` per nulla una bomba di prestazioni, e non supera i 20 megabit in questa configurazione.

Principio di funzionamento

Si separano due interfacce dalla normale configurazione di rete del WRT, arrivando quindi ad avere:

Il wrt e` raggiungibile dalla LAN o dalla WAN soltanto, ed egli stesso e` configurato (volendo) per andare su internet (per scaricare i pacchetti, ad esempio) sulla sua porta WAN. Nessun traffico viene fatto da e per il WRT sulle porte destinate al firewall.

Installazione

Installare openwrt (ho usato White Russian RC4) e poi installare i pacchetti necessari allo scopo specifico, cioe`:

Configurazione delle vlan

Per poter "prendere" due porte dello switch e usarle per il firewall, devo prima di tutto creare due nuove vlan, ognuna delle quali conterra` una porta dello switch "esterna" e la porta "interna" che parla con la cpu del WRT.

Prima di tutto, tolgo dalla vlan0 (LAN) due porte, diciamo la 1 e la 2 (occhio, che il software le vede come 2 e 3, perche` l'ordine delle porte e` tutto incasinato. Lo stesso robocfg non riporta l'ordine corretto, per cui si va a tentativi. Il comando che uso e`:

nvram set vlan0ports="1 0 5*"

(In origine, vlan0ports valeva "3 2 1 0 5*")

Poi, creo due nuove vlan, la vlan2 e la vlan3 (0 e 1 esistono gia`)

nvram set vlan2hwname=et0
nvram set vlan2ports="2 5"
nvram set vlan3hwname=et0
nvram set vlan3ports="3 5"

Ora, nvram commit e reboot.

Adesso per parlare con il WRT mi restano le porte 3 e 4 (internamente sono la 0 e la 1) perche` le altre non sono piu` configurate.

Uno sguardo al comando "robocfg show" dara` un'idea di come siano configurate le porte dello switch.

Configurazione del bridge

Ora ho due nuove vlan, la 2 e la 3, corrisponenti alle porte "fisiche" 1 e 2 (logicamente sono la 2 e la 3) che pero` non sono ancora configurate.

Volendo, potrei dare ad ognuna un indirizzo ip e fare routing, ma voglio fare bridging, quindi le metto in bridge fra di loro e non configuro nessun indirizzo IP. Per metterle in bridge, creo un nuovo bridge di nome "br1" (br0 e` gia` esistente ed e` il bridge fra WLAN e LAN).

Il nome "brfw" e` arbitrario, la posso chiamare come mi pare, pero` mi serve un nome che abbia senso e cosi` "brfw" come "bridged firewall" mi e` sembrato carino.

nvram set brfw_ifname=br1
nvram set brfw_ifnames="vlan2 vlan3"
nvram set brfw_proto=static
nvram set brfw_stp=0
nvram commit

Prima di rebootare, devo modificare /etc/init.d/S40network ed aggiungere una riga che dice

ifup brfw

Se non lo faccio, il mio bridge non viene tirato su mai (posso anche farlo a mano, se voglio, ma tanto alla fine va messo in automatico, no?) Ora reboot, e... IFIX TCHEN TCHEN! Le porte del bridge parlano fra di loro, come se fossero un cavo di rete. Ma ancora non c'e` firewalling.

Configurazione del firewall

Prima di tutto, occorre caricare il modulo "ebtables", aggiungendolo a /etc/modules. Dal momento in cui lo faccio, le interfacce del bridge br1 sono soggette a tutte le regole di ebtables e a tutte le regole di iptables, ergo nella config di default il traffico ip non passa piu`, perche` in iptables la tabella forward defaulta a "REJECT". In ebtables, invece, non avendo ancora caricato il modulo ebtale_filter, i filtri ancora non ci sono, quindi e` tutto aperto.

Regole di iptables

Se occorre solo gestire traffico ip e non altri protocolli in layer2, si puo` basarsi solo su iptables, quindi occorrera` modificare il firewall, aggiungendo regole per il forward da/a br1.

Editare il file /etc/firewall.user e aggiungere regole nella tabella forward, cosi`:

iptables -A forwarding_rule -i br1 -o br1 -s 62.123.154.74 -j ACCEPT
iptables -A forwarding_rule -i br1 -o br1 -d 62.123.154.74 -j ACCEPT

Questa regola, per esempio, consente alle macchine dietro al firewall di comunicare liberamente in tutte e due le direzioni (anche da fuori a dentro!) con la macchina remota 62.123.154.74. Notare che per il kernel i pacchetti entrano ed escono da br1, quindi il concetto di "entrata" e "uscita" non e` semplice da implementare, bisogna andare di indirizzi IP sorgente e destinazione.

E` importante ricordare che occorre in ogni caso caricare il modulo "ebtables" anche se si usa solo iptables.

Regole di ebtables

Se si vuole gestire il traffico a layer2, occorre come minimo caricare anche il modulo "ebtable_filter", piu` eventualmente un'altra sbaraccata di moduli per ebtables (un ls di /lib/modules/<versione del kernel> chiarira` le idee su quanti ce ne siano).

A questo punto, con il comando userspace "ebtables" e` possibile gestire il layer2. Va ricordato che comunque il traffico IP passa anche per iptables, quindi se si vuole aprire completamente al traffico IP per usare solo regole di ebtables, occorre una riga in firewall.user che dica:

iptables -A forwarding_rule -i br1 -o br1 -j ACCEPT

E` ovviamente possibile usare una combinazione di regole di layer 3 e layer 2.

Disabilitazione della wireless

Se la wireless non serve, la si puo` disattivare. Questo ovviamente non ha nulla a che vedere direttamente con il discorso del firewall, ma se non voglio usare la wireless perche` il firewall non deve essere accessibile dalla WLAN, faccio:

nvram set wl_radio=0 
nvram commit

Al boot, il comando "wifi up" dentro a S40network fara` spegnere la radio essendo settato il parametro wl_radio a zero nella nvram.

OpenWrt/WhiteRussian/BridgingFirewall (last edited 2009-04-12 17:33:25 by localhost)