Pagine

mercoledì 12 settembre 2012

Virtualbox con rete dedicata virtuale

Da quando VMware ha inventato la virtualizzazione c'è la possibilità di fare delle cose veramente spettacolari con computer poco costosi o che comunque richiedono pochissimi miglioramenti. Acquistando dei moduli di RAM in più e avendo un controller disco sufficientemente performante, si può caricare su una macchina fisica una pletora di macchine virtuali che possono arrivare a soddisfare le esigenze anche di una piccola azienda.

La cosa più bella è la possibilità di creare delle immagini di macchine virtuali da poter clonare per avere un ambiente perfettamente installato in un paio di minuti. Ti serve una macchina che faccia da web server, una che faccia da database server, una da mail server ecc...? Nessun problema! Clicca, clona, istanzia, configura e siamo a posto!

Ok, ok... la pianto con l'introduzione!

Il fatto è il seguente: come fare a costruire un'infrastruttura che sia scalabile e facilmente configurabile con computer di recupero in casa propria senza spendere un patrimonio? Ho fatto delle prove e alla fin fine sono riuscito a configurare un ambiente con le seguenti caratteristiche:

  • Ambiente di virtualizzazione: Virtualbox
  • Sistema operativo ospite: XUbuntu 12.04 32 bit
  • Hardware: 1GB di RAM, Intel(R) Pentium(R) D CPU 2.80GHz (AKA: ciofeca), disco SATA da 500GB
  • Indirizzo IP locale dell macchina: 192.168.1.4/24
  • Tutte le macchine virtuali risiedono all'interno di una sottorete virtuale accessibile da tutta la rete locale. Ciò vuol dire che configurando opportunamente i servizi sarebbe possibile accedere alle macchine virtuali come fossero delle macchine fisiche con SSH, telnet, tramite browser web etc...

Ho scelto Virtualbox perché è un prodotto Open Source studiato per client che però può essere facilmente adattato a funzionare anche in modalità headless (ovvero: nessuna interfaccia di gestione obbligatoria, si fa partire la macchina virtuale e questa continua a vivere in background senza necessità di intervento diretto). Da quanto mi risulta per avere VMWare in modalità headless è necessario avere VMware Server che, giustamente vista la qualità del prodotto, è a pagamento.

La macchina host non è esattamente il meglio per far girare macchine virtuali (in particolare per la dotazione RAM decisamente ridicola) però è la mia macchina di scarto che uso per fare i test ed è perfettamente in grado di reggere 2 macchine virtuali attivate in contemporanea.

Cosa serve

Ci sono un paio di cose che è necessario avere prima di poter iniziare a giochicchiare con Virtualbox tra cui tanto per cominciare... Virtualbox!
Io lavoro principalmente in ambiente (XK)Ubuntu quindi non so per altre distribuzioni quali siano i comandi per l'installazione da linea di comando comunque, per quanto riguarda Ubuntu, vi serviranno i seguenti pacchetti:

$ sudo apt-get install virtualbox virtualbox-dkms virtualbox-guest-additions virtualbox-guest-additions-iso

Un'altra cosa che ho scoperto dopo smadonnamenti vari e diversi riti pagani tra cui l'accensione di un cero al Signore e Padrone Indiscusso dell'Informatica nonché Divinità Unica ed Eccelsa dei Computer (AKA: Mr. Murphy), è la necessità di abilitare il routing dei pacchetti nella macchina host (per una ragione che sarà chiara in seguito)... già perché dare a disposizione una macchina con una tabella di routing e poi DISABILITARE di default il routing mi pare molto sensata come scelta... ma tant'è...

Comunque bisogna andare a modificare il file /etc/sysctl.conf in maniera che ci sia la seguente opzione:

net.ipv4.ip_forward=1 #di default è 0

Se invece volete solo attivarle per la sessione corrente (fino allo spegnimento della macchina) è sufficiente eseguire il comando
sudo sysctl net.ipv4.ip_forward=1

Come ultima cosa c'è da dire che sarebbe meglio avere già installata una macchina virtuale di qualche distribuzione GNU/Linux per fare quello che mi accingo a spiegare. Se ne avete una bene! Se non ne avete una dovreste sapere come fare... Se non ne avete una e non sapete come fare: scusate ma perché state leggendo?!
Ok... credo che siamo pronti per la configurazione.

Creazione di una sottorete virtuale per le macchine virtuali

Ipotizziamo che la vostra rete di casa sia 192.168.1.0/24 con gateway per internet a 192.168.1.1. Quello che vogliamo fare è creare una sottorete della stessa dimensione di quella fisica attuale (ipotizziamo che non abbiate giocato a fare i sysadmin e che quindi la rete da creare sia la 192.168.2.0/24) in cui si trovino tutte le macchine virtuali, che sono fatte partire da Virtualbox, che sia anche abilitata all'accesso ad internet. Dirò di più! vogliamo anche che tutti i computer della rete fisica (192.168.1.0/24) possano raggiungere la rete virtuale (192.168.2.0/24) e viceversa. Suona bello no?

Il problema è che non è così semplice come sembra: le possibilità offerte da Virtualbox sono limitate: accedendo alle impostazioni di networking di una macchina virtuale preesistente dal client del programma (tasto destro sulla macchina virtuale -> Preferences -> Network) ci sono le seguenti opzioni
  • NAT: Configurazione semplice ma efficace. La macchina virtuale utilizza direttamente la scheda di rete della macchina ospite che si occupa di fare NAT delle porte verso l'esterno. Ovviamente non va bene perché noi vogliamo che la nostra macchina virtuale abbia un indirizzo ip suo e personale.
  • Bridged: Simile alla modalità superiore solo che la macchina virtuale possiede una scheda di rete virtuale (con un suo indirizzo IP) che si appoggio sulla scheda di rete fisica. Anche in questo caso non ci va bene perché la macchina fisica non ha conoscenza della macchina virtuale.
  • Internal network: Simile a quella sopra solo che consente di impostare maggiori controlli di sicurezza. Scartata.
  • Host-only: Di base determina la creazione di un interfaccia di rete virtuale nella macchina host che è utilizzata come router dalle macchine virtuali. Sembra bellissimo come sistema ma ha una pecca: host-only vuol dire host-only (e che ti aspettavi!) ovvero per le macchine virtuali esiste solo la macchina host.

Nemmeno a dirlo quello che vogliamo fare è risolvere la pecca della modalità host-only ovvero fare della scheda di rete virtuale creata da Virtualbox un router anche verso l'esterno.
  1. Creazione interfaccia virtuale. Prima di tutto bisogna creare questa benedetta interfaccia virtuale in maniera da poterci giocare in seguito. Per farlo è necessario andare in "File->Preferences" dal menù di Virtualbox per aprire la seguente finestra.
    Premendo sul pulsante (1) si può creare una nuova interfaccia virtuale contrassegnata dal nuovo elemento nella lista "vboxnet0" (2). Premendo sul tasto (3) sia accede alla finestra di modifica delle impostazioni della scheda di rete virtuale:

    Per impostare correttamente la scheda di rete si deve inserire al campo "IPv4 Address:" l'indirizzo IP della scheda di rete e al campo "IPv4 Network Mask:" la maschera di sottorete. Dato che vogliamo che tale interfaccia sia il router per la rete virtuale (per uniformità con la rete fisica) attribuiamole l'indirizzo 192.168.2.1/24 e quindi il primo campo deve avere valore "192.168.2.1" e il secondo campo "255.255.255.0".

    Se lo desiderate potete anche impostare il server DHCP per l'interfaccia. A voi la scelta.
  2. Modifica interfacce delle macchine virtuali. A questo punto è necessario fare si tutte le macchine virtuali che volete fare far parte delle rete virtuale utilizzino tale interfaccia. Quello che bisogna fare è quindi accedere alle preferenze delle macchine virtuali e modificare le impostazioni come mostrato in figura.

    A questo punto potete verificare che la configurazione sia andata a buon fine avviando le macchine virtuali ed eseguendo sulla macchina host il comando ifconfig. L'interfaccia virtuale infatti viene avviata solo quando è necessaria, quindi se l'avete appena creata o avete appena acceso il computer non comparirà tra le interfacce di sistema. Comunque dopo aver accesso e spento una delle macchine virtuali che la usano dovreste riceve in risposta dal comando qualcosa del genere
    vboxnet0  Link encap:Ethernet  HWaddr 0a:00:27:00:00:00  
              indirizzo inet:192.168.2.1  Bcast:192.168.2.255  Maschera:255.255.255.0
              indirizzo inet6: ***::***:****:****:0/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
              collisioni:0 txqueuelen:1000 
              Byte RX:0 (0.0 B)  Byte TX:8100 (8.1 KB)
    
  3. Accesso alla sottorete virtuale dalla rete fisica (1). Quello che bisogna fare adesso è fare si che tutti i pacchetti indirizzati alla rete 192.168.2.0/24 vengano instradati nell'interfaccia virtuale. Tutto ciò che bisogna fare è eseguire nella macchina host il comando
    $ route add -net 192.168.2.0/24 vboxnet0
    

    Per verificare che il comando sia andato a buon fine controllate la tabella di routing con route -n che vi dovrebbe restituire qualcosa del genere:
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
    169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
    192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
    192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 vboxnet0
    

    Inoltre potete verificare la responsività dell'interfaccia pingando il suo indirizzo IP con
    $ ping 192.168.2.1
    
  4. Accesso alla sottorete virtuale dalla rete fisica (2). Avendo avuto l'accortezza di abilitare l'opzione net.ipv4.ip_forward all'introduzione adesso il vostro computer host è diventato un router e con il passo precedente avete fatto in modo che tutti i pacchetti che riceve, indirizzati agli indirizzi della rete 192.168.2.0/24, passino per l'interfaccia vboxnet0. Quello che manca è indirizzare da tutti gli altri computer della rete alla macchina host quando vogliono parlare con la rete virtuale.

    Per fare questa operazione è necessario configurare il vostro router in maniera da reindirizzare i pacchetti al destinatario corretto (ovvero la macchina host che ha ip 192.168.1.4/24).

    Nel mio caso, dato che ho un Linksys WAG120N come router di casa (router che vi consiglio vivamente se dovete cambiare il vostro spettacolare modem Alice o peggio...) si tratta di andare nella sezione "Configurazione->Routing Avanzato" ed aggiungere le informazioni come in figura:

    Eseguita questa modifica a questo punto tutte le macchine virtuali (attive ovviamente) dovrebbero essere raggiungibili da qualunque macchina della vostra rete fisica (e anche da internet se siete stati tanto smaliziati da nattare le macchine virtuali nel router).
  5. Accesso dalla sottorete virtuale al resto del mondo. L'ultimo passo da eseguire per completare la configurazione è fare si che le macchine virtuali possano accedere al resto della rete locale ed internet. Per farlo è necessario avviare le macchine virtuali ed eseguire il seguente comando:

    $ sudo route add default gw 192.168.2.1
    

    Lo scopo di questo comando è quello di fare si che l'interfaccia virtuale vboxnet0 diventi il gateway della macchina virtuale e che quindi la tabella di routing della macchina virtuale sia modificata così:
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 eth0
    
    In questo modo tutti i pacchetti che non sono locali (non localhost) vengono indirizzati a vboxnet0, quindi alla macchina ospite, che, essendo configurata come router, procederà ad indirizzare i pacchetti alla giusta posizione. Per esempio, se si dovesse contattare la macchina 192.168.1.6 dalla macchina virtuale, il pacchetto sarebbe indirizzato prima a vboxnet0, a quel punto non essendo l'interfaccia direttamente collegata alla macchina ospite il pacchetto verrebbe indirizzato vero 192.168.1.1 (gateway di default) che a quel punto lo indirizzerà verso il calcolatore corretto. Lo stesso ragionamento si può fare per tutti i pacchetti verso internet.

    A questo punto tutte le macchine delle reti fisiche e virtuali possono parlare con tutte le altre macchine delle rete fisiche e virtuali (incluse quelle accessibili da internet).

La prossima guida servirà ad avviare le macchine virtuali in modalità headless ovvero senza necessità che ci sia l'interfaccia utente Virtualbox attiva, e che tali macchine siano avviabili da un'interfaccia web accessibile da qualunque macchina della rete locale.

Nessun commento:

Posta un commento