Lab de passerelle NAT : masquerade et redirection de port avec nftables dans le navigateur

Un lab de réseau sur la traduction d’adresses : trois machines construites dans l’unique VM Ubuntu de l’élève, une machine privée sur 10.0.0.0/24, une passerelle et un serveur extérieur sur 203.0.113.0/24. La machine ne peut pas joindre le serveur, car l’extérieur n’a aucune route de retour vers une adresse privée : l’élève doit trouver pourquoi et le corriger sur la passerelle avec nftables.

Rien à installer ni de routeur à acheter : chaque machine est un espace de noms réseau, les vraies commandes fonctionnent, et le serveur extérieur répond à chaque requête avec l’adresse dont elle provient, si bien que l’élève voit ce que fait la traduction.

Ce que les élèves apprennent

Pourquoi une adresse privée ne peut pas servir sur internet et comment une passerelle parle pour les machines qui sont derrière elle : le masquerade, qui réécrit l’adresse source de ce qui sort, et la redirection de port, qui réécrit la destination de ce qui arrive pour que l’extérieur atteigne un service d’une machine privée. Ils lisent la table des connexions de la passerelle avec conntrack, observent un lien avec tcpdump, laissent passer le flux redirigé à travers un pare-feu qui bloque tout le reste sans l’ouvrir davantage, et enregistrent les règles pour qu’elles survivent à un redémarrage.

La topologie et la tâche

Une machine du réseau local avec une page web sur le port 80 et une page privée sur le port 8081, une passerelle avec un câble de chaque côté et un serveur extérieur sur le port 8000. Pour l’instant, la passerelle laisse seulement le réseau local initier des connexions et bloque le reste. L’élève fait en sorte que la machine locale joigne le serveur extérieur sous l’adresse extérieure de la passerelle, puis que la page web locale soit accessible de l’extérieur sur le port 8080, et rien d’autre. 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 proposent comme tâche de lab dans un module, et l’exemple se trouve sur la page du lab.

  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 exemples pour commencer. Choisissez NAT gateway: masquerade and port forwarding. 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 nftables et quelques outils réseau à partir de l’archive d’Ubuntu et construit les trois machines au premier démarrage de la VM, en une dizaine de secondes.
  4. Ouvrir le terminal. Ouvrez son terminal et lisez README.md dans le dossier personnel : il dit quoi faire et ne donne aucune réponse. netlab status liste les machines et netlab shell gw ouvre un shell dans la passerelle.

Une leçon de base sur ce lab

NAT Basics est une petite leçon qui se fait dans ce lab, qui est une VM Ubuntu : chaque étape est expliquée et accompagnée d’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, demande sa page au serveur extérieur et voit la requête expirer, lit les routes du serveur extérieur pour constater qu’il n’en a aucune vers une adresse privée, puis lit les règles de la passerelle pour voir qu’aucune ne traduit une adresse.

Elle se contente de regarder autour d’elle et laisse à l’élève la tâche propre du lab, le faire fonctionner, si bien que la leçon ne donne aucune réponse. Un compte personnel gratuit la reçoit dans le module Basics, qui se trouve sur l’« Accueil », chaque établissement peut la copier depuis le dossier Basics de la Bibliothèque, et un nouvel établissement l’a dans un module appelé Networking Basics (Sample). Elle est volontairement petite : elle montre à un enseignant ce qu’est une leçon qui se fait 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 démarrage à neuf : elle ne voit donc que ce que l’élève a enregistré dans /etc/nftables.conf, et elle note ce que fait le réseau, non la façon dont les règles sont écrites. Une requête de la machine locale doit atteindre le serveur extérieur, qui doit avoir vu l’adresse extérieure de la passerelle. Une requête de l’extérieur vers le port 8080 doit atteindre la page locale, qui doit avoir vu l’adresse propre du client : un proxy sur la passerelle ne réussit donc pas. La page privée et tous les autres ports doivent rester fermés, et la passerelle doit toujours bloquer ce qu’on ne lui a pas dit d’autoriser. Des règles saisies dans la passerelle en marche et jamais enregistrées ne réussissent pas, et la première ligne de ce que la vérification a affiché en donne la raison.

  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 ce que la vérification a affiché. Quand un élève arrête sa VM, la liste de la classe indique aussi ce qu’il a modifié, les paquets installés et les fichiers écrits : vous pouvez noter sans la démarrer. 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 que la plateforme exécute : taille, script d’installation, topologie, README et vérification. Il demande un processeur et 1 Go. Copiez-le et modifiez-le pour faire le vôtre.

Questions fréquentes

L’extérieur est-il le vrai internet ?
Non. L’extérieur est un espace de noms réseau dans la VM de l’élève, qui utilise 203.0.113.0/24, une plage réservée à la documentation. La VM elle-même n’atteint que l’archive de paquets d’Ubuntu, PyPI, npm et GitHub : un lab ne peut donc pas être dirigé vers un hôte d’internet.
Un élève peut-il utiliser les vraies commandes Linux ?
Oui, c’est le but. sudo ip netns exec gw nft list ruleset et sudo ip netns exec gw conntrack -L fonctionnent tels quels, et netlab shell gw est un raccourci.
Quelle est la différence entre le masquerade et une redirection de port ?
Le masquerade réécrit l’adresse source de ce qui sort du réseau privé, ce qui permet à l’hôte du LAN de joindre le serveur extérieur. Une redirection de port réécrit la destination de ce qui arrive, ce qui permet à l’extérieur de joindre un service d’un hôte privé. Le lab demande les deux, la redirection sur le port 8080.