Aufgabe 1 - NAT und TCP
Zunächst benötigen Sie die Datei nat_topo.py, die die Mininet-Topologie beinhaltet mit der wir arbeiten werden. Die Topologie besteht aus vier Hosts (h0 - h3), wovon h1, h2 und h3 sich jeweils hinter einem NAT-Router (nat1 und nat2) befinden. Starten Sie die Topologie in Mininet wie gewohnt mit:
sudo python nat_topo.py
Sie sollten nun die ihnen schon bekannte Mininet CLI vor sich haben. Das Netz was hier erzeugt wurde sieht wie folgt aus:
h0 ist für heute sowas wie ein Server im Internet und h1 ist in einem privaten Subnetz hinter dem NAT-Router nat1. h2 und h3 sind ebenfalls hinter einem NAT-Router (nat2). Fangen wir an, das Verhalten dieser Router zu untersuchen.
- Versuchen Sie mit Hilfe von
pingvon Hosth1aus die beiden Hostsh0undh2zu erreichen. Erklären Sie warum es klappt/bzw. nicht klappt (ein Blick auf die Topologie hilft sicherlich). - Starten Sie den Ihnen schon bekannten einfachen Webserver auf dem Host
h0mit:
h0 python3 -m http.server 80 &
Verbinden Sie sich nun auf nat1 und h1 (xterm h1 nat1). Starten sie Wireshark auf nat1 (wireshark &) und wählen Sie als Netzwerkschnittstelle zum Aufzeichnen die Schnittstelle mit dem Namen any, also alle verfügbaren Schnittstellen. Starten Sie die Aufzeichnung und kontaktieren Sie den eben gestarteten Webserver von h1 aus via:
`curl 10.0.0.1`
Schauen Sie sich in Wireshark an, wie der NAT-Router die Pakete verändert. Versuchen Sie anhand der Netzwerk-Topologie die Veränderungen nachzuvollziehen.
3. Jetzt nutzen wir eines der einfachsten, aber auch nützlichsten Netzwerk-Tools: Netcat (nc). Wie schon gesehen, kann man mit Netcat einfach TCP-Verbindungen aufbauen und über diese Daten transportieren. Daten braucht es aber gar nicht, um das Verhalten der NAT zu beobachten. Zunächst aber, starten wir einen Server, der TCP-Verbindungen auf dem Host im “Internet” (h0) annimmt.
nc -k -l 1234
Als nächstes verbinden wir uns von Host h1 aus mit diesem Server:
nc -q -1 10.0.0.1 1234
Wichtig ist dabei, dass -q -1 gesetzt ist, so dass die Verbindung bestehen bleibt! Jetzt schauen Sie sich den NAT-Tabelleneintrag zu dieser TCP-Verbindung auf nat1 an via:
conntrack -L
Sie sollten einen Eintrag wie diesen hier sehen:
tcp 6 431970 ESTABLISHED src=192.168.1.100 dst=10.0.0.1 sport=34016 dport=1234 src=10.0.0.1 dst=10.0.0.5 sport=1234 dport=34016 [ASSURED] mark=0 use=1
Dabei handelt es sich um das Protokoll (tcp), die Protokollnummer wie sie im dazugehörigen IP-Feld steht (6), der Timeout für den Eintrag in Sekunden (431970), den Zustand der TCP-Verbindung (ESTABLISHED), das Viertupel von Paketen Richtung Internet, wie Sie LAN-seitig ankommen und das Viertupel von Paketen aus dem Internet, wie sie WAN-seitig ankommen. Die Viertupel werden für das Muliplexen/Demultiplexen benötigt und für das Umschreiben der Pakete. Den Rest brauchen wir hier nicht. Fällt Ihnen etwas am Viertupel auf? Wurde der Quellport verändert?
Beenden Sie den nc-Client (und nur den Client, denn den Server benötigen wir noch) und schauen Sie danach gleich wieder in die NAT-Tabelle. Was fällt Ihnen auf? Welcher Eintrag hat sich verändert und warum?
- Wir wollen nun das Verhalten der NAT beobachten, wenn ein bereits vergebener Port auf dem NAT-Router verwendet wird. Dazu benötigen wir aber zwei Hosts im LAN. Deshalb wechseln wir nun zur
nat2und den Hostsh2undh3. Wir nutzen wieder Netcat und verbinden uns vonh2undh3mit jeweils den gleichen Quell-Ports, damit die NAT nicht einfach die Ports wiederverwenden kann. Dazu verbinden sie sich jeweils vonh2undh3mit dem eben gestarteten Server wie folgt:
nc -p 3456 -q -1 10.0.0.1 1234
Verbinden Sie sich mit nat2 und schauen Sie sich die NAT-Tabelle mit conntrack an. Erklären Sie sich die Ausgabe (insbesondere die Viertupel).