Oracle VirtualBox : comment accéder à une VM guest depuis l’OS hôte ?
Car puisque ce qui est évident pour nous autres les expérimentés, l’est parfois moins pour vous, alors je vous propose ma méthode pour assurer une accessibilité réseau bilatérale.
Principe de la démarche
On se propose de disposer d’une VM Linux Debian avec un accès Internet, et un accès à son OS hôte. Réciproquement, on souhaite que l’OS hôte ait accès à la VM, de façon à s’en servir de serveur. Par exemple de serveur de conteneurs Docker.
Implémentation
Soit à installer une VM Linux Debian dans Oracle VirtualBox, hyperviseur de type II installé lui-même sur mon Windows 10 Home, lui-même installé sur un ordinateur portable hp basique, qui dispose d’une interface réseau WiFi et d’une LAN (RJ45).Par défaut, l’installation de ma VM Linux Debian Buster a créé une interface locale 10.0.2.15, de passerelle 10.0.2.2 (pas très heureux comme choix, la tradition est de choisir le premier bit, soit 10.0.2.1).
Egalement par défaut, cette VM peut d’ores et déjà se connecter à l’Internet, via l’interface réseau virtuelle de type NAT (Network Address Translation), permettant à la VM de faire passer ses paquets IP par une adresse IP routable, et retour. Mais…cela n’est pas suffisant pour recevoir des connexions depuis l’OS hôte, car NAT c’est du“outgoing only” ! Il faudra donc déclarer dans VirtualBox, pour cette VM, une seconde interface réseau, de plein droit, puis la configurer dans Windows 10, dans les paramètres réseau.
Choix des paramètres réseaux
IP additionnelle VM, connue de l’OS hôte
Choisissons une IP pour notre seconde interface réseau, celle de plein droit. Arbitrairement, mais inspiré du système boot2docker, l’autre VM de mon labo qui utilise l’IP invité 192.168.99.100, je choisis l’IP 192.168.100.100.
Choisissons également une passerelle, 192.168.100.1, qui transmettra les paquets sortants de la VM vers Windows 10, et réciproquement.
nom d’hôte de ma VM: sodium, alias sodium-docker.
Nommer cette interface, dans un système de DNS, le plus simple étant hosts.
Sans perdre plus de temps, je déclare ces noms dans le _DNS fichier_ de Windows. Un vrai DNS serveur fonctionnerait aussi…
# Editer C:\WINDOWS\System32\drivers\etc\hosts (Windows 10), ou /etc/hosts sur Mac / Linux
# Ajouter le bloc ci-dessous
# Oracle VirtualBox
192.168.99.100 sodium-b2docker #boot2docker Linux Tiny Core
192.168.100.100 sodium sodium-docker
Déclaration de l’interface + passerelle
Je déclare donc ce système {interface, passerelle} à trois endroits, comme indiqué sur l’image du schéma d’implémentation ci-dessus :
1. Dans VirtualBox
Ctrl+S sur la VM concernée, puis onglet Réseau, sous-onglets Interfaces. Pour celà, il faut que la VM en question soit arrêtée. Aller dans le premier sous-onglet Interface libre, ici le n°2, et ajouter une interface de type VirtualBox Host-only Ethernet Adapter. Ce n’est pas ici que l’on déclarera l’IP. Nous allons le faire à l’étape suivante.
2. Dans /etc/network/interfaces de l’OS invité
Y déclarer les paramètres réseau ci-dessous.
Référence :
wiki.debian.org/NetworkConfiguration
(as root, or use sudo)
root@sodium:~$ cp -p /etc/network/interfaces /etc/network/interfaces-
root@sodium:~$ vi /etc/network/interfaces
allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.100.100
network 192.168.100.0
netmask 255.255.255.0
gateway 192.168.100.1
broadcast 192.168.100.255
:wq
# activer cette interface
root@sodium:~$ ifup enp0s8
3. Dans l’OS hôte Windows 10
Dans les paramètres réseau. J’ai renommé l’interface créée par VM en“Linux Debian Gwy”.
On notera qu’il n’y a pas besoin de déclarer une passerelle pour cette interface, car Windows 10 utilisera la passerelle de sa connexion WLAN ou LAN pour forwarder ces paquets vers le reste du réseau.
Test de connectivité Host OS => Guest OS
C:\Users\Fabien Haddadi>ping 192.168.100.100
Pinging 192.168.100.100 with 32 bytes of data:
Reply from 192.168.100.100: bytes=32 time<1ms TTL=64
Reply from 192.168.100.100: bytes=32 time<1ms TTL=64
Reply from 192.168.100.100: bytes=32 time<1ms TTL=64
Reply from 192.168.100.100: bytes=32 time<1ms TTL=64
En image…
Test de connectivité Guest OS => Host OS
fhaddadi@sodium:~$ ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=128 time=0.729 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=128 time=0.513 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=128 time=0.542 ms
64 bytes from 192.168.100.1: icmp_seq=4 ttl=128 time=0.560 ms
Un bridging Windows fait le reste. Ce mécanisme est fourni automatiquement par Windows. Son effet est que tout paquet IP à destination de sodium, ou sodium-docker, emprunte la passerelle
Test de connectivité Internet
fhaddadi@sodium:~$ ping mail.yahoo.com
PING edge.gycpi.b.yahoodns.net (77.238.180.12) 56(84) bytes of data.
64 bytes from e2.ycpi.vip.fra.yahoo.com (77.238.180.12): icmp_seq=1 ttl=49 time=25.5 ms
64 bytes from e2.ycpi.vip.fra.yahoo.com (77.238.180.12): icmp_seq=2 ttl=49 time=25.9 ms
64 bytes from e2.ycpi.vip.fra.yahoo.com (77.238.180.12): icmp_seq=3 ttl=49 time=26.4 ms
Exploitation de la VM
Fort de notre connectivité bilatérale entre VM et Host OS, nous pouvons désormais :
- utiliser l’utilitaire apt-get ou tout autre manager de packages sur la VM.
- nous connecter à cette VM par PuTTy over SSH, pour éviter d’utiliser la console native VirtualBox, un peu limitée.
- Servir des conteneurs !
Petit exemple de run d’un conteneur sur la VM Debian
On se propose, pour un PoC (Proof of Concept), de lancer un serveur web apache dans un conteneur géré par docker.
Mode opératoire
Loggé sur la VM en tant qu’utilisateur non-privilégié, mais membre du groupe sudo (utilisez usermod --gid pour ajouter un utilisateur à un groupe), isntaller docker si pas déjà fait.
Exemple : Pour Linux Debian, suivre la documentation officielle ici: docs.docker.com/engine/install
Puis lancer le conteneur httpd, qui écoute sur le port 8080 de l’IP en question, en utilisant la LdC (ligne de commande) ci-dessous :
sudo docker run -itd --ip=192.168.100.100 -p 8080:80 httpd
Vous devriez maintenant être en mesure de vous connecter à ce serveur web depuis l’OS hôte. Voir en image ci-dessous.
J’espère que ce tuto vous aura aidé. Moi en tout cas, il m’a.