VirtualBox: creazione di una rete virtuale

VirtualBox

Sommario

Installazione e configurazione
Amministrazione
Altro

Introduzione

Scopo di questa guida è illustrare i passi necessari ad ottenere un semplice laboratorio virtuale a scopo di studio così strutturato: tre macchine virtuali, una con funzioni di server e le altre due con funzioni di client.
Il server è dotato di due interfacce di rete, una verso l'host, attraverso il quale verrà garantita la navigazione in internet, e l'altra verso una rete interna visibile solamente ai client.
I due client sono dotati di interfacce di rete singole collegate alla seconda interfaccia del server.

Una volta realizzata la struttura, sarà possibile provare a creare server proxy, DHCP, DNS, LDAP, condivisioni samba e quant'altro.

  Nota
In alternativa, utilizzando le ultime versioni di Virtualbox, è possibile sfruttare il supporto nativo per VDE (Virtual Distributed Ethernet) che consente di creare reti virtuali più complesse, reti ibride (reali+virtuali), reti condivise tra diversi software di virtualizzazione (kvm, qemu, umlinux, bochs, etc.). Per maggiori informazioni sul supporto nativo VDE: sul wiki del progetto Virtualsquare (in inglese).


Requisiti

Il software utilizzato è VirtualBox, installato dai repository degli sviluppatori ed al momento della stesura della guida alla versione 3.0.8. Nonostante la versione 3.0 offra la possibilità di fare quanto segue in maniera automatica, si sceglie comunque di procedere manualmente per meglio comprendere quanto accade.

Per la configurazione dei repository di VirtualBox e per l'installazione del software si seguano le guide VirtualBox: installazione, VirtualBox: configurazione e VirtualBox: amministrazione da terminale.

È inoltre necessario installare i pacchetti bridge-utils (per il comando brctl) ed uml-utilities (per il comando tunctl), entrambi presenti nei repository standard di Debian.

Installazione delle macchine virtuali

Per la creazione delle tre macchine virtuali (ovviamente Debian-powered!) si rimanda ad altre guide; il procedimento è piuttosto semplice e non richiede spiegazioni aggiuntiva. Si abbia solo l'accortezza di configurare le reti delle macchine virtuali come NAT, in questo modo non ci saranno problemi durante l'installazione. Questa configurazione sarà poi modificata più avanti.

Realizzazione delle interfacce virtuali

Verosimilmente la macchina host è dotata di un solo dispositivo, supponiamo eth0. Per i nostri scopi abbiamo bisogno di aggiungere altre quattro interfacce. Per far questo ci vengono in aiuto i comandi brctl e tunctl. Il primo permette di gestire bridge virtuali, ossia dispositivi in grado di collegare più interfacce fra loro in maniera simile a quanto fatto da un hub. Il secondo permette di gestire interfacce ethernet virtuali le quali saranno poi collegate ai bridge opportuni.

Supponendo che l'IP del router fisico al quale siamo collegati sia 192.168.1.1, e per evitare eventuali conflitti nel routing dei pacchetti, vengono create le seguenti due sottoreti: 10.1.1.0/24 e 10.1.2.0/24. Il primo bridge br0 con indirizzo 10.1.1.1, il secondo br1 10.1.2.1.

Una volta creati i bridge si procede alla creazione delle interfacce virtuali tap0 tap1 tap2 e tap3. tap0 e tap1 appartengono al server, tap2 al primo client e tap3 al secondo. tap0 è collegato a br0, e attraverso di questo potrà comunicare con l'host (e con la rete esterna). tap1, tap2 e tap3 sono collegate a br1 attraverso il quale viene garantita la connessione fra i client ed il server. Gli indirizzi IP dei dispositivi TAP saranno poi configurati all'interno delle macchine virtuali. Di seguito un'immagine chiarificatrice sullo schema in oggetto.


I seguenti comandi vanno impartiti da utente root.


Creazione di un'interfaccia virtuale chiamata tap0 disponibile solo per nomeUtente:

# tunctl -t tap0 -u nomeUtente


Attivazione dell'interfaccia tap0:

# ip link set up dev tap0


Creazione di un bridge virtuale chiamato br0:

# brctl addbr br0


Aggiunta di tap0 a br0:

# brctl addif br0 tap0


Attivazione del bridge br0:

# ip link set up dev br0


Assegnazione dell'indirizzo 10.1.1.1 con netmask 255.255.255.0 a br0:

# ip addr add 10.1.1.1/24 dev br0

Instradamento dei pacchetti diretti a 10.1.1.0 su br0:

# ip route add 10.1.1.0/24 dev br0

Similmente:

# tunctl -t tap1 -u nomeUtente
# tunctl -t tap2 -u nomeUtente
# tunctl -t tap3 -u nomeUtente
# ip link set up dev tap1
# ip link set up dev tap2
# ip link set up dev tap3
# brctl addbr br1
# brctl addif br1 tap1
# brctl addif br1 tap2
# brctl addif br1 tap3
# ip link set up dev br1
# ip addr add 10.1.2.1/24 dev br1

Configurazione delle macchine virtuali

Si utilizzi la GUI di Virtualbox per assegnare tap0 e tap1 al server, tap2 al primo client e tap3 al secondo. Si rimanda alla documentazione di Virtualbox per la configurazione delle interfacce di rete delle macchine guest come Schede con bridge.

Una volta avviate le tre macchine virtuali è necessario configurarle come segue.

Server

# cat /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 10.1.1.2
netmask 255.255.255.0
up route add default gw 10.1.1.1 dev eth0

auto eth1
iface eth1 inet static
address 10.1.2.2
netmask 255.255.255.0

# cat /etc/resolv.conf

domain
search
nameserver 192.168.1.1 # Il servizio DNS è demandato al router fisico

Client 1

# cat /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 10.1.2.3
netmask 255.255.255.0
up route add default gw 10.1.2.2 dev eth0 #La comunicazione verso l'esterno deve passare dal server

# cat /etc/resolv.conf

domain
search
nameserver 10.1.2.2 # Il server sarà poi configurato per fornire il servizio DNS

Client 2

# cat /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 10.1.2.4
netmask 255.255.255.0
up route add default gw 10.1.2.2 dev eth0 #La comunicazione verso l'esterno deve passare dal server

# cat /etc/resolv.conf

domain
search
nameserver 10.1.2.2 # Il server sarà poi configurato per fornire il servizio DNS

Dopo aver modificato la configurazione della rete, si impartisca su ogni macchina il comando:

# /etc/init.d/networking restart

Abilitare la comunicazione verso l'esterno

La comunicazione verso l'esterno (host ed internet) è inibita. Per permettere al server di comunicare con l'host è necessario modificare le regole di iptables nel modo seguente.

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -F
# iptables -A FORWARD -i eth0 -o br0 -j ACCEPT
# iptables -A FORWARD -i br0 -o eth0 -j ACCEPT
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Si noti che per quanto fatto finora l'unica macchina in grado di accedere all'esterno è il server. Sarà poi compito del server stesso fornire l'accesso ai suoi client.

Test della rete

Per verificare il corretto funzionamento della rete è sufficiente controllare di ottenere risposta ai seguenti comandi:

Server

$ ping 192.168.1.1
$ ping 10.1.1.1
$ ping 10.1.2.1
$ ping 10.1.2.3
$ ping 10.1.2.4

Client 1

$ ping 10.1.2.1
$ ping 10.1.2.2
$ ping 10.1.2.4

Client 2

$ ping 10.1.2.1
$ ping 10.1.2.2
$ ping 10.1.2.3

Ripristinare la situazione iniziale

Una volta spente le macchine virtuali, per eliminare le interfacce virtuali è sufficiente digitare:

# echo 0 > /proc/sys/net/ipv4/ip_forward
# ip link set down dev tap0
# ip link set down dev tap1
# ip link set down dev tap2
# ip link set down dev tap3
# brctl delif br0 tap0
# brctl delif br1 tap1
# brctl delif br1 tap2
# brctl delif br1 tap3
# ip link set down dev br0
# ip link set down dev br1
# brctl delbr br0
# brctl delbr br1

Gestire le interfacce tramite Script

Per evitare di digitare ogni volta i comandi di creazione e eliminazione delle interfacce virtuali è possibile realizzare un semplice script bash. Si crei dunque un file di nome initmachines.sh e si copi all'interno il seguente codice:

#!/bin/sh
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

case "$1" in
start)
	tunctl -t tap0 -u nomeUtente
	ip link set up dev tap0
	brctl addbr br0
	brctl addif br0 tap0
	ip link set up dev br0
	ip addr add 10.1.1.1/24 dev br0
	ip route add 10.1.1.0/24 dev br0
	
	tunctl -t tap1 -u nomeUtente
	tunctl -t tap2 -u nomeUtente
	tunctl -t tap3 -u nomeUtente
	ip link set up dev tap1
	ip link set up dev tap2
	ip link set up dev tap3
	brctl addbr br1
	brctl addif br1 tap1
	brctl addif br1 tap2
	brctl addif br1 tap3
	ip link set up dev br1
	ip addr add 10.1.2.1/24 dev br1
	
	echo 1 > /proc/sys/net/ipv4/ip_forward
	iptables -F
	iptables -A FORWARD -i eth0 -o br0 -j ACCEPT
	iptables -A FORWARD -i br0 -o eth0 -j ACCEPT
	iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
	;;

stop)
	echo 0 > /proc/sys/net/ipv4/ip_forward
	ip link set down dev tap0
	ip link set down dev tap1
	ip link set down dev tap2
	ip link set down dev tap3
	brctl delif br0 tap0
	brctl delif br1 tap1
	brctl delif br1 tap2
	brctl delif br1 tap3
	ip link set down dev br0
	ip link set down dev br1
	brctl delbr br0
	brctl delbr br1
	;;

*)
	echo "Usage: initmachines {start|stop}"
	exit 1
	;;
esac

exit 0


Per avviare le interfacce sarà sufficiente digitare (come root):

# sh /pathDelloScript/initmachines.sh start


Per ripristinare la situazione iniziale:

# sh /pathDelloScript/initmachines.sh stop