Firewall economico con Zeroshell su VirtualBox

Avete un vecchio PC che non va più bene per giocare o non regge le ultime versioni dei sistemi Windows ? Questo non significa che lo dobbiate per forza buttare via: potreste riciclarlo, con una spesa veramente contenuta,  per implementare un Firewall con la gestione di due linee ADSL bilanciate utilizzando Zeroshell e VirtualBox.

Vediamo come sia possibile installare un firewall Zeroshell in una macchina virtuale VirtualBox ospitata su server con GNU/Linux Ubuntu 9.10 (Karmic Koala), con la condivisione di due linee ADSL configurate per il bilanciamento e la possibilità di mantenere altri servizi sul server host.

Premessa

L’installazione è nata dall’esigenza di fornire il servizio di connessione a internet e un FAX Server, sfruttando la presenza di due connessioni ADSL per implementare il bilanciamento del carico e la tolleranza di guasti sulle linee.

La necessitè di implementare un FAX Server ha portato alla scelta di installare Zeroshell in una macchina virtuale in modo da poter utilizzare lo stesso PC per entrambi.

Un ulteriore vantaggio offerto dall’installazione di Zeroshell in una macchina virtuale è data dalla possibilità di accedere alla console senza la necessità di accedere fisicamente al server. Questo si può rivelare molto utile nel caso di attivazione di un profilo non  funzionante che inibisca l’accesso alla GUI.

Il server utilizzerà quattro schede di rete, una dedicata al sistema host e le altre tre dedicate a Zeroshell.

Composizione della rete

La rete è relativamente semplice e comprende due connessioni ADSL ed alcuni PC, senza la necessità di configurazioni complesse quali DMZ o sottoreti separate.

Le sottoreti utilizzate sono tre:

  1. 192.168.0.0/24 connessa alla prima linea ADSL tramite il router all’indirizzo 192.168.0.1 e a Zeroshell tramite la scheda eth00 con indirizzo 192.168.0.2 (connessione diretta server – router ADSL)

  2. 192.168.1.0/24 connessa alla seconda linea ADSL tramite il router all’indirizzo 192.168.1.1 e a Zeroshell tramite la scheda eth01 con indirizzo 192.168.1.2 (connessione diretta server – router ADSL)

  3. 192.168.2.0/24 LAN connessa a Zeroshell tramite la scheda eth02 con indirizzo 192.168.2.1 (connessione server – switch ethernet)

Lo schema non segue le convenzioni utilizzate nella documentazione ufficiale di Zeroshell solo per comodità dell’autore che ha preferito usare impostazioni più facili da ricordare, come l’associazione di eth00 con la sottorete 192.169.0.0, eth01 con 192.168.1.0 ecc.

Bisogna tenere bene a mente che le interfacce di rete Zeroshell ETH00, ETH01, ETH02 sono virtuali, mappate su eth1, eth2, eth3 del sistema host. A sua volta il sistema host utilizzerà direttamente la propria interfaccia eth0 per l’accesso alla LAN.

Preparazione del server

Siccome il server è dedicato ai suelencati compiti specifici, ho provveduto a disabilitare le funzionalità non richieste, agendo in parte sulle impostazioni della scheda madre ed in parte nelle impostazione del BIOS, per risparmiare risorse. Quindi via il supporto USB, LPT, COM2 (COM1 o meglio ttyS0 servirà per il modem/fax) e – dopo l’installazione di base – al canale IDE secondario, con relativa rimozione del lettore CD.
Il sistema ottenuto ha così una migliore distribuzione degli IRQ ed un avvio più veloce; inoltre non verranno caricati driver per dispositivi non necessari.

Ricordiamo di collegare una delle schede di rete, sarà quella utilizzata come eth0 per il sistema host e FAX Server.

Installazione di base

Parto dal presupporto che la rete disponga di un server DHCP, ormai comune nei router ADSL e utile per poter installare Ubuntu senza dover scaricare il DVD completo di tutti i pacchetti.

L’installazione iniziale è va quindi eseguita utilizzando il CD di Ubuntu Server 9.10 i386, selezionando esclusivamente l’opzione Server OpenSSH per i pacchetti predefiniti; in questo modo l’installazione può essere continuata da un terminale remoto. Nonostante non sia strettamente necessario, questo è il metodo che preferisco in quanto il terminale virtuale permette il copia-incolla da altre applicazioni e la visualizzazione di più linee.

Se non conosciamo l’indirizzo IP assegnato al PC, possiamo collegarci dalla console ed esaminare lo stato della rete col il comando:

ottenendo qualcosa del tipo:

eth0    Link encap:Ethernet  HWaddr 00:03:6d:30:5c:f3
          indirizzo inet:192.168.2.231  Bcast:192.168.2.255  Maschera:255.255.255.0
          indirizzo inet6: fe80::203:6dff:fe30:5cf3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24129 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12786 errors:0 dropped:0 overruns:0 carrier:0
          collisioni:0 txqueuelen:1000
          Byte RX:1812248 (1.8 MB)  Byte TX:15425235 (15.4 MB)
          Interrupt:16 Indirizzo base:0x8000

Configurazione ambiente

Colleghiamoci sul server utilizzando un terminale virtuale. Lavorando con un sistema GNU/Linux io utilizzo ssh, chi lavora con Windows può utilizzare Putty od un’applicazione simile.

Quindi utilizziamo l’indirizo visualizzato da ifconfig:

Utilizzeremo il nome utente specificato in fase di installazione per l’ammnistrazione del sistema. Dovendo eseguire operazioni di sistema, possiamo acquisire i privilegi di root per la sessione con il comando:

possiamo subito aggiornare il sistema in modo da avere tutti i pacchetti aggiornati:

Alcune personalizzazioni

Sebbene non indispensabile, possiamo installare un editor più umano dello standard vi. Su Ubuntu troverete già installato nano, io per abitudine utilizzo joe.

Per l’utilizzo del FAX Server e Host VirtualBox, è preferibile utilizzare un indirizzo IP fisso quindi andremo a modificare le impostazioni per la scheda di rete eth0.

La riga relativa alla configurazione dell’interfaccia eth0 va modificata da:

a:

quindi possiamo riavviare la rete per applicare le nuove impostazioni

avendo cambiato l’indirizzo di rete sarà necessario ricollegarsi

e acquisire di nuovo i prvililegi di root

verifichiamo che le altre schede di rete siano state riconosciute ed attivate

otterremo qualcosa de tipo:

*-network:0 DISABLED
       description: Ethernet interface
       product: RTL-8139/8139C/8139C+
       vendor: Realtek Semiconductor Co., Ltd.
       physical id: c
       bus info: pci@0000:00:0c.0
       logical name: eth1
       version: 10
       serial: 00:05:1c:09:b4:04
       size: 100MB/s
       capacity: 100MB/s
       width: 32 bits
       clock: 33MHz
       capabilities: pm bus_master 
cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 
autonegotiation
       configuration: autonegotiation=on 
broadcast=yes driver=8139too driverversion=0.9.28 duplex=full latency=32
 link=yes maxlatency=64 mingnt=32 multicast=yes port=MII speed=100MB/s
       resources: irq:19 ioport:d800(size=256) memory:d6800000-d68000ff
  *-network:1
       description: Ethernet interface
       product: VT6105/VT6106S [Rhine-III]
       vendor: VIA Technologies, Inc.
       physical id: d
       bus info: pci@0000:00:0d.0
       logical name: eth0
       version: 85
       serial: 00:03:6d:30:5c:f3
       size: 100MB/s
       capacity: 100MB/s
       width: 32 bits
       clock: 33MHz
       capabilities: pm bus_master 
cap_list rom ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 
autonegotiation
       configuration: autonegotiation=on 
broadcast=yes driver=via-rhine driverversion=1.4.3 duplex=full 
ip=192.168.2.231 latency=32 link=yes maxlatency=8 mingnt=3 multicast=yes
 port=MII speed=100MB/s
       resources: irq:16 
ioport:d400(size=256) memory:d6000000-d60000ff 
memory:40000000-4000ffff(prefetchable)
  *-network:2 DISABLED
       description: Ethernet interface
       product: RTL8139 Ethernet
       vendor: D-Link System Inc
       physical id: e
       bus info: pci@0000:00:0e.0
       logical name: eth2
       version: 10
       serial: 00:50:ba:b2:21:44
       size: 100MB/s
       capacity: 100MB/s
       width: 32 bits
       clock: 33MHz
       capabilities: pm bus_master 
cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 
autonegotiation
       configuration: autonegotiation=on 
broadcast=yes driver=8139too driverversion=0.9.28 duplex=full latency=32
 link=yes maxlatency=64 mingnt=32 multicast=yes port=MII speed=100MB/s
       resources: irq:17 ioport:d000(size=256) memory:d5800000-d58000ff
  *-network:3 DISABLED
       description: Ethernet interface
       product: RTL-8139/8139C/8139C+
       vendor: Realtek Semiconductor Co., Ltd.
       physical id: f
       bus info: pci@0000:00:0f.0
       logical name: eth3
       version: 10
       serial: 00:40:f4:17:2b:b3
       size: 100MB/s
       capacity: 100MB/s
       width: 32 bits
       clock: 33MHz
       capabilities: pm bus_master 
cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 
autonegotiation
       configuration: autonegotiation=on 
broadcast=yes driver=8139too driverversion=0.9.28 duplex=full latency=32
 link=yes maxlatency=64 mingnt=32 multicast=yes port=MII speed=100MB/s
       resources: irq:18 ioport:b800(size=256) memory:d5000000-d50000ff

se come nel mio caso appaiono delle interfacce disabilitate, provvederemo ad abilitarle:

Possibili problemi con l’indirizzo di rete

Per qualche oscuro motivo nel mio caso il server continuava a riprendere l’indirizzo dinamico, ignorando l’impostazione statica per l’interfaccia eth0. Questo perchè si ostinava ad attivare il client dhcp nonostante la configurazione modificata nel file interfaces. Per risolvere il problema basta disinstallare il client dhcp con:

Installazione VirtualBox

Se state utilizzando una versione recente di Ubuntu, potete saltare direttamente all’installazione di VirtualBox senza configurare i repository.

Per installare VirtualBox utilizzeremo il repository ufficiale, aggiungendolo nell’elenco delle sorgenti per il sistema: /etc/apt/sources.list, quindi:

ed aggiungiamo al fondo dell’elenco:

aggiungiamo la chiave pubblica di Sun

e aggiorniamo apt

Ora possiamo finalmente installare VirtualBox, comprendendo gli header del kernel e quanto necessario alla compilazione automatica dei driver di VirtualBox ad ogni aggiornamento del kernel.

vedremo qualcosa del tipo:

L’utente utilizzato per far girare VirtualBox (in questo esempio admin) dovrà appartenere al gruppo, provvediamo quindi ad inserirlo:

Ora VirtualBox è installato ed è possibile utilizzarlo.

Creazione della macchina virtuale

Per creare la macchina virtuale utilizzeremo i comandi di linea VBoxManage. Potete accedere al manuale in linea: http://www.virtualbox.org/manual/UserManual.html#vboxmanage per una descrizione approfondita dei parametri utilizzabili.

Si può comunque ottenere una veloce panoramica con:

Ora creiamo la nostra macchina. Nel mio caso le ho assegnato 256MB di RAM ed un disco da 5GB più un lettore CD/DVD a cui assegnare l’immagine ISO di Zeroshell. Le schede di rete saranno impostate in modalità bridge, associando le tre schede rimaste libere alle tre schede virtuali che utilizzeremo da Zeroshell.

Prima di agganciare il CD/DVD alla macchina virtuale, provvediamo a scaricare l’immagine ISO di Zeroshell da cui verrà effettuato il boot; la salveremo in una cartella apposita, creata a fianco di quelle già create da VBoxManage. Inoltre useremo l’accorgimento di rinominare l’immagine in Zeroshell.iso, così potremo sostituirla con versioni aggiornate quando saranno rese disponibili.

ora terminiamo la configurazione dei dispositivi IDE aggiungedo il CD/DVD

Avvio del server Zeroshell

Siamo ora pronti ad avviare la nostra macchina virtuale con il comando:

Ora possiamo utilizzare un Client per terminal server per accedere alla macchina virtuale; avviamolo e ci apparirà la videata che chiede i parametri per la connessione:

Client Terminal Server: Videata parametri

dopo aver inserito l’indirizzo e cliccato sul pulsante Connetti ci apparirà la videata della macchina virtuale che sta effettuando il bootstrap:

Macchina Virtuale Zeroshell: boot

per velocizzare l’avvio possiamo inserire 1 e premere invio, quindi attendiamo il termine del bootstrap, al termine del quale ci apparirà la videata della console di gestione di Zeroshell

Console di gestione Zeroshell

Selezioniamo I per entrare nella sezione IP Manager, quindi A per aggiungere un indirizzo IP (Add IP address) ed immettiamo i dati richiesti:

  • Interface: eth02

  • IP: 192.168.2.1

  • Netmask: 255.255.255.0

Console Zeroshell: configurazione IP

vedremo quindi che nell’elenco risulta assegnato l’indirizzo anche per la scheda ETH02

Console Zeroshell: elenco schede di rete

abbiamo così abilitato la scheda di rete che utilizzeremo per la condivisione della connessione.

Come potete notare, è nella stessa sottorete che abbiamo utilizzato per l’host. La scheda di rete corrispondente a eth2 di Zerohost va quindi connessa allo switch dove è già connessa la scheda eth0 dell’host e dove presumibilmente è collegato il PC che stiamo utilizzando per lavorare.

Configurazione di Zeroshell

Siamo ora in grado di accedere all’interfaccia web di Zeroshell per proseguire con la configurazione. Apriamo il nostro browser preferito ed accediamo ad: https://192.168.2.1.

Zeroshell login

Per il primo accesso utilizzeremo la password di default “zeroshell“; verremo portati sulla pagina iniziale.

Zeroshell: pagina setup

creiamo un nuovo profilo dove inseriremo le informazioni:

  • Description: un nome descrittivo per il profilo

  • Hostname (FQDN): il di rete nome completo per il firewall

  • Kerberos 5 Realm: il dominio kerberos

  • LDAP Base: i riferimenti per il dominio LDAP

In particolare prestiamo attenzione ad indicare correttamente interfaccia ed indirizzo di rete:

NETWORK CONFIG
  • Ethernet Interface: selezioniamo l’interfaccia di rete verso la LAN (in questo esempio ETH02)

  • IP Address: l’indirizzo assegnato alla scheda di rete per la LAN (in questo esempio 192.168.2.1) e Netmask: 255.255.255.0 (a meno che utilizziate sottoreti personalizzate)

  • Default Gateway lo lasciamo vuoto.

Zeroshell: creazione profilo

e lo attiviamo.

Zeroshell: attivazione profilo

Zeroshell effettuerà un reboot e sarà di nuovo accessibile dall’interfaccia Web. Ricordate che ora andrà utilizzata la password definita nella creazione del profilo.

Accediamo al setup della rete (Network) per configurare le schede di rete.

Zeroshell: network setup
Zeroshell: network setup

andiamo ad aggiungere gli indirizzi di rete. Inseriremo gli indirizzi

  • 192.168.0.2 per eth00 (prima linea esterna)

  • 192.168.1.2 per eth01 (seconda linea esterna)

in entrambi i casi inseriremo 255.255.255.0 come Netmask

Zeroshell: configurazine indirizzo ip

e finalmente avremo tutte le schede configurate:

Zeroshell: network setup completato

Ora accediamo alla sezione Router

Zeroshell: sezione router

ed apriamo la configurazione NAT (Network Address Translation, il meccanismo che permette ai dispositivi sulla LAN di comunicara con l’esterno), dove inseriamo le interfacce ETH00 e ETH01 (le interfacce verso le linee esterne) fra quelle abilitate al NAT.

Zeroshell: NAT setup

andiamo nella sezione DNS e selezioniamo Forwarders dove aggiungeremo i DNS per la zona ANY. Nell’esempio ho utilizzato gli indirizzi OpenDNS e nessuna particolare configurazione personalizzata in quanto non necessaria per le mie esigenze

Zeroshell:DNS setup

Accediamo alla sezione Net Balancer per configurare la doppia linea ADSL:

Zeroshell: sezione Net Balamcer

aggiungiamo un Gateway per la prima linea ADSL e ripetiamo poi l’operazione per la seconda. Per ciascuno dei due dovremo inserire una breve descrizione, l’indirizzo IP (192.168.0.1 per il primo e 192.168.1.1 per il secondo) e l’interfaccia utilizzata (ETH01 per il primo ed ETH02 per il secondo).

Zeroshell: Net Balancer Gateway

ora abbiamo le due linee configurate:

Zeroshell: Net Balancer configurato

cliccate sul checkbox Status e poi su Save per abilitare il bilanciamento.

Zeroshell: Net Balancer abilitato

ora abilitiamo il Failover Monitor ed inseriamo un paio di indirizzi IP nella sezione Failover IP Addresses, ricordando di abilitarli e cliccare sul pulsante Save per salvare le impostazioni. Nell’esempio ho utilizzato gli indirizzi di mail.libero.it e www.libero.it.

Zeroshell: Failover Monitor

Ora abbiamo la connessione internet funzionante.

Server DHCP

Per semplificare la gestione della rete possiamo abilitare il server DHCP che provvederà ad assegnare automaticamente i parametri di rete ai PC che vengano connessi.

Andiamo nella sezione DHCP e clicchiamo sul pulsante New. Nella finestra di definizione selezioniamo la sottorete 192.168.2.0/255.255.255.0 (ETH02); immettiamo i valori 192.168.2.0 per Network e 255.255.255.0 per Netmask.

Zeroshell: DHCP

Attivazione al boot

Al riavvio del server host, la macchina virtuale per Zeroshell non verrà avviata automaticamente, dando quindi un disservizio non indifferente. Per ovviare a questo problema aggiungiamo i comandi necessari che provvederanno ad attivare le interfacce di rete secondarie e ad avviare la macchina virtuale.

I comandi vanno inseriti nel file /etc/rc.local, che serve proprio ad eseguire dei comandi personalizzati all’avvio del sistema. Apriamo quindi il file /etc/rc.local

ed inseriamo i comandi necessari prima dell’ultima istruzione exit 0:

#
# attivazione interfacce di rete secondarie
#
ifconfig eth1 up
ifconfig eth2 up
ifconfig eth3 up
#
# attivazione macchina virtuale per server Zeroshell
#
VBoxHeadless -startvm Zeroshell -v on &

Il risultato finale (supponendo che non ci siano altri comandi personalizzati) dovrà quindi essere qualcosa tipo:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#
# attivazione interfacce di rete secondarie
#
ifconfig eth1 up
ifconfig eth2 up
ifconfig eth3 up
#
# attivazione macchina virtuale per server Zeroshell
#
VBoxHeadless -startvm Zeroshell -v on &
exit 0

Ora potete finalmente provare a riavviare il PC per verificare che tutto funzioni. Nel caso della macchina utilizzata dall’autore, l’accesso SSH al sistema host risulta disponibile entro un minuto circa e Zeroshell impiega ancora un paio di minuti prima di rendere disponibile l’accesso alla rete.

Considerazioni varie

Riutilizzo dell’hardware

L’efficienza dei sistemi GNU/Linux utilizzati permette il riutilizzo di hardware che risulta ormai obsoleto per le richieste hardware dei sistemi desktop, in particolare se montano Windows.

La macchina host è stata completamente assemblata con hardware di recupero: scheda madre Asus K7V333, CPU AMD Athlon XP 2000+, RAM 1 GB PC2700 (DDR 333), disco IDE da 40GB e quattro schede di rete Ethernet 10/100Mbit. Nonostante sia hardware datato, risulta più che sufficiente per i compiti richiesti.

Il costo per l’hardware è stato nullo ed il tutto ha richiesto circa tre ore per la selezione dei componenti e l’assemblaggio più circa sei ore per l’installazione del tutto, contando anche il tempo impiegato per reperire e studiare parte della documentazione utilizzata.

Altri servizi

Come già accennato, il sistema host fornisce anche un servizio di FAX Server tramite HylaFAX e risulta esso stesso un client che sfrutta la connessione internet messa a disposizione tramite Zeroshell. In effetti, nulla impedisce di installare ulteriori servizi sull’host, ad esempio Samba per funzionare anche da File e Print server; od utilizzare un applicativo di groupware.

Ovviamente questo non è uno scenario tipicamente professionale o da grande azienda – dove i vari servizi potrebbero essere installati su server dedicati – ma in ambito domestico o per una piccola azienda può rappresentare una valida soluzione senza imporre spese esorbitanti.

sudo

Avrete notato che a differenza di tanti howto, qui non utilizzo sempre sudo in testa ai comandi. Come già accennato, sono abituato ad utilizzare sudo -s per abilitare i privilegi di root per la sessione, cosa equivalente a su – in altre distribuzioni, col vantaggio di non dover assegnare (e ricordare) una password per l’utente root.

Link utili

Per approfondire gli argomenti trattati in questo documento, potete consultare le fonti che per me sono state molto utili:

  • Zeroshell ovviamente non può mancare il sito ufficiale di Zeroshell dove potete trovare ulteriori informazioni, documentazione e scaricare le immagini per l’installazione.

  • Il sito ufficiale Ubuntu italiano, dove potete trovare informazioni e scaricare le immagini ISO per l’installazione.

  • Howtoforge è un prezioso archivio di documentazione varia dove potete trovare istruzioni passo-passo per preparare macchine Desktop e Server per i più disparati usi. In particolare è risultato utile per le istruzioni necessarie all’installazione di VirtualBox in modalita Headless che ho rielaborato per questo documento.

  • VirtualBox dove trovare informazioni per l’installazione e la configurazione del software per la macchina virtuale oltre a tanti altri HowTo molto utili.