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
ping
von Hosth1
aus die beiden Hostsh0
undh2
zu 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
h0
mit:
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
nat2
und den Hostsh2
undh3
. Wir nutzen wieder Netcat und verbinden uns vonh2
undh3
mit jeweils den gleichen Quell-Ports, damit die NAT nicht einfach die Ports wiederverwenden kann. Dazu verbinden sie sich jeweils vonh2
undh3
mit 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).