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.

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.

E' inoltre necessario installare il pacchetto bridge-utils presente 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