Lab WireGuard : construire un tunnel VPN entre deux sites dans le navigateur

Ce lab donne à chaque élève deux petits sites à relier. Quatre machines sont construites dans l’unique VM Ubuntu de l’élève : un hôte et une passerelle sur chaque site, les deux passerelles étant reliées par un lien qui figure Internet et ne connaît aucun des deux réseaux privés. L’élève construit un tunnel WireGuard entre les passerelles, jusqu’à ce qu’un hôte d’un site puisse envoyer un ping à un hôte de l’autre.

Rien n’est installé sur l’ordinateur de l’élève et aucun équipement VPN n’est nécessaire : chaque hôte et chaque passerelle est un espace de noms réseau, et le tunnel est le vrai WireGuard fourni par le noyau d’Ubuntu, avec les vraies commandes wg et wg-quick.

Ce que les élèves apprennent

Comment un tunnel VPN relie deux réseaux privés : créer une paire de clés sur chaque passerelle avec wg genkey et wg pubkey, et pourquoi une clé privée ne doit être lisible par personne d’autre ; écrire wg0.conf avec une adresse pour le tunnel, le pair de chaque passerelle et les réseaux qui peuvent lui être envoyés ; monter le tunnel et lire wg show pour voir l’échange de clés (handshake) ; et faire passer les deux réseaux par le tunnel. Ils observent le lien Internet avec tcpdump et voient que ce qui le traverse est de l’UDP chiffré, et ils font revenir le tunnel à partir de ses fichiers enregistrés après un redémarrage.

La topologie

Le site A est l’hôte a1 sur 10.1.0.0/24 derrière la passerelle gwA, et le site B est l’hôte b1 sur 10.2.0.0/24 derrière la passerelle gwB. Les passerelles sont reliées par 203.0.113.0/24, Internet, qui n’a de route vers aucun des deux réseaux privés et ne doit jamais en recevoir. Un ping de a1 vers b1 échoue tant que le tunnel n’est pas construit. Les fichiers WireGuard de chaque passerelle sont dans son propre /etc/wireguard, c’est-à-dire /etc/netns/gwA/wireguard et /etc/netns/gwB/wireguard sur la VM. Les adresses figurent dans le README que le lab laisse dans le dossier personnel, qui dit quoi faire et ne donne aucune réponse.

Le lancer dans votre navigateur

Les labs VM se donnent comme tâche de lab dans un module, et l’exemple se trouve sur la page du lab. La machine est petite : un processeur, 1 Go de mémoire et 10 Go de disque.

  1. Ajouter le lab. Dans un module que vous enseignez, ajoutez une tâche et choisissez la carte « Lab VM Ubuntu ». La page affiche une courte description de la machine au lieu d’un fichier compose.
  2. Partir de l’exemple. La page propose des labs prêts à l’emploi pour commencer. Choisissez WireGuard tunnel. Utiliser un exemple remplace le texte, et « Annuler » rétablit le vôtre.
  3. Publier et démarrer votre propre copie. Publiez, puis « Démarrer ». Le script d’installation du lab installe wireguard-tools et tcpdump à partir de l’archive d’Ubuntu, et écrit la commande wglab et le README au premier démarrage de la VM, en quelques secondes.
  4. Ouvrir le terminal. Ouvrez son terminal et lisez README.md dans le dossier personnel : il indique ce qu’il faut construire et ne donne aucune réponse.

Une leçon de base sur ce lab

WireGuard Basics est une petite leçon travaillée dans ce lab, qui est une VM Ubuntu : chaque étape est expliquée et a un bouton Exécuter qui tape sa commande dans le terminal de la machine et montre ce qu’elle a affiché. L’élève découvre les machines, envoie un ping à l’hôte distant et reçoit Destination Net Unreachable, lit les deux routes de la passerelle pour comprendre pourquoi, et constate que wg show n’affiche rien parce qu’il n’y a pas encore de tunnel.

La leçon regarde autour d’elle et laisse à l’élève la tâche propre du lab, construire le tunnel, donc elle ne donne aucune réponse. Elle est volontairement petite : elle montre à l’enseignant ce qu’est une leçon travaillée dans un lab, et le lab fait le reste. Copiez-la dans un module à vous pour la modifier.

Comment il est noté

Le lab a une vérification. Elle s’exécute sur une copie de la machine enregistrée après un redémarrage à neuf, donc elle ne voit que ce que l’élève a enregistré dans le wg0.conf de chaque passerelle, et elle ne réussit que si l’état réel tient : les configurations ne sont lisibles que par leur propriétaire, chacune désigne la clé publique de l’autre passerelle, les deux passerelles ont un échange de clés récent, un ping entre les hôtes fait passer des octets par le tunnel, et une capture sur le lien Internet ne montre que de l’UDP et aucune adresse privée. Une simple route statique entre les deux réseaux ne réussit pas, ni un tunnel monté à la main et jamais enregistré, et la première ligne de ce que la vérification a affiché dit pourquoi.

  1. Le distribuer. Attribuez le lab comme n’importe quelle tâche, avec une échéance si vous le souhaitez. Chaque élève reçoit sa propre VM, conservée d’une session à l’autre.
  2. Lancer la vérification. Sur la ligne d’un élève dans la liste de la classe, appuyez sur « Lancer la vérification ». Elle démarre une copie de sa machine enregistrée, sans rien enregistrer en retour, exécute le script de vérification du lab en root et indique s’il a réussi, ce qu’il a affiché et quand. L’élève n’est pas informé du résultat.
  3. Noter. Lisez la première ligne de ce que la vérification a affiché : elle dit ce qui n’est pas correct, par exemple une clé que tout le monde peut lire ou un ping qui n’est pas passé par le tunnel. Renvoyez le travail avec un motif s’il demande un complément.

La définition sur GitHub

Le fichier est la définition complète du lab, le même texte que celui exécuté par la plateforme : taille, script d’installation, outil de topologie, README et vérification. Copiez-le et changez les adresses, ou ajoutez un troisième site, pour faire un lab plus long.

Questions fréquentes

Le lab demande-t-il un équipement VPN ou une licence ?
Non. WireGuard est un logiciel libre, et le tunnel est fait par le module du noyau d’Ubuntu avec le paquet wireguard-tools, installé depuis l’archive d’Ubuntu au démarrage de la VM de l’élève. Nous n’en distribuons rien.
Un élève peut-il joindre le vrai Internet depuis le lab ?
Non. La VM ne joint que l’archive d’Ubuntu, PyPI, npm et GitHub, et rien d’autre, et « l’Internet » entre les deux sites est un lien virtuel à l’intérieur de la VM : le tunnel relie donc deux sites qui sont dans la même machine.
Comment le lab WireGuard est-il noté ?
La vérification s’exécute sur une copie de la machine enregistrée après un démarrage à neuf. Chaque wg0.conf doit être lisible par son propriétaire seul et nommer la clé publique de l’autre passerelle, les deux passerelles doivent avoir une poignée de main récente, et un ping entre les hôtes doit faire passer des octets par le tunnel. Une simple route statique ne passe pas.