NAT-Gateway-Lab: Masquerading und Portweiterleitung mit nftables im Browser

Ein Netzwerk-Lab zur Network Address Translation: drei Maschinen, aufgebaut in der einen Ubuntu-VM der lernenden Person, ein privater Host in 10.0.0.0/24, ein Gateway und ein externer Server in 203.0.113.0/24. Der Host erreicht den Server nicht, weil die Außenwelt keine Route zurück zu einer privaten Adresse hat, und die lernende Person muss herausfinden, warum, und es mit nftables auf dem Gateway beheben.

Nichts zu installieren und kein Router zu kaufen: Jede Maschine ist ein Netzwerk-Namespace, die echten Befehle funktionieren, und der externe Server beantwortet jede Anfrage mit der Adresse, von der er sie kommen sah, sodass die Lernenden sehen, was die Übersetzung bewirkt.

Was die Lernenden lernen

Warum eine private Adresse im Internet nicht verwendet werden kann und wie ein Gateway für die Maschinen dahinter spricht: Masquerading, das die Quelladresse dessen umschreibt, was hinausgeht, und eine Portweiterleitung, die das Ziel dessen umschreibt, was ankommt, damit die Außenwelt einen Dienst auf einem privaten Host erreichen kann. Die Lernenden lesen die Verbindungstabelle des Gateways mit conntrack, beobachten eine Verbindung mit tcpdump, lassen den weitergeleiteten Verkehr durch eine Firewall, die alles andere verwirft, ohne sie weiter zu öffnen, und speichern das Regelwerk, damit es einen Neustart übersteht.

Die Topologie und die Aufgabe

Ein LAN-Host mit einer Webseite auf Port 80 und einer privaten Seite auf Port 8081, ein Gateway mit einem Kabel zu jeder Seite und ein externer Server auf Port 8000. Derzeit lässt das Gateway nur das LAN Verbindungen aufbauen und verwirft den Rest. Die lernende Person sorgt dafür, dass der LAN-Host den externen Server unter der äußeren Adresse des Gateways erreicht, und macht dann die LAN-Webseite von außen auf Port 8080 erreichbar, und sonst nichts. Die Adressen stehen in der README, die das Lab im Home-Verzeichnis hinterlässt und die sagt, was zu tun ist, und keine der Lösungen verrät.

Im Browser ausführen

VM-Labs werden als Lab-Aufgabe in einem Modul gestellt, und das Beispiel steht auf der Seite des Labs.

  1. Lab hinzufügen. Fügen Sie in einem Modul, das Sie unterrichten, eine Aufgabe hinzu und wählen Sie die Karte „Ubuntu-VM-Lab“. Die Seite zeigt statt einer Compose-Datei eine kurze Beschreibung der Maschine.
  2. Vom Beispiel ausgehen. Die Seite bietet Beispiele als Ausgangspunkt an. Wählen Sie „NAT-Gateway: Masquerading und Portweiterleitung“. Ein Beispiel zu verwenden ersetzt den Text, und „Rückgängig“ bringt Ihren zurück.
  3. Veröffentlichen und eine eigene Kopie starten. Veröffentlichen Sie, dann „Starten“. Das Einrichtungsskript des Labs installiert beim ersten Start der VM nftables und einige Netzwerkwerkzeuge aus dem Archiv von Ubuntu und baut die drei Maschinen auf, in etwa zehn Sekunden.
  4. Terminal öffnen. Öffnen Sie sein Terminal und lesen Sie README.md im Home-Verzeichnis: Sie nennt, was zu tun ist, und verrät keine der Lösungen. netlab status listet die Maschinen auf, und netlab shell gw öffnet eine Shell im Gateway.

Eine Basics-Lektion zu diesem Lab

NAT Basics ist eine kleine Lektion, die in diesem Lab durchgearbeitet wird, einer Ubuntu-VM: Jeder Schritt ist erklärt und hat eine Schaltfläche „Ausführen“, die ihren Befehl in das Terminal der Maschine tippt und zeigt, was ausgegeben wurde. Lernende lernen die Maschinen kennen, fragen den externen Server nach seiner Seite und sehen die Anfrage in eine Zeitüberschreitung laufen, lesen die Routen des externen Servers und sehen, dass er keine für eine private Adresse hat, und lesen die Regeln des Gateways und sehen, dass nichts darin eine Adresse übersetzt.

Die Lektion sieht sich um und überlässt die eigentliche Aufgabe des Labs, es zum Laufen zu bringen, den Lernenden, sie verteilt also keine Lösungen. Ein kostenloses persönliches Konto bekommt die Lektion im Modul Basics auf der Startseite, jede Einrichtung kann sie aus dem Basics-Ordner der Bibliothek kopieren, und eine neue Einrichtung beginnt mit ihr in einem Modul namens Networking Basics (Sample). Sie ist absichtlich klein: Sie zeigt Lehrkräften, was eine in einem Lab durchgearbeitete Lektion ist, und das Lab erledigt den Rest. Kopieren Sie sie in ein eigenes Modul, um sie zu ändern.

Wie bewertet wird

Das Lab hat eine Prüfung. Sie läuft nach einem frischen Start auf einer Kopie der gespeicherten Maschine und sieht daher nur, was die lernende Person in /etc/nftables.conf gespeichert hat, und sie bewertet, was das Netzwerk tut, nicht, wie die Regeln geschrieben sind. Eine Anfrage vom LAN-Host muss den externen Server erreichen, der die äußere Adresse des Gateways gesehen haben muss. Eine Anfrage von außen an Port 8080 muss die LAN-Seite erreichen, die die eigene Adresse des Clients gesehen haben muss, ein Proxy auf dem Gateway besteht also nicht. Die private Seite und jeder andere Port müssen geschlossen bleiben, und das Gateway muss weiterhin verwerfen, was nicht ausdrücklich erlaubt wurde. In das laufende Gateway getippte und nie gespeicherte Regeln bestehen nicht, und die erste Zeile der Ausgabe der Prüfung sagt, warum.

  1. Zuweisen. Weisen Sie das Lab wie jede Aufgabe zu, auf Wunsch mit Fälligkeitsdatum. Jede lernende Person erhält eine eigene VM, die zwischen den Sitzungen erhalten bleibt.
  2. Prüfung ausführen. Klicken Sie in der Zeile einer lernenden Person in der Klassenliste auf „Prüfung ausführen“. Das startet eine Kopie ihrer gespeicherten Maschine, die nicht zurückgespeichert wird, führt das Prüfskript des Labs als root aus und zeigt, ob es bestanden wurde, was es ausgegeben hat und wann. Die lernende Person erfährt das Ergebnis nicht.
  3. Bewerten. Lesen Sie, was die Prüfung ausgegeben hat. Wenn eine lernende Person ihre VM stoppt, zeigt die Klassenliste außerdem, was sie geändert hat, die installierten Pakete und die geschriebenen Dateien, sodass Sie bewerten können, ohne die VM zu starten. Geben Sie die Arbeit mit einer Begründung zur Überarbeitung zurück, wenn mehr nötig ist.

Die Definition auf GitHub

Die Datei ist die gesamte Lab-Definition, derselbe Text, den die Plattform ausführt: Größe, Einrichtungsskript, Topologie, README und Prüfung. Sie verlangt eine CPU und 1 GB. Kopieren Sie sie und ändern Sie sie, um ein eigenes Lab zu erstellen.

Häufige Fragen

Ist die Außenwelt das echte Internet?
Nein. Die Außenwelt ist ein Netzwerk-Namespace in der VM der lernenden Person mit 203.0.113.0/24, einem für Dokumentation reservierten Bereich. Die VM selbst erreicht nur das Paketarchiv von Ubuntu, PyPI, npm und GitHub, ein Lab lässt sich also nicht auf einen Host im Internet richten.
Können Lernende die echten Linux-Befehle verwenden?
Ja, das ist der Sinn. sudo ip netns exec gw nft list ruleset und sudo ip netns exec gw conntrack -L funktionieren wie geschrieben, und netlab shell gw ist eine Abkürzung.
Was ist der Unterschied zwischen Masquerading und einer Portweiterleitung?
Masquerading schreibt die Quelladresse dessen um, was das private Netzwerk verlässt, damit der LAN-Host den externen Server erreichen kann. Eine Portweiterleitung schreibt das Ziel dessen um, was ankommt, damit die Außenwelt einen Dienst auf einem privaten Host erreichen kann. Das Lab verlangt beides, mit der Weiterleitung auf Port 8080.