Reti di calcolatori - VirtualBox

Utilizzo del software di virtualizzazione VirtualBox.

Cosa sono le macchine virtuali?

Macchine virtuali

Le macchine virtuali sono software che permettono di emulare un intero computer.

Benefici della virtualizzazione

  • Eseguire più sistemi diversi contemporaneamente
  • Semplificare l'installazione ed utilizzo di software specifici
  • Disponibilità e disaster recovery
  • Debuggare e testare configurazioni di rete o architetture distribuite
  • Cloud

Cos'è VirtualBox?

VirtualBox è un software di virtualizzazione, ovvero un programma che permette di creare e gestire macchine virtuali.

Terminologia

  • Host Operating System (host OS): sistema operativo che esegue VirtualBox
  • Guest Operating System (guest OS): sistema operativo che gira all'interno della macchina virtuale
  • Macchina virtuale (VM): ambiente creato da VirtualBox che emula un computer e le sue componenti
  • Guest Additions: software opzionale che aggiunge diverse funzionalità alle VM create con VirtualBox

Immagini

I sistemi operativi vengono spesso distribuito in formato iso, ovvero un file immagine che contiene i file necessari per la sua istallazione.

Alternativamente, dopo aver creato una prima VM, questa può essere clonata per creare altre VM identiche con lo stesso stato.

Creare una macchina virtuale

Vediamo i passi necessari per creare una macchina virtuale.

Immagine del sistema operativo

Scarichiamo l'immagine del sistema operativo che vogliamo installare.

In questo caso, utilizzeremo debian.

La guida riguardo la configurazione di VirtualBox può essere consultata sul sito.

Nel momento in cui viene avviata, selezionando l'installazione grafica sarà sufficiente seguire le istruzioni a schermo.

Connessione ssh

Per utilizzare più agevolmente la VM, può essere comodo connettersi ad essa tramite ssh.

Questo può essere fatto dopo aver attivato il server ssh sul guest OS.
Se l'installazione è stata quella guidata, dovrebbe essere già attivo. Altrimenti è necessario seguire questi passi.

Port forwarding

Di default, VirtualBox crea una connessione di tipo NAT.

Per poterci connettere alla VM, dobbiamo effettuare un port forwarding.

Connessione ssh con NAT

Dall'host OS, possiamo connetterci alla VM tramite ssh.

ssh -p 2222 debian@localhost

Tipi di rete

VirtualBox supporta diversi tipi di rete.
La scelta influenza la raggiungibilità delle VM e la loro connessione ad altre reti.

Ulteriori dettagli
Ulteriori dettagli

Confronto

ModeVM → HostVM ← HostVM1 ↔ VM2VM → LANVM ← LAN
Bridged
NAT networkForwardingForwarding
NATForwardingForwarding
Host-only
Internal
Detached

NAT

NAT network

Bridged

Internal network

Host only

Passaggi chiave

Di seguito ci sarà una serie di passaggi o di controlli da fare per verificare la correttezza della configurazione di VirtualBox.

Assicuratevi che il passaggio sia fatto sulla macchina corretta guardando il prompt della shell: host (il vostro computer) o vm (la macchina virtuale).

Alcune operazioni richiedono privilegi di amministratore. Se è questo il caso, il prompt della shell mostrerà l'utente root Per eseguire tali operazioni, potete aggiungere sudo prima del comando o cambiare utente con su, diventando root.

Rete host-only

Dopo aver effettuato tutti gli eventuali aggiornamenti ed installazioni che necessitano internet, generalmente si userà la rete host-only.

Bisogna assicurarsi che Virtualbox abbia creato tale rete.

Host-only network

Interfaccia di rete host-only

A quel punto si deve impostare l'interfaccia di rete che userà la VM.

Se clonate una macchina, assicuratevi di cambiare il MAC address.

Host-only network interface

Conoscere l'indirizzo ip della VM

Per poter connettere la VM, è necessario conoscere il suo indirizzo ip. Questo può essere fatto con il comando ip a.

user@vm:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue ...
    ...
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.24/24 brd 192.168.56.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::800:27ff:fe00:3754/64 scope link
       valid_lft forever preferred_lft forever

L'interfaccia è la enp0s3, e gli indirizzi sono 192.168.56.24 per IpV4 e fe80::800:27ff:fe00:2754 per IpV6.

Check della connessione

A questo punto la VM dovrebbe essere raggiungibile dall'host. La connessione può essere verificata con il comando ping.

# ping <ip VM>
user@host:~$ ping 192.168.56.24

SSH

SSH è un tool, nonché un protocollo, per poter accedere alla VM da remoto. La VM deve fornire un server SSH a cui l'host si connetterà.

Per verificare che il server SSH sia attivo, si può usare il comando systemctl. Potrebbe essere necessario essere root.

root@vm:~$ systemctl status ssh
ssh.service - OpenBSD Secure Shell server
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
    Active: active (running) since Fri 2021-09-24 15:27:55 CEST; 1h 26min ago
    ...

Installazione server SSH

Se il server SSH non è installato, può essere fatto con il comando apt. Bisogna assicurarsi di avere i privilegi di root.
Inoltre sarà necessario accedere ad internet per effettuare il download. Quindi la VM dovrà essere connessa utilizzando la rete NAT.

root@vm:~$ apt update # Aggiornamento dei pacchetti, se non ancora fatto
root@vm:~$ apt install openssh-server

Check della connessione ssh

A questo punto la VM dovrebbe essere raggiungibile dall'host tramite ssh. La connessione può essere verificata con il comando ssh.

# ssh <user>@<ip VM>
user@host:~$ ssh user@192.168.56.24

La prima volta che effettuate la connessione vi verrà chiesto di accettare la chiave pubblica (fingerprint) del server ssh. Per proseguire basta digitare yes.

Connessione con VsCode remote ssh

VsCode offre l'estensione Remote - SSH che fornisce una connessione ssh agevolata.

Nel connettervi alla VM, non utilizzate l'account di root, ma quello utente, con la sua password.

Al primo avvio sarà necessario attendere per l'installazione del server VsCode sulla VM.

Ulteriori dettagli

Tips and tricks

Serie di consigli e trucchi per utilizzare al meglio le macchine virtuali e VsCode.

Permessi di amministratore

Quando si effettua il login tramite ssh, si dovrebbe utilizzare sempre un utente non privilegiato. Se vi dovesse servire agire con i permessi di amministratore, potete:

  • premettere il comando con sudo (es. sudo apt update). Verrà chiesta la password dell'utente.
  • cambiare utente da terminale usando il comando su. Verrà chiesta la password di root.
# Da user a root
user@vm:~$ su
Password:
# Da root a user
root@vm:/home/user$ su user
user@vm:~$

Aggiungere un host alla config di ssh

Invece di inserire ogni volta la stringa user@ip per connettersi alla VM, è possibile aggiungere un host alla configurazione di ssh.

Questa operazione può essere fatta sia dal menù di connessione di VsCode, selezionando
+ Add New SSH Host...
sia manualmente, editando il file ~/.ssh/config.

# ~/.ssh/config
Host vm                     # Nome mostrato nella lista di VsCode
    HostName 192.168.56.24  # Ip della VM
    User user               # Utente con cui connettersi

Risparmiare tempo con i cloni

Se avete bisogno di creare più VM identiche, potete effettuare delle clonazioni, così da evitare di ripetere il setup più volte.

In questo caso, connettendosi con VsCode alla VM originale, effettuerete il setup del server VsCode e potreste anche installare eventuali estensioni, in particolare quella di C/C++. Tutte le macchine clone si ritroveranno tutto il necessario già pronto.

Ricordatevi di cambiare il MAC address delle VM clonate.

Eseguire più comandi contemporaneamente

Quando si lancia un comando da terminale, il terminale rimane occupato fino a che il comando non termina.

Questo può essere scomodo se si vuole eseguire più comandi che rimangono in esecuzione contemporaneamente, come ad esempio un server e un client.

Più terminali

Il modo più semplice per eseguire più comandi contemporaneamente è quello di aprire più terminali:

  • VsCode: Terminal -> New Terminal (o Split terminal)
  • ssh: Lanciare una nuova connessione ssh in un nuovo terminale

Comandi in background

Un comando può essere eseguito in background aggiungendo & alla fine del comando.
I programmi in background non ricevono input da tastiera e non mostrano output sul terminale.

user@vm:~$ ./server 2000 & ./client 127.0.0.1 2000

Per vedere i comandi in background, si può usare il comando jobs.

user@vm:~$ jobs
[1]+  Running                 ./server &

Per riportare un comando in background in foreground, si può usare il comando fg, potendolo poi interrompere con Ctrl+C.

user@vm:~$ fg %1

Terminal multiplexer

Un terminal multiplexer è un software che permette di dividere una finestra di terminale in più parti, o pannelli indipendenti.

Alcuni esempi sono:

byobu

Byobu è un frontend per tmux o screen, che permette di avere una serie di comandi predefiniti per la gestione delle sessioni.

Per installarlo, basta usare il comando apt.

root@vm:~$ apt install byobu

Per avviarlo, basta digitare byobu da terminale.

byobu keybindings

Byobu offre una serie di keybindings per la gestione delle sessioni. Ecco i più comuni:

  • F2: crea una nuova finestra
  • F3 e F4: naviga tra le finestre
  • shift + F2: divide la finestra orizzontalmente
  • shift + F3 / F4: naviga tra i pannelli orizzontali
  • comando exit: chiude la finestra corrente

Comandi shell utili

Lista di comandi utili da terminale suddivisi per macro categorie.

Comandi di rete e ssh

  • ip a: mostra le interfacce di rete e i relativi indirizzi ip
  • ip r: mostra la tabella di routing
  • ping <ip>: invia un pacchetto icmp echo request all'ip specificato
  • ssh <user>@<ip>: connessione ssh all'ip specificato
  • scp <file locale> <user>@<ip>:<dest remota>: copia il file locale in remoto
  • scp <user>@<ip>:<file remoto> <dest locale>: copia il file remoto in locale

Comandi di sistema

  • ls: mostra i file e le cartelle presenti nella cartella corrente
  • ls -la: lista estesa
  • mkdir <cartella>: crea una nuova cartella
  • cd <cartella>: entra nella cartella
  • rm <file>: rimuove il file
  • rm -r <cartella>: rimuove la cartella e tutto il suo contenuto
  • mv <file> <destinazione>: rinomina il file o lo sposta
  • cp <file> <destinazione>: copia il file
  • cat <file>: mostra il contenuto del file
  • nano <file>: apre il file con l'editor nano

Comandi di servizio

  • systemctl status <nome servizio>: mostra lo stato del servizio
  • systemctl start <nome servizio>: avvia il servizio
  • systemctl stop <nome servizio>: ferma il servizio
  • systemctl restart <nome servizio>: riavvia il servizio
  • systemctl enable <nome servizio>: avvia il servizio all'avvio della macchina

Sniffing di rete

Capire meglio come funziona la rete e tutti i protocolli che vengono utilizzati diventa più facile quando si ha modo di osservare il traffico di rete.

Vi sono vari tool in grado di ottenere questo risultato. Noi vedremo una combinazione fra le funzionalità di VirtualBox e Wireshark per visualizzare i file .pcap.

Abilitare la cattura del traffico

VirtualBox prevede l'opzione di catturare tutto il traffico che coinvolge una macchina virtuale, salvandolo in un file .pcap.
Il comando deve essere fatto quando la macchina è spenta, e si applicherà al prossimo avvio.

La sintassi è la seguente:

VBoxManage modifyvm <nome vm> --nictrace<numero scheda di rete> on --nictracefile<numero scheda di rete> /path/file.pcap

Ad esempio

user@host:~$ VBoxManage modifyvm "MyVM" --nictrace1 on --nictracefile1 file.pcap

Ricordate di disattivare la cattura quando avete finito

user@vm:~$ VBoxManage modifyvm "MyVM" --nictrace1 off --nictracefile1 file.pcap

Leggere il file .pcap

Una volta ottenuto il file .pcap, è possibile aprirlo con Wireshark o con qualsiasi altro tool in grado di leggere questo formato, come tcpdump.

Wireshark

Guest additions

Le guest additions sono un software opzionale che aggiunge diverse funzionalità alle VM create con VirtualBox.

Vedremo nello specifico come installarle su un guest debian. È sempre consigliabile fare queste operazioni sulla macchina virtuale originale, prima di effettuare cloni.

Installazione le dipendenze sulla macchina virtuale

Il primo passo consiste nell'assicurarsi che la VM abbia accesso ad internet. La scheda di rete deve essere di tipo NAT, bridged o simili.

Successivamente si possono installare i pacchetti necessari.

root@vm:~$ apt update
root@vm:~$ apt install build-essential dkms linux-headers-$(uname -r)

Abilitare il copia-incolla da terminale

Se si lavora con una macchina virtuale senza interfaccia grafica, quindi solo con il terminale, la funzione di copia-incolla non sarà abilitata di default dopo aver installato le guest additions. Sarà invece necessario installare alcuni pacchetti aggiuntivi.

root@vm:~$ apt x-window-system-core xclip

La nuova shell potrebbe utilizzare il layout della tastiera americano. Per cambiarlo, si può usare il comando setxkbmap.

user@vm:~$ setxkbmap it

Entrare nella nuova shell

Per poter verificare che tutto sia andato a buon fine, è necessario completare gli step successivi relativi all'installazione delle guest additions.

Abilitando la nuova shell con startx, sarà possibile copiare i testi dall'host ed incollarli nella VM con il tasto centrale del mouse (o premendo entrambi i tasti contemporaneamente).

user@vm:~$ startx

Inserire il disco delle guest additions

La .iso delle guest addition può essere scaricata dal sito ufficiale.
La versione da scaricare è quella che appare nella sezione Help > About VirtualBox.

Una volta scaricata, la .iso può essere inserta nella VM.

Guest additions iso

Montare ed installare

A questo punto è possibile montare il disco e installare le guest additions.

root@vm:~$ mkdir -p /mnt/cdrom
root@vm:~$ mount /dev/cdrom /mnt/cdrom

L'ultimo passaggio sarà quello di eseguire lo script di installazione

root@vm:~$ sh /mnt/cdrom/VBoxLinuxAdditions.run --nox11

Al prossimo riavvio, le guest additions saranno attive. Per verificare che siano installate, si può usare il comando lsmod.

root@vm:~$ lsmod | grep vbox
vboxsf                 81920  0
vboxguest              40960  1 vboxsf

Cartelle condivise

Una funzionalità molto comoda messa a disposizione da VirtualBox è la possibilità di condividere una cartella tra host e guest.

In questa modalità, una cartella presente sull'host sarà visibile anche sulla VM. In base alle impostazioni, sarà possibile leggere, scrivere o eseguire i file presenti, in modo che i cambiamenti siano visibili a tutte le macchine con accesso alla cartella.

Permessi

Per assicurarsi di avere i permessi per la gestione della cartella condivisa, sarà sufficiente aggiungere l'utente corrente alla lista degli utenti del gruppo vboxsf.

root@vm:~$ usermod -aG vboxsf user

Aggiungere una cartella condivisa

La cartella condivisa temporanea è una cartella che viene creata e distrutta ad ogni avvio della VM.

Per creare una cartella condivisa temporanea, bisogna andare nelle impostazioni della VM, nella sezione Shared Folders, e aggiungere una nuova cartella condivisa.

Shared folder

Opzioni

Le opzioni disponibili sono:

  • Folder Path: percorso della cartella dell'host da condividere
  • Folder Name: nome della cartella condivisa. Verrà usata per montarla nella VM
  • Mount Point: percorso della cartella in cui verrà montata la cartella condivisa. Va lasciato vuoto per il montaggio automatico
  • Read Only: rende la cartella condivisa in sola lettura per la VM
  • Auto-mount: prova a montare la cartella condivisa all'avvio della VM, in /media/sf_<folder name>
  • Make Permanent: rende la cartella condivisa permanente. Sarà disponibile anche dopo il riavvio della VM

Montaggio manuale

Se la cartella condivisa non viene montata automaticamente, è possibile farlo manualmente.

# Ci si assicura che il mount point sia un percorso valido
root@vm:~$ mkdir -p <mount point>
# Si monta la cartella condivisa
root@vm:~$ mount -t vboxsf -o uid=$UID <folder name> <mount point>

Questi passaggi dovranno essere ripetuti ad ogni avvio della VM.

Montaggio manuale all'avvio

Fare in modo che la cartella venga montata all'avvio della VM richiede qualche passaggio in più:

# Ottenere il proprio UID
user@vm:~$ echo $UID
# Editare il file /etc/fstab
root@vm:~$ nano /etc/fstab
# /etc/fstab
# Aggiungere la seguente riga, con le informazioni separate da un tab
<folder name>   <mount point>   vboxsf  uid=<$UID ottenuto prima>    0   0