Categories
git Linux

Bridge virtuale

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)

schema di rete realizzato con un cavo Ethernet tra Debian GNU/Linux e macOS

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)

screenshot di virt-manager con configurazione predefinita NAT

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

schema di rete virtuale tra host e guest . Guest ha indirizzo 192.168.122.215, virtbr0 ha uno dei suoi indirizzi pari a 192.168.122.1

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):

schema di rete virtuale, simile al precedente, dove è stato aggiunta una scheda di rete su guest (chiamata enp10s0), e un bridge virtuale su host (chiamato br0)

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.

screenshot del comando brctl show

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”
screenshot di virt-manager con nuova scheda NIC e nuova configurazione (bridge device)

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

Configurare la nuova scheda della macchina guest di rete nel file /etc/network/interfaces usando gli stessi dati usati nella macchina host (nel terzo passo), ad esempio:

iface ens10p0 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 ens10p0

Ritornare ad host

Ottavo passo

(Con macchina guesta avviata) Si deve aggiungere 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
Screenshot del comando ip addr (macchina host) che dimostra la presenza di vnet2 e vnet3 (due interfacce virtuali)

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)

Stesso comando di prima, con output diverso, in quanto ora vnet3 appartiene al bridge br0

Risultato confermato anche dal comando:

# brctl show
screenshot che dimostra la presenza di un bridge con due interfacce

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:

Schema della rete virtuale con dispositivo bridge

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

Leave a Reply