VirtualBox: creazione di una rete virtuale: differenze tra le versioni
m (→Requisiti) |
|||
(29 versioni intermedie di 10 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Virtualbox}} | |||
== Introduzione == | == 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. | 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.<br/> | ||
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. | 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.<br/> | ||
I due client sono dotati di interfacce di rete singole collegate alla seconda interfaccia del server. | 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, [[Un server DNS e DHCP su Debian | Una volta realizzata la struttura, sarà possibile provare a creare server proxy, [[Un server DNS e DHCP su Debian | DHCP, DNS]], [[Samba e OpenLDAP: creare un controller di dominio con Debian Lenny | LDAP]], [[Samba: guida estesa | condivisioni samba]] e quant'altro. | ||
{{Box|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: [http://wiki.v2.cs.unibo.it/wiki/index.php/VDE_native_support_for_VirtualBox sul wiki del progetto Virtualsquare] (in inglese).}} | |||
== Requisiti == | == Requisiti == | ||
Il software utilizzato è [http://www.virtualbox.org 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. | Il software utilizzato è [http://www.virtualbox.org 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 [https://packages.debian.org/jessie/bridge-utils bridge-utils] (per il comando brctl) ed [https://packages.debian.org/jessie/uml-utilities uml-utilities] (per il comando tunctl), entrambi presenti nei repository standard di Debian. | |||
== Installazione delle macchine virtuali == | == Installazione delle macchine virtuali == | ||
Per la creazione delle tre macchine virtuali (ovviamente Debian-powered!) si rimanda ad altre guide | 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 == | == 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 [http://linux.die.net/man/8/brctl brctl] e [http://linux.die.net/man/8/tunctl tunctl]. Il primo permette di gestire [http://it.wikipedia.org/wiki/Bridge_(informatica) bridge virtuali], ossia dispositivi in grado di collegare più interfacce fra loro in maniera simile a quanto fatto da un [http://it.wikipedia.org/wiki/Hub_(informatica) hub]. Il secondo permette di gestire [http://it.wikipedia.org/wiki/TUN/TAP interfacce ethernet virtuali] le quali saranno poi collegate ai bridge opportuni. | 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 [http://linux.die.net/man/8/brctl brctl] e [http://linux.die.net/man/8/tunctl tunctl]. Il primo permette di gestire [http://it.wikipedia.org/wiki/Bridge_(informatica) bridge virtuali], ossia dispositivi in grado di collegare più interfacce fra loro in maniera simile a quanto fatto da un [http://it.wikipedia.org/wiki/Hub_(informatica) hub]. Il secondo permette di gestire [http://it.wikipedia.org/wiki/TUN/TAP 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. | Supponendo che l'IP del router fisico al quale siamo collegati sia <code>192.168.1.1</code>, e per evitare eventuali conflitti nel routing dei pacchetti, vengono create le seguenti due sottoreti: <code>10.1.1.0/24</code> e <code>10.1.2.0/24</code>. Il primo bridge <code>''br0''</code> con indirizzo <code>10.1.1.1</code>, il secondo <code>''br1''</code> <code>10.1.2.1</code>. | ||
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. | Una volta creati i bridge si procede alla creazione delle interfacce virtuali <code>''tap0 tap1 tap2''</code> e <code>''tap3''</code>. <code>''tap0''</code> e <code>''tap1''</code> appartengono al server, <code>''tap2''</code> al primo client e <code>''tap3''</code> al secondo. <code>''tap0''</code> è collegato a <code>''br0''</code>, e attraverso di questo potrà comunicare con l'host (e con la rete esterna). <code>''tap1''</code>, <code>''tap2''</code> e <code>''tap3''</code> sono collegate a <code>''br1''</code> 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. | Di seguito un'immagine chiarificatrice sullo schema in oggetto. | ||
Riga 25: | Riga 30: | ||
I seguenti comandi vanno impartiti da utente | I seguenti comandi vanno impartiti da utente [[root]]. | ||
Creazione di un'interfaccia virtuale chiamata ''tap0'' disponibile solo per nomeUtente: | Creazione di un'interfaccia virtuale chiamata <code>''tap0''</code> disponibile solo per nomeUtente: | ||
<pre> | <pre> | ||
tunctl -t tap0 -u nomeUtente | # tunctl -t tap0 -u nomeUtente | ||
</pre> | </pre> | ||
Attivazione dell'interfaccia ''tap0'': | Attivazione dell'interfaccia <code>''tap0''</code>: | ||
<pre> | <pre> | ||
ip link set up dev tap0 | # ip link set up dev tap0 | ||
</pre> | </pre> | ||
Creazione di un bridge virtuale chiamato ''br0'': | Creazione di un bridge virtuale chiamato <code>''br0''</code>: | ||
<pre> | <pre> | ||
brctl addbr br0 | # brctl addbr br0 | ||
</pre> | </pre> | ||
Aggiunta di ''tap0'' a ''br0'': | Aggiunta di <code>''tap0''</code> a <code>''br0''</code>: | ||
<pre> | <pre> | ||
brctl addif br0 tap0 | # brctl addif br0 tap0 | ||
</pre> | </pre> | ||
Attivazione del bridge ''br0'': | Attivazione del bridge <code>''br0''</code>: | ||
<pre> | <pre> | ||
ip link set up dev br0 | # ip link set up dev br0 | ||
</pre> | </pre> | ||
Assegnazione dell'indirizzo 10.1.1.1 con netmask 255.255.255.0 a ''br0'': | Assegnazione dell'indirizzo <code>10.1.1.1</code> con netmask <code>255.255.255.0</code> a <code>''br0''</code>: | ||
<pre> | <pre> | ||
ip addr add 10.1.1.1/24 dev br0 | # ip addr add 10.1.1.1/24 dev br0 | ||
</pre> | </pre> | ||
Instradamento dei pacchetti diretti a <code>10.1.1.0</code> su <code>''br0''</code>: | |||
Instradamento dei pacchetti diretti a 10.1.1.0 su ''br0'': | |||
<pre> | <pre> | ||
ip route add 10.1.1.0/24 dev br0 | # ip route add 10.1.1.0/24 dev br0 | ||
</pre> | </pre> | ||
Riga 72: | Riga 76: | ||
<pre> | <pre> | ||
tunctl -t tap1 -u nomeUtente | # tunctl -t tap1 -u nomeUtente | ||
tunctl -t tap2 -u nomeUtente | # tunctl -t tap2 -u nomeUtente | ||
tunctl -t tap3 -u nomeUtente | # tunctl -t tap3 -u nomeUtente | ||
ip link set up dev tap1 | # ip link set up dev tap1 | ||
ip link set up dev tap2 | # ip link set up dev tap2 | ||
ip link set up dev tap3 | # ip link set up dev tap3 | ||
brctl addbr br1 | # brctl addbr br1 | ||
brctl addif br1 tap1 | # brctl addif br1 tap1 | ||
brctl addif br1 tap2 | # brctl addif br1 tap2 | ||
brctl addif br1 tap3 | # brctl addif br1 tap3 | ||
ip link set up dev br1 | # ip link set up dev br1 | ||
ip addr add 10.1.2.1/24 dev br1 | # ip addr add 10.1.2.1/24 dev br1 | ||
</pre> | </pre> | ||
== Configurazione delle macchine virtuali == | == Configurazione delle macchine virtuali == | ||
Si utilizzi la GUI di Virtualbox per assegnare <code>''tap0''</code> e <code>''tap1''</code> al server, <code>''tap2''</code> al primo client e <code>''tap3''</code> al secondo. Si rimanda alla documentazione di Virtualbox per la configurazione delle interfacce di rete delle macchine guest come [http://www.virtualbox.org/manual/UserManual.html#id2513808 Schede con bridge]. | |||
Si utilizzi la GUI di | |||
Una volta avviate le tre macchine virtuali è necessario configurarle come segue. | Una volta avviate le tre macchine virtuali è necessario configurarle come segue. | ||
Riga 158: | Riga 159: | ||
nameserver 10.1.2.2 # Il server sarà poi configurato per fornire il servizio DNS | nameserver 10.1.2.2 # Il server sarà poi configurato per fornire il servizio DNS | ||
</pre> | </pre> | ||
Dopo aver modificato la configurazione della rete, si impartisca su ogni macchina il comando: | Dopo aver modificato la configurazione della rete, si impartisca su ogni macchina il comando: | ||
<pre> | <pre> | ||
/etc/init.d/networking restart | # /etc/init.d/networking restart | ||
</pre> | </pre> | ||
== Abilitare la comunicazione verso l'esterno == | == 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. | 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. | ||
<pre> | <pre> | ||
echo 1 > /proc/sys/net/ipv4/ip_forward | # echo 1 > /proc/sys/net/ipv4/ip_forward | ||
iptables -F | # iptables -F | ||
iptables -A FORWARD -i eth0 -o br0 -j ACCEPT | # iptables -A FORWARD -i eth0 -o br0 -j ACCEPT | ||
iptables -A FORWARD -i br0 -o eth0 -j ACCEPT | # iptables -A FORWARD -i br0 -o eth0 -j ACCEPT | ||
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE | # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE | ||
</pre> | </pre> | ||
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. | 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 == | == Test della rete == | ||
Per verificare il corretto funzionamento della rete è sufficiente controllare di ottenere risposta ai seguenti comandi: | Per verificare il corretto funzionamento della rete è sufficiente controllare di ottenere risposta ai seguenti comandi: | ||
=== Server === | === Server === | ||
<pre> | <pre> | ||
ping 192.168.1.1 | $ ping 192.168.1.1 | ||
ping 10.1.1.1 | $ ping 10.1.1.1 | ||
ping 10.1.2.1 | $ ping 10.1.2.1 | ||
ping 10.1.2.3 | $ ping 10.1.2.3 | ||
ping 10.1.2.4 | $ ping 10.1.2.4 | ||
</pre> | </pre> | ||
=== Client 1 === | === Client 1 === | ||
<pre> | <pre> | ||
ping 10.1.2.1 | $ ping 10.1.2.1 | ||
ping 10.1.2.2 | $ ping 10.1.2.2 | ||
ping 10.1.2.4 | $ ping 10.1.2.4 | ||
</pre> | </pre> | ||
=== Client 2 === | === Client 2 === | ||
<pre> | <pre> | ||
ping 10.1.2.1 | $ ping 10.1.2.1 | ||
ping 10.1.2.2 | $ ping 10.1.2.2 | ||
ping 10.1.2.3 | $ ping 10.1.2.3 | ||
</pre> | </pre> | ||
== Ripristinare la situazione iniziale == | |||
Una volta spente le macchine virtuali, per eliminare le interfacce virtuali è sufficiente digitare: | |||
<pre> | |||
# 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 | |||
</pre> | |||
== 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 <code>''initmachines.sh''</code> e si copi all'interno il seguente codice: | |||
<pre> | |||
#!/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 | |||
</pre> | |||
Per avviare le interfacce sarà sufficiente digitare (come root): | |||
<pre> | |||
# sh /pathDelloScript/initmachines.sh start | |||
</pre> | |||
Per ripristinare la situazione iniziale: | |||
<pre> | <pre> | ||
# sh /pathDelloScript/initmachines.sh stop | |||
</pre> | </pre> | ||
[[Categoria:Virtualizzazione]] [[Categoria:Non-Free]] |
Versione attuale delle 08:03, 21 mag 2016
VirtualBox |
Sommario |
|
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