Una rete host-guest con VirtualBox su Ubuntu Hardy

Aggiornamento: recentemente è stata rilasciata la versione 2.1.0 di VirtualBox in cui è stato ripensato completamente il networking di tipo Host Interface (HIF). Questo articolo è stato modificato per essere conforme alla nuova architettura.

Mi è capitato di aiutare su un forum una persona che aveva la necessità di configurare, con VirtualBox, una rete (virtuale) tra macchina ospitante Ubuntu Linux e macchina ospitata Windows XP. Ho approfondito la questione e il risultato è la guida che vedete. È stata realizzata usando VirtualBox 2.1.0 su Ubuntu 8.10 (Intrepid Ibex), ma è facilmente adattabile ad altre versioni di VirtualBox ed Ubuntu, e anche a Debian, da cui Ubuntu deriva.

Introduzione

Prima di tutto una necessaria introduzione al modo in cui VirtualBox gestisce la rete. Di seguito, la macchina ospitante sarà anche indicata come host o macchina fisica, mentre quella ospitata sarà indicata anche come guest o macchina virtuale.

VirtualBox prevede tre tipi di networking per le sue macchine virtuali:

  • NAT
  • Internal
  • Host Interface (HIF)

Nel NAT (Network Address Translation) l’host effettua la traslazione degli indirizzi per le connessioni di rete del guest. È ideale quando serve che il guest possa raggiungere internet come client (navigazione web, scaricamento di posta etc.), ma non consente di connettersi dall’esterno alla macchina virtuale, nemmeno dall’host. Inoltre, se l’host non è collegato a nessuna rete fisica (ethernet, wifi o adsl), il guest non può raggiungere l’host neanche come client.

L’Internal networking serve per creare una rete virtuale tra i vari guest che girano sullo stesso host. In questo caso i guest sono completamente isolati dal mondo esterno, sia come client che come server, ma possono dialogare solo tra di loro.

L’Host Interface Networking è l’unica configurazione che consente ad un guest di dialogare bidirezionalmente (sia come client che come server) con il proprio host e con il mondo esterno. Con la nuova versione 2.1.0 di VirtualBox, qualora l’host disponga di una interfaccia fisica (ethernet o, con qualche limitazione, wifi) non è più necessario modificare la configurazione di rete dell’host. Continua, invece, ad essere necessario nel caso in cui l’host non dispone di alcuna interfaccia fisica.

HIF più in profondità

Concettualmente la faccenda è molto semplice: VirtualBox installa un proprio driver di periferica, chiamato “net filter”, che filtra il traffico sull’interfaccia di rete dell’host. Questo consente a VirtualBox di intercettare il traffico destinato alla macchina virtuale e di inoltrarlo a quest’ultima. In tal modo, la macchina virtuale risulta affacciata direttamente sulla rete LAN della macchina host, con un proprio indirizzo IP appartenente alla stessa classe della LAN reale. Per il resto della rete è come se il guest fosse una macchina fisica connessa direttamente alla LAN fisica. Se nella LAN c’è un server DHCP anche la macchina virtuale può usufruirne.

In sostanza il funzionamento è analogo al vecchio bridging delle precedenti versioni di VirtualBox senza, però, le complicazioni di configurazione che c’erano in precedenza.

Ma questo scenario idilliaco è possibile solamente se la macchina host dispone di un’interfaccia ethernet (o wifi). Se non è così, per dialogare con la macchina virtuale, occorre creare un’interfaccia di rete virtuale.

Vediamo come procedere se

  1. l’host non dispone di schede di rete ethernet o wifi; e
  2. è necessaria una comunicazione bidirezionale tra host e guest.

Creare un’interfaccia di rete virtuale

Come prima cosa occorre creare sull’host un’interfaccia di rete virtuale che possa essere utilizzata per comunicare con la macchina virtuale. Userò gpz500 come nome utente non privilegiato: ovviamente ognuno deve sostituirlo con il proprio. Apri un terminale e… vai!

  1. Il primo passo consiste nell’installare una serie di utility per la gestione delle interfacce di rete virtuali:
    $ sudo apt-get install uml-utilities

    (Il pacchetto uml-utilities fa parte della componente universe del repository che, quindi, deve essere preventivamente abilitata).

  2. Adesso occorre aggiungere il proprio utente al gruppo uml-net:
    $ sudo adduser gpz500 uml-net

    Per rendere effettiva questa modifica è bene chiudere la sessione e riloggarsi di nuovo.

  3. Ora si deve configurare l’interfaccia di rete virtuale. Da superutente aprire il file /etc/network/interfaces:
    $ sudo gedit /etc/network/interfaces

    ed aggiungere al file le linee seguenti:

    auto vbox0
    iface vbox0 inet manual
            up ifconfig $IFACE 10.0.0.1 netmask 255.255.0.0 up
            down ifconfig $IFACE down
            tunctl_user gpz500

    Nello schema proposto si associa l’interfaccia vbox0 alla sottorete di classe A 10.0.x.x.
    VirtualBox consente di associare un’interfaccia virtuale ad una sola macchina virtuale per volta. Nel caso in cui sia necessario dialogare con più macchine virtuali in contemporanea, si potranno definire l’interfaccia vbox1 con indirizzo 10.1.0.1 per la seconda macchina virtuale, quella vbox2 con indirizzo 10.2.0.1 per la terza macchina virtuale e via discorrendo.
    L’ultima riga assegna l’interfaccia all’utente gpz500, che deve essere lo stesso che è stato precedentemente aggiunto al gruppo uml-net e che, poi, eseguirà VirtualBox.
    Salva e esci.

  4. È il momento di rendere effettive le modifiche con il comando
    $ sudo /etc/init.d/networking restart

    A questo punto il comando ifconfig senza parametri dovrebbe mostrare anche l’interfaccia vbox0 con il proprio indirizzo 10.0.0.1.

Configurazione della virtual machine

Quello che rimane da fare è configurare opportunamente la propria virtual machine in modo che possa dialogare con l’host. Le operazioni da fare sono:

  1. Aprire le impostazioni della propria macchina virtuale, selezionare la sezione “Rete”, scegliere una delle Shede disponibili e impostare i campi “Collegato a” e “Interfacce Host” come segue:
    impostazioni
  2. Avviare la macchina virtuale e configurare l’interfaccia di rete dall’interno del sistema operativo della macchina virtuale. L’interfaccia va configurata in modalità manuale con i seguenti parametri:
    • Indirizzo IP: 10.0.0.2
    • Netmask: 255.255.0.0

    Per configurare l’interfaccia di rete della macchina virtuale occorre fare riferimento alla documentazione del sistema operativo ospitato.
    Unica accortezza: la macchina virtuale deve appartenere alla stessa sottorete dell’interfaccia di rete virtuale dell’host, quindi, se ad esempio sull’host l’indirizzo scelto è 10.1.0.1, quello della macchina virtuale dovrà essere 10.1.0.2.

Fatto! Adesso tutto dovrebbe essere funzionante. Nella LAN virtuale tra host e guest, l’host ha indirizzo 10.0.0.1, e il guest 10.0.0.2, ed è utilizzando questi indirizzi che le due macchine, reale e virtuale, si possono raggiungere a vicenda.

Un’ultima osservazione per chi ha impostato il firewall: assicurarsi che le sue regole non ostacolino la comunicazione tra i due!

Advertisements

16 Pensieri su &Idquo;Una rete host-guest con VirtualBox su Ubuntu Hardy

  1. Ciao!
    Finalmente ho intercettato una guida fatta come si deve per configurare la rete su di un guest virtuale che comunica con l’esterno.
    Solo una curiosità, hai provato anche senza l’utilizzo di uml-utilities che su alcuni sistemi (vedi Fedora) non sono più supportate? In effetti dovrebbe essere per questo motivo che Virtualbox ora comprede gli stessi strumenti.
    Tu che ne mastichi assai, se riesci senza le uml-utilities potresti dirci come si fa? Magari aggiornando questa chiarissima guida?
    Un saluto
    Roberto

  2. Innanzi tutto, grazie per l’apprezzamento! Ma veniamo alla tua richiesta.
    In effetti, come riportato anche nel manuale utente di VirtualBox, le uniche distribuzioni che includono gli strumenti per creare interfacce host sono Debian e derivate. Per tutte le altre è necessario usare gli strumenti forniti da VirtualBox stesso.

    Fortunatamente, le differenze rispetto a quanto già detto non sono molte. Continuando a tralasciare la configurazione bridge, che è ampiamente coperta dal manuale utente di VirtualBox e che rimane consiglata nel caso in cui la macchina host disponga di un’interfaccia ethernet (o assimilata, come la wifi) collegata ad una LAN, i cambiamenti da mettere in atto sono i seguenti:

    1. appartenenza al gruppo vboxusers: l’utente che utilizzerà VirtualBox e che sarà il proprietario dell’interfaccia virtuale dovrà appartenere allo stesso gruppo del file /dev/net/tun (verosimilmente sarà vboxusers);

    2. l’interfaccia virtuale va creata, un’unica volta, eseguendo da superutente il comando ‘VBoxAddIF vbox0 <utente>’. Per cancellare un’interfaccia creata in precedenza il comando è ‘VBoxDeleteIF vbox0’;

    3. l’interfaccia va configurata seguendo quanto prescritto dalla documentazione della propria distribuzione.
    Ad esempio, su Fedora 9 si deve creare un file /etc/sysconfig/network-scripts/ifcfg-vbox0 come il seguente:

    DEVICE=vbox0
    TYPE=Ethernet
    IPADDR=10.0.0.1
    NETMASK=255.255.0.0
    NETWORK=10.0.0.0
    BROADCAST=10.0.255.255
    ONBOOT=yes
    NM_CONTROLLED=no
    NAME=vbox0

    Occorre, inoltre, abilitare il servizio ‘network’ (nella configurazione di default è abilitato solo NetworkManager): la via più facile è usare il programma grafico ‘system-config-services’.
    Infine, per rendere effettive le modifiche va riavviato il sistema, oppure si può dare da superutente il comando ‘/sbin/service network restart’.

  3. Ciao,
    grazie della guida, purtroppo pero’ nonostante abbia fatto tutti i passi e nonostante ifconfig mi da il risultato che dici tu
    quando vado a far partire virtualbox mi restituisce questo messaggio. Premesso che ho provato con tutte e tre le reti che da’ come scelta.

    L’errore che becco e’ questo:

    Failed to initialize Host Interface Networking.
    VBox status code: -3100 (VERR_HOSTIF_INIT_FAILED).

    Codice&nbspd’uscita:
    0x80004005
    Componente:
    Console
    Interfaccia:
    IConsole {1dea5c4b-0753-4193-b909-22330f64ec45}

  4. Ciao Pier Paolo,
    purtroppo non riesco a riprodurre il tuo problema… l’unica cosa che mi viene in mente è che sia una questione di permessi nell’accedere al file /dev/net/tun.
    Fai questa prova: cosa succede se cambi i permessi a questo file con il comando che segue?
    $ sudo chmod 0666 /dev/net/tun
    A quale gruppo appartiene questo file quando l’interfaccia vbox0 è attiva (ossia quando compare nell’output di ifconfig)? L’utente che lancia VirtualBox deve appartenere anche a quel gruppo (normalmente è uml-net). Attenzione perché le proprietà di questo file cambiano a seconda che ci siano interfaccie configurate oppure no.

  5. ciao,
    ho provato a cambiare i diritti, ma l’errore persiste. Il risultato di
    ls -l /dev/net/tun subito dopo il networking restart e’ questo:

    crw-rw—- 1 root uml-net 10, 200 2008-10-09 20:21 /dev/net/tun

    ho cambiato i diritti come dici tu ma niente. Ripetendo il comando networking restart i diritti
    vengono riazzerati.

    l’utente con cui eseguo virtualbox e’ pier che e’ l’utente principale, quello che ti permette con la propria password di lanciare i comandi sudo.

    se ti servono altre info fammi sapere ti mando tutto quello che vuoi. Sto impazzendo perche’ io sono uno sviluppatore di siti web e vorrei poter connettere da windows al mio webserver apache per testare ie. Anche altre soluzioni mi andrebbero bene.

    ti mando l’output del mio ifconfig

    eth0 Link encap:Ethernet HWaddr 00:1d:ba:1d:52:28
    UP BROADCAST MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
    Interrupt:16

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet6 addr: ::1/128 Scope:Host
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:11756 errors:0 dropped:0 overruns:0 frame:0
    TX packets:11756 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:8124248 (7.7 MB) TX bytes:8124248 (7.7 MB)

    tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
    inet addr:10.45.0.170 P-t-P:10.45.0.169 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
    RX packets:1004 errors:0 dropped:0 overruns:0 frame:0
    TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    RX bytes:289075 (282.2 KB) TX bytes:938 (938.0 B)

    vbox0 Link encap:Ethernet HWaddr 00:ff:86:6f:cd:7b
    inet addr:10.0.0.1 Bcast:10.0.255.255 Mask:255.255.0.0
    inet6 addr: fe80::2ff:86ff:fe6f:cd7b/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:25 overruns:0 carrier:0
    collisions:0 txqueuelen:500
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

    wlan0 Link encap:Ethernet HWaddr 00:16:ea:25:4f:f0
    inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
    inet6 addr: fe80::216:eaff:fe25:4ff0/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:132573 errors:0 dropped:0 overruns:0 frame:0
    TX packets:117393 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:41673964 (39.7 MB) TX bytes:18509734 (17.6 MB)

    wmaster0 Link encap:UNSPEC HWaddr 00-16-EA-25-4F-F0-00-00-00-00-00-00-00-00-00-00
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

  6. Ciao,
    io ho installato ubutun 8.04 su un portatile
    ho due schede la eth0 con il filo e la wireless wlan0. In genere uso solo la wireless
    poi ho installato virtualbox e su virtual box ho installato windows xp.
    io avevo attivato una scheda di rete in modalita’ NAT quindi con windows xp riesco ad andare su internet.
    Ora pero’ volevo connetermi alla mia macchina ubuntu dove ho tutti i miei sitarelli
    i sitarelli sono configurati con la direttiva virtual host di apache in modo
    che io faccio miosito.dev.it e mi si connette alla macchina locale
    ovviamente se io faccio
    miosito.dev.it da windows non va’ da nessuna parte
    perche’ lo cerca su internet.
    leggendo il tuo articolo pensavo di aver trovato la soluzione al mio problema
    ma nonostante funzioni tutto per il settaggio della scheda come hai detto tu, virtual box non parte
    perche’ mi da’ quell’errore

    grazie ancora
    Pier Paolo

  7. Se ti puo’ essere d’aiuto quando eseguo networking restart
    ottengo questo
    root@vaio:~# /etc/init.d/networking restart
    * Reconfiguring network interfaces…
    Set ‘vbox0’ nonpersistent
    Set ‘vbox0’ persistent and owned by uid 1000
    Set ‘vbox0′ persistent and owned by uid 0

    uid 1000 mi torna e’ l’utente pier

    poi /dev/net/tun
    ha come gruppo uml-net di cui fa parte anche l’utente pier

    percio’ non riesco a capire cosa non va.

    Pier Paolo

  8. Ciao Pier Paolo,
    per i tuoi scopi è sufficiente la modalità NAT.
    Dal guest puoi raggiungere l’host sull’indirizzo IP della scheda WiFi (192.168.1.5). Prova ad aprire Internet Explorer ed ad inserire la URL http://192.168.1.5/. Puoi anche aggiungere al file C:\WINDOWS\System32\drivers\etc\hosts la linea “192.168.1.5 miosito.dev.it” in modo da raggiungere l’host anche con la URL http://miosito.dev.it/.
    Nota: non ti affidare al comando ping per testare la configurazione, perché in modalità NAT non è supportato.

    Quanto alla modalità Host Interface, è molto strano che non funzioni: questa procedura è stata testata su più macchine differenti e da diverse persone e non ha mai dato problemi. Sicuramente ci sfugge qualcosa: prova a chiedere aiuto sul forum ufficiale di VirtualBox (http://forums.virtualbox.org/).
    D’altra parte, disponendo di interfaccie fisiche (wlan0 ed eth0) puoi anche realizzare la configurazione bridge, seguendo la sezione 6.8.1.1 del manuale utente di VirtualBox.

  9. Ciao,
    grazie dell’aiuto, ma a questo punto penso che ci sia qualche problema con la mia configurazione della macchina,
    ho letto tutto quello che si poteva leggere, nel vecchio pc mi funzionava tutto alla perfezione. La cosa e’ che neanche mettendo l’indirizzo fisico accedo alla mia macchina.
    192.168.1.5 non va da nessuna parte.

    reinstallero’ tutto

    Grazie ancora
    Pier Paolo

  10. ciao
    grazie della guida: è davvero ottima.

    Ho solo un problema: la connessione funziona perfettamente ma dall’host (ubuntu 8.10) non riesco ad accedere correttamente al guest (win xp) tramite la rete.

    Il guest non mi da problemi vede correttamente l’host sulla rete.

    Dall host posso accedere al guest solo con smb://10.0.0.2/ ma non tramite nautilus. come mai?

    Daniele

  11. Ciao Daniele,
    intendi dire che non vedi il guest nella finestra Rete di Nautilus (menù Vai->Rete)?
    In questo caso il motivo risiede nel modo in cui Nautilus effettua la scansione della rete locale alla ricerca dei server. Non sono molto ferrato sull’argomento, ma non escludo che Nautilus non effettui la scansione sulle interfacce virtuali, o che necessiti di qualche particolare configurazione (sua o di samba).
    Non ho la possibilità di installare Windows su una macchina virtuale al momento, ma vorrei avere qualche informazione in più: qual’è l’output dei comandi seguenti (ovviamente eseguiti sull’host)?
    $ smbclient -L //10.0.0.1
    $ smbclient -L //10.0.0.2

    • ciao a tutti,
      ho letto un po ovunque che il settaggio della connessione bridge avviene in modo semplicissimo … si seleziona dall’interfaccia scheda con Bridge .. ma a me poi dice che non trova nessuna scheda … cosa mi sono perso? Mi aspettavo si vedesse la mia scheda dalla tendina “nome” della scheda con Bridge e invece non c’è nulla … Qualcuno riesce a darmi qualche indicazione?
      grazie
      Massimo

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...