Spesso è necessario collegare la propria macchina virtuale, il proprio ambiente di sviluppo, con la rete reale. Come configurare la macchina host e la macchina guest?
In questo esempio si parte da tre macchine:
- prima macchina: guest Debian con server ssh
- seconda macchina: host con libvirt/ virt-manager, al cui interno si ospita la prima macchina
- terza macchina: macOS, in rete con la seconda macchina
In questo esempio nessuna delle due macchine reali possiede una porta Ethernet e poichè al momento libvirt non supporta la comunicazione wireless, si aggiungeranno dei dispositivi di rete USB.
Configurazione macOS
La prima cosa da verificare è la comunicazione tra macchina host (Debian) e macchina reale (macOS in rosa)

si deve aggiungere una nuova connessione di rete su Debian e su macOS, assegnando un indirizzo IP statico in entrambi i casi:
- su Debian
192.168.9.1
- su macOS
192.168.9.9
su macOS potrebbe essere attivo il firewall (opzione stealt mode on), che su macOS 12 si può trovare alla voce Privacy. Va disattivato subito.
Provare a fare ping 192.168.9.9
dal terminale Debian. Non si può proseguire se il ping non funziona
Configurazione Host
Se il ping funziona si passa alla configurazione della macchina virtuale guest.
Di solito la macchina guest è configurata con rete “NAT” (predefinita su libvirt/ virt-manager)

NAT equivale a questa schema di rete (virtuale) dove il dispositivo virtb0 è un router virtuale

La configurazione NAT non permette alla macchina macOS di accedere dalla rete reale alla rete virtuale della macchina guest (dove è presente il server SSH). Per far comunicare la macchina guest con la rete reale, è necessario aggiungere
- un bridge (virtuale) sulla macchina host (procedimento diviso in 4 passi)
- una nuova scheda di rete (virtuale) sulla macchina guest (procedimento diviso in 4 passi)
Alla fine si dovrebbe ottenere questo nuovo schema di rete (confrontarlo con il precedente):

Primo passo
Per aggiungere il bridge virtuale sulla macchina host si deve installare il pacchetto bridge-utils
e si devono scrivere i seguenti comandi (come superutente):
# brctl show
L’output dovrebbe mostrare gli eventuali altri bridge virtuali (se presenti)
Secondo passo
Se si collega un adattatore USB per la rete Ethernet, si può scoprire l’indirizzo MAC e il nome del dispositivo con questo comando (copiare il nome e il MAC address del dispositivo per riutilizzarlo nel prossimo passo). Lo stesso comando va usato anche se la scheda di rete è già presente.
ip addr
1: lo 2: enx000000000abc123 link/ether d0:50:c0:0b:06:04
Terzo passo
Memorizzare una modifica alla configurazione di rete sul file /etc/network/interfaces
# aggiungere in fondo
iface enx000000000abc123 inet manual
iface br0 inet static
hwaddress ether d0:50:c0:0b:06:04
address 192.168.9.1
netmask 255.255.255.0
bridge_ports enx000000000abc123
bridge_stp off
bridge_fd 0
Quarto passo
Per ricaricare la nuova configurazione sulla macchina host è necessario eseguire i prossimi tre comandi, utili per:
- riavviare il servizio (come superutente)
- attivare il nuovo bridge
- osservare la lista dei bridge e l’interfaccia ad esso collegata
# systemctl restart networking.service
# ifup br0
# brctl show
Questo output è corretto, ma non è quello definitivo poichè ogni bridge deve possedere almeno DUE interfacce di rete. Nel prossimo passo si creerà una nuova scheda di rete virtuale.

Configurazione guest
Quinto passo
Per aggiungere la nuova scheda di rete (virtuale) sulla macchina guest (spenta) si opera sull’interfaccia grafica virt-manager come in questa figura:
- premere il tasto “add”
- cambiare Network source in “Bridge device”
- scrivere il nome “br0”

Fare attenzione alle differenze con la configurazione NAT (vista prima)
Sesto passo
Dopo aver applicato (salvato) le modifiche si può finalmente avviare la macchina guest e si può scoprire il nome di questa seconda scheda con il comando:
ip addr
Ad esempio, se la prima scheda si chiama enp1s0, la seconda (appena creata) si potrebbe chiamare enp10s0. Si può riconoscere il nome della seconda scheda in quanto c’è scritto
state DOWN
(copiare il nome del dispositivo per riutilizzarlo nel prossimo passo)
Settimo passo
Nella macchina guest.
Configurare la nuova scheda della macchina guest di rete nel file /etc/network/interfaces
usando gli stessi dati usati (IP address e MAC address ) nella macchina host (nel terzo passo), ad esempio:
iface enp10s0 inet static
hwaddress ether d0:50:c0:0b:06:04
address 192.168.9.1
netmask 255.255.255.0
infine ricaricare il servizio ed attivare la nuova scheda
# systemctl restart networking.service
# ifup enp10s0
Ritornare ad host
Ottavo passo
Si deve aggiungere alla macchina host (con macchina guest avviata) anche la scheda di rete virtuale appena creata in guest, al bridge (br0) creato in host. Nella macchina guest si aveva una nuova scheda NIC di nome ens10p0
, questa, però, nella macchina host si potrebbe chiamare vnet3
. Per esserne sicuri si può usare questo comando da eseguire nella macchina host (dove la macchina guest è accesa):
ip addr

Le due schede di nome vnetX
sono di tipo virtuale, e questo è dimostrabile dal fatto che hanno state UNKNOWN
, mentre quello di una vera scheda di rete (della macchina host) dovrebbe essere state UP
oppure state DOWN
. Comunque ora non si deve modificare lo stato, ma solo aggiungere questa scheda (vnet3) al bridge br0 (come superutente):
# brctl addif br0 vnet3
Ecco come cambia l’output del precedente comando (su vnet3)

Risultato confermato anche dal comando:
# brctl show

Nel precedente screenshot il bridge br0 possiede due schede di rete, una virtuale e una reale.
Nel prossimo paragrafo si osserva anche lo schema finale della rete.
Prova di funzionamento
Nono passo
Provare il ping sul terminale della macchina guest: ping 192.168.9.9
.
Questo è lo schema finale:

Dallo schema si osservano due particolarità:
- il bridge non possiede indirizzo ip (al contrario di un router)
- l’indirizzo IP di rete virtuale coincide con quello della scheda reale