lunedì 3 gennaio 2011

VDE Virtual Networking

Una delle cose veramente utili e divertenti della virtualizzazione è la possibilità di fare facilmente dei test dove altrimenti sarebbe scomodo, lento o troppo costoso farli su delle macchine vere.

Già da tempo esistono software come QEmu o VirtualBox che virtualizzano un intero computer, compreso bus PCI con schede audio, video e di rete; da meno tempo invece si trovano virtualizzazioni meno "spinte" come il progetto Virtual Square, che si propone come aggregatore di progetti di virtualizzazioni parziali, di singoli componenti o funzionalità.

Una virtualizzazione meno spinta ha la possibilità di essere più veloce o meglio integrata con software e sistemi non virtualizzati, con meno layer; permette anche di usarne un singolo componente in altri contesti.

Questa brevissimo accenno a Virtual Square serve solo per poter introdurre un loro progetto: VDE, reti virtuali. Invece che macchine intere, "semplici" componenti per interconnettere macchine reali e virtuali con nodi e cavi virtuali.

Gli switch di VDE sono switch a tutti gli effetti, con console di management via socket, e supportano tagged VLAN e cavi virtuali per interconnetterli tra loro, verso switch virtuali su macchine remote (tramite tunnel cifrati) e verso interfacce TUN sulla macchina reale.

Vediamo per esempio come simulare un server DHCP che serva due sottoreti differenti con alcune macchine virtuali, degli switch virtuali e un router virtuale (dhcp relay).

Creo una nuova interfaccia tap con permessi per il mio utente:

$ sudo tunctl -u marco
Set 'tap0' persistent and owned by uid 1000 

Lancio tre switch virtuali, di cui il primo lo aggancio alla tap0 appena creata:

$ vde_switch --unix /var/tmp/vde1.s --mgmt /var/tmp/vde1.m --tap tap0 --daemon 
$ vde_switch --unix /var/tmp/vde2.s --mgmt /var/tmp/vde2.m --daemon 
$ vde_switch --unix /var/tmp/vde3.s --mgmt /var/tmp/vde3.m --daemon

Lancio una macchina virtuale KVM (qemu con supporto hardware per la virtualizzazione) con due schede di rete collegate agli switch (fondamentale specificare i mac address)

$ kvm -hda hda-qemu.qcow -m 512 -net nic,macaddr=00:11:22:33:44:55,vlan=0 -net nic,macaddr=00:11:22:33:44:56,vlan=1 -net vde,sock=/var/tmp/vde1.s,vlan=0 -net vde,sock=/var/tmp/vde2.s,vlan=1

Lancio un paio di macchine virtuali con una debian live da cdrom, ognuna collegata ad un diverso switch:

$ kvm -cdrom debian-live-squeeze-i386-standard.iso -net vde,sock=/var/tmp/vde1.s -net nic,macaddr=00:11:22:33:44:10
$ kvm -cdrom debian-live-squeeze-i386-standard.iso -net vde,sock=/var/tmp/vde3.s -net nic,macaddr=00:11:22:33:44:11

Collego tra loro lo switch 2 e 3 (per fare test con le vlan per esempio):

$ dpipe vde_plug /var/tmp/vde2.s = vde_plug /var/tmp/vde3.s &

Mi collego all'interfaccia di management dello switch 2 e doò alcuni comandi:

$ unixterm /var/tmp/vde2.m

VDE switch V.2.2.3
(C) Virtual Square Team (coord. R. Davoli) 2005,2006,2007 - GPLv2

vde$ port/allprint
0000 DATA END WITH '.'
Port 0001 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
 Current User: marco Access Control: (User: NONE - Group: NONE)
 IN:  pkts          2          bytes                  168
 OUT: pkts          0          bytes                    0
  -- endpoint ID 0003 module unix prog   : QEMU user=marco PID=10452  SOCK=/var/tmp/vde2.s/.10452-00000
Port 0002 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
 Current User: marco Access Control: (User: NONE - Group: NONE)
 IN:  pkts          0          bytes                    0
 OUT: pkts          2          bytes                  168
  -- endpoint ID 0008 module unix prog   : vde_plug: user=marco PID=10461  SOCK=/var/tmp/vde2.s/.10461-00000
.
1000 Success

vde$ help
0000 DATA END WITH '.'
COMMAND PATH       SYNTAX          HELP
------------       --------------  ------------
ds                 ============    DATA SOCKET MENU
ds/showinfo                        show ds info
help               [arg]           Help (limited to arg when specified)
... omesso ...
vde$ vlan/create 42
1000 Success

vde$ port/setvlan 1 42
1000 Success

vde$ port/setvlan 2 42
1000 Success

Collego uno switch (stupido) layer 3 allo switch 1 e 3:

$ vde_l3 -v /var/tmp/vde1.s:10.0.8.1/255.255.255.0 -v /var/tmp/vde3.s:10.0.1.1/255.255.255.0 -M /var/tmp/vde_l3.m

Senza fare un tutorial preciso e lungo sul dhcp diciamo che l'host virtuale con le due schede di rete necessita di un server dhcp (collegato eventualmente al dns) configurato per servire due subnet diverse pur rimanendo esso su una sola delle due subnet (metti due subnet /24, il dhcp avrà la scheda di rete configurata su una delle due, non un network /16).

Putroppo il router virtuale (switch "layer 3") dovremo eliminarlo perché per ora non supporta il dhcp-relay e dunque deve essere sostituito con una macchina virtuale con due schede di rete che abbia installato il pacchetto dhcp-relay e forwarding tra le interfacce abilitato.


Lascio la configurazione DHCP e DNS in /dev/null, magari la aggiungerò qui sotto più avanti.