Dieses Praktikum beschäftigt sich mit der Sicherungsschicht, genauer, mit dem Address Resolution Protocol und mit der Funktionsweise von Switchen. Natürlich experimentieren wir wieder live mithilfe von Mininet. Darüber hinaus werden auch diesmal wieder Werkzeuge eingeführt, die die Vorgänge auf den Komponenten im Netz sichtbar machen und uns ein Beispiel anschauen, wo alles zusammenkommt, d.h wir schaunen uns an, was alles auf der Netzwerk- und Sicherungsschicht passieren muss, damit ein Paket von einem Subnetz in ein anderes vermittelt werden kann.

Den ARP Cache inspizieren

ARP ist eines dieser Protokolle, die leise im Hintergrund ihre Arbeit verrichten. Es ist auch einer dieser Plug ‘n Play Mechansimen die ohne Konfiguration einfach funktionieren. ARP ist das Protokoll, das zu einer gegebenen, aus dem lokalen Subnetz stammenden IP-Adresse die dazugehörige MAC-Adresse ermittelt. Es ist in der Sicherungsschicht verortet und hält lokal einen Cache, damit ARP nicht bei jedem Paket diesen Auflösungsprozess durchführen muss. Zum Glück gibt es eine einfache Möglichkeit sich diesen Cache anzeigen zu lassen, mit Hilfe des ip-Tools.

ip ist dabei ein sehr vielseitiges Tool und wir hatten es schon für die Manipulation der Weiterleitungstabelle und zum Anzeigen von lokal konfigurierten IP-Adressen eingesetzt. Wer nochmal eine generelle Einführung in ip benötigt kann hier nachschauen.

Heute geht es um die MAC-Adressen der Nachbarn und ip neighbor ist hier das ip-Subkommando, das wir einsetzen werden, um den ARP-Cache zu inzpizieren und zu manipulieren. In Kurzschreibweise reicht auch ip n. Im Grunde reichen uns zwei Einsatzarten von ip n. Einmal nur das ip n alleine, dass uns den ARP Cache anzeigt:

ip n
10.0.0.2 dev h1s1-eth0 lladdr 8e:d0:14:5c:76:8c REACHABLE
10.0.0.5 dev h1s1-eth0 lladdr 4a:ae:14:1b:e6:73 STALE

Hier im Cache findet man zum einen die Abbildung von IP-Adresse (aus dem eigenen Subnetz) auf MAC-Adresse. Z.B. sieht man, dass die IP-Adresse 10.0.0.2 auf die MAC-Adresse 8e:d0:14:5c:76:8c abgebildet wird (lladdr steht hier für link layer address, also Adresse der Sicherungsschicht). Auch sieht man bei diesem Eintrag einen Status am Ende. Dieser hier ist REACHABLE, d.h. erreichbar und damit gültig. Der zweite Eintrag ist STALE. Das bedeutet aber nicht, das dieser ungültig ist, sondern seit einer gewissen Zeit nicht benutzt wurde. Laut man page bedeutet STALE:

the neighbour entry is valid but suspicious. - also gültig aber irgendwie verdächtig...

Der Cache verrät uns auch, für welche Netzwerkschnittstelle (dev, device) der jeweilige Eintrag gültig ist. Hier ist es die Schnittstelle h1s1-eth0.

Zum anderen können wir mit ip n flush dev [device] den ARP Cache einer Netzwerkschnittstelle löschen. Der ARP Cache ist einer Netzwerkschnittstelle zugewiesen, weil diese in einem Subnetz liegt und dort die dazugehörigen MAC-Adressen relevant sind. Im obigen Fall löschen wir den Cache mit:

ip n flush dev h1s1-eth0

Die Switch-Tabelle ausgeben

In Mininet können wir auch mit den Switchen arbeiten. Ein Switch unterhält eine Switch-Tabelle, die MAC-Adressen auf Switch-Ports abbildet. Der Switch merkt sich also, hinter welchem Switch-Port, welche MAC-Adresse zu finden ist. Die Switch-Ports in Mininet entsprechen dabei ganz einfach den Schnittstellen der Switche. Hier stoßen wir aber leider ein wenig an die Grenzen der Virtualisierung durch Mininet, denn alle Switche werden zusammen verwaltet und auf jedem virtuellen Knoten ist erstmal jede Schnitstelle sichbar. Das sieht man, wenn man z.B. sich mit dem ip-Kommando alle Schnittstellen auf einem Switch ausgeben lässt. Dann sieht man z.B. die Schnittstellen aller Switche. Und sogar ausserhalb von Mininet (in einer anderen Konsole, in der Mininet nicht ausgeführt wird) kann man die Switche verwalten und ihre Einträge einsehen. Das ist aber erstmal OK und sogar ein wenig von Vorteil, denn die Kommandos, um Switch-Tabellen einzusehen, können auch ausserhalb von Mininet ausgeführt werden, was ein wenig komfortabler ist (dazu muss Mininet aber dennoch ausgeführt werden, damit die Switche überhaupt erzeugt werden).

Wir nutzen das Kommando brctl, um die MAC Adressen in den Switch-Tabellen sichtbar zu machen. Nachdem Mininet gestartet wurde, kann man sich ausserhalb von Mininet mit folgendem Kommando alle Switche anzeigen lassen:

brctl show
bridge name     bridge id               STP enabled     interfaces
s1              8000.4e7eddd4c782       no              s1-eth1
                                                        s1-eth2
                                                        s1-eth3
s2              8000.0629e7c28e95       no              s2-eth1
                                                        s2-eth2
                                                        s2-eth3
                                                        s2-eth4
s3              8000.3a76d84ecc46       no              s3-eth1
                                                        s3-eth2
                                                        s3-eth3
                                                        s3-eth4
s4              8000.daa05f4fef57       no              s4-eth1
                                                        s4-eth2
                                                        s4-eth3

Hier sieht man eine Liste von vier Switchen mit den Namen s1, s2, s3 und s4. Jeder Switch (auch Bridge genannt) hat eine eindeutige ID. STP steht für Spanning Tree Protocol, welches eingesetzt wird, wenn Switch-Topologien Schleifen enthalten. In der letzten Spalte sieht man die Schnittstellen, die dem jeweiligen Switch zugeordnet sind.

Um sich die Switch-Tabelle eines dieser Switche anzeigen zu lassen nutzt man wieder brctl:

brctl showmacs s1
port no mac addr                is local?       ageing timer
  1     00:00:11:00:00:11       no                 2.70
  3     00:00:11:00:00:44       no                 2.70
  3     4e:7e:dd:d4:c7:82       yes                0.00
  3     4e:7e:dd:d4:c7:82       yes                0.00
  2     86:57:a1:3a:7a:db       yes                0.00
  2     86:57:a1:3a:7a:db       yes                0.00
  1     e6:06:c2:90:d2:6a       yes                0.00
  1     e6:06:c2:90:d2:6a       yes                0.00

Der letzte Parameter (hier s1) ist dabei immer der Switch-Name des Switches, dessen Tabelle man ausgeben möchte. Jede Zeile entspricht dabei einem Weiterleitungseintrag, der MAC-Adresse auf Switch-Port abbildet, so, wie wir es in der Vorlesung kennengelernt haben. Man hier zwei Arten von MAC-Adressen: solche die lokal vergeben sind (is local? == yes), also die der Schnittstellen, die die Switch-Ports stellen und solche, die der Switch erlernt hat (is local? == no). Ersteres ist aber eine Linux-Bridge spezifische Eigenschaft, die wir herausfiltern werden. Bevor wir das tun, aber noch ein Blick auf die letzte Spalte. Hier sehen wir den aging timer. Da es sich um soft state handelt, also Zustand, der von keinem Protokoll explizit gemanaged wird, brauchen wir den Timer, um zu entscheiden, wann der Eintrag gelöscht werden kann. Wir filtern die lokalen Einträge (Spalte is local? == yes) indem wir die Ausgaben von brctl mit grep auf Zeilen reduzieren, die no enthalten. Das geht wie folgt:

brctl showmacs s1 | grep no
port no mac addr                is local?       ageing timer
  1     00:00:11:00:00:11       no                29.13
  3     00:00:11:00:00:44       no                29.13

Mit diesem Wissen gewappnet kann es losgehen.

Viel Erfolg!

Als erstes schauen wir uns ARP etwas genauer an. Die Topologie, mit der wird dazu arbeiten finden Sie hier. Es handelt sich dabei um vier in Reihe geschaltete Switche, die jeweil noch mit zwei Hosts verbunden sind. Die Switche sind mit s1, s2, s3 und s4 bezeichnet. Die Host folgen einer einfachen Nomenklatur, wobei es immer einen Host 1 und einen Host 2 pro Switch gibt, worauf der Name des verbunden Switches folgt. Also z.B. h1s1 entspricht Host 1, der mit Switch 1 verbunden ist, oder h2s4 entspricht Host 2, der mit Switch 4 verbunden ist. Auch die MAC-Adressen folgen einer einfachen Nomenklatur in dieser einfachen Topologie. Die ersten 24 Bit kodieren den Host, die letzten 24 Bit den Switch. Host 1 an Switch 2 hat damit folgende MAC-Adresse: 00:00:11:00:00:22.

Topologie

Untersuchen wir zunächst den ARP-Cache von Host h1s1 mit ip n auf dem Host. Er sollte leer sein. Das können wir ändern, indem wir einen einfachen Ping an h1s2 senden. Aber bevor wir das tun starten wir Wireshark auf Host h1s2 und beginnen die Aufzeichnung. Um dann den Ping zu schicken (drei Pakete) genügt folgedes Kommando auf der Mininet-Konsole:

h1s1 ping -c 3 h1s2

Einiges sollte auffallen. Zum einen sollte das erste Ping-Paket ungefähr doppelt so lange auf eine Antwort gewartet haben als alle folgenden. Das liegt daran, dass zunächst mittels ARP die MAC-Adresse von h1s2 aufgelöst werden musste. Das sollten Sie auch in Wireshark sehen. Auch kann jetzt der ARP-Cache von h1s1 wieder inspiziert werden. Nun sollte ein Eintrag vorhanden sein. Schauen wir uns ARP aber genauer in Wireshark an.

Am Protokollstapel des ARP-Pakets fällt auf, dass ARP direkt hinter dem Ethernet-Header kommt, d.h. es kommt kein IP-Header dazwischen. Muss es auch nicht, weil ARP nur im eigenen Subnetz funktionieren muss. Dazu braucht ARP aber einen eigenen Ethertype.

Auch fällt auf, dass die Ziel-MAC-Adresse die Broadcast-Adresse ist (FF:FF:FF:FF:FF:FF), die Antwort aber direkt geschickt wird, also nicht als Broadcast. Im ARP-Paket steht aber weit mehr als nur die IP-Adresse zu der die passende MAC-Adresse gesucht wird. So steht z.B. drin, um welche Art von MAC-Adresse es sich handelt, aber auch um welche Art von Netzwerkschicht Adressen, d.h. ARP ist entwickelt worden, um in dieser Hinsicht erweiterbar zu sein. Der ARP RFC RFC 826 sagt es eigentlich ganz schön:

"The world is a jungle in general, and the networking game contributes many animals. At nearly every layer of a network architecture there are several potential protocols that could be used."

Übringens, es gibt auch ein Tool, um mittels ARP ein "Ping" zu verschicken: arping

Starten Sie doch noch einmal Wireshark. Diesmal auf h1s4 und starten Sie die Aufzeichnung. Starten sie von h1s1 arping zu h1s4 aus der Mininet-Konsole via:

h1s1 arping h1s2

Fällt Ihnen an den ARP Paketen, ab dem zweiten Paket etwas auf? Wer im Netz empfängt diese alles?

Für diese Aufgaben nutzen wir die gleiche Topologie, diesmal sind aber schon mal alle ARP-Caches gefüllt.

Topologie

Schauen Sie sich die Topologie nochmal genau an. Sollten nun die folgenden Pakete geschickt werden (denken Sie dran, die ARP-Caches sind gefüllt), wie sehen die Switch-Tabellen danach aus?

h1s1 ping -c 1 h1s2
h1s4 ping -c 1 h1s3
h2s2 ping -c 1 h1s4

Denken Sie auch daran, dass das ping-Tool Pakete in beide Richtungen überträgt.

Versuchen Sie die Inhalte der Switch-Tabellen zunächst auf Papier aufzuschreiben und verifizieren Sie Ihre Ergebnisse anhand der echten Switch-Topologie, die Sie hier finden.

In der Vorlesung haben wir an einer einfachen Topologie mit einem Router, zwei Switchen und 4 Hosts kennengelernt, was alles passieren muss, damit ein Paket von einem Host, über den Router zu einem anderen Host im anderen Subnetz gesendet werden kann. In der Mininet-Topologie, die Sie hier finden, ist dieses Netz nachgebaut. Starten sie es und starten Sie Wireshark auf dem Router. Finden Sie selbst heraus wie dieses Netz aufgebaut ist (mit den Befehlen der Mininet-Konsole). Sie könnnen auch die ARP-Caches und Switch-Tabellen inspizieren. Jetzt starten Sie die Aufzeichnung mit Wireshark auf dem any-Interface (also auf allen Schnittstellen des Routers). Senden Sie ein paar (also mehr als eins) ping-Pakete von Host h1 zu Host h3 und schauen Sie sich genau an was alles passiert und wie die Pakete aufgebaut sind. Insbesondere schauen Sie sich an, welche MAC-Adressen und IP-Adressen in den Paketen verwendet werden.

(Hinweis: Wenn Sie auf mehr als einer Schnittstelle mit Wireshark aufzeichnen, dann wird der Ethernet-Header nicht komplett dargestellt. Die genutzten MAC-Adressen erfahren Sie aus den ARP-Paketen, bzw. Sie können das Experiment zwei mal durchführen, und sich jeweils nur eine Schnittstelle des Routers vornehmen).

Jetzt wo alle Praktika abgeschlossen sind schauen Sie sich alle Protokolle nochmal im Gesamtzusammenhang an. Also überlegen Sie sich z.B. welche Protokolle in welcher Reihenfolge was machen müssen, wenn z.B. eine Rechner neu dem Netz beitritt und mittels HTTP die Basis-HTML-Datei von www.example.com anfragt.

Ich würde mich über Ihre Kritik und Verbesserungsvorschläge freuen. Auch Lob, klar. Eine kurze Umfrage finden Sie hier.