Mit diesem Praktikum verlassen wir die Transportschicht und begeben uns eine Schicht tiefer, in die Netzwerkschicht. Das zentrale Protokoll der Netzwerkschicht ist IP und die beiden Hauptfunktionen in der Netzwerkschicht sind Weiterleitung und Routing. In diesem Praktikum wir es um die Weiterleitung gehen. Wie auch schon beim letzten mal werden wir Mininet einsetzen, um ein Netzwerk zu konstruieren, in dem wir arbeiten können.

Auch heute wird wieder ein Werkzeug eingeführt, mit dem sich ein Großteil der Hauptnetzwerkeinstellung unter Linux konfigurieren lassen und dieses Tool heißt ip. Wir werden aber nur einen Bruchteil von ips Funktionen kennenlernen und zwar die, die sich mit der Weiterleitungstabelle beschäftigen.

ip

Ein zentrales Kommandozeilenwerkzeug um diverse Netzwerkeinstellungen vorzunehmen ist ip. Der generelle Aufbau eines Aufrufs von ip sieht wie folgt aus:

ip [ OPTIONS ] OBJECT { COMMAND | help }

ip kann auf verschiedene Objekte (OBJECT) angewandt werden. Ein Objekt ist dabei so etwas wie eine Kategorie oder ein Aspekt der Netzwerkkonfiguration, die angepasst oder ausgegeben werden soll. Die wohl wichtigsten Objekte sind:

Es gibt wesentlich mehr Objekte, aber in diesem Praktikum werden wir hauptsächtlich mit den ersten beiden arbeiten. Die anderen beiden werden wir noch in einem späteren Praktikum verwenden. Objekte kann man auch abkürzen. Das Objekt, das in lexikographischer Ordnung als erstes auf die Abkuerzung passt wird dann gewählt. Hier ein einfaches Beispiel dazu. Um sich die IP-Adressen aller Netzwerkschnittstellen anzeigen zu lassen, kann man folgendes ip-Kommando nutzen:

ip address

oder abgekürzt ginge auch einfach:

ip a

Die Ausgabe koennte wie folgt aussehen:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:a2:01:04:3e brd ff:ff:ff:ff:ff:ff
    inet 1.2.3.4/24 brd 1.2.3.255 scope global dynamic ens3
       valid_lft 43939sec preferred_lft 43939sec
    inet6 2a01:1111:2222:3333::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::453:11:fe01:12/64 scope link 
       valid_lft forever preferred_lft forever

Vieles davon kennen wir aus der Vorlesung. Hier abgebildet sind zwei Netzwerkschnittstellen. Die erste ist das nur lokal verfügbare Loopback-Interface (lo). Die Adressen die hier vergeben sind, sind Teil der speziellen Adressen, die wir schon kennegelernt haben. Die "echte" Netzwerkschnittstelle hier hat den Namen ens3 und eine IPv4 Adresse ist konfiguriert, sowie wie zwei IPv6 Adressen.

In diesem Kommando war keine Option gesetzt. Diese werden dem Objekt vorangestellt. So kann man z.B. eine farbiges Highlighting via Optionen mit -c einstellen, oder man kann sich Statistiken anzeigen lassen mit -s. Das vorherige Kommando dazu sähe dann so aus:

ip -c -s a

Probieren Sie es mal aus. Der Zustand der Schnittstellen sollte nun farbig hervorgehoben sein, sowie die IP-Adressen. Ausserdem sollten Statistiken angezeigt werden (z.B. Anzahl der gesendeten und empfangenen Bytes/Pakete). Es gibt weiter Optionen, wovon wir aber nur wenige einsetzen werden. Mit man ip können alle verfügbaren Optionen eingesehen werden. Schauen Sie mal nach, was es sonst noch so gibt.

Schauen wir uns nochmal den generellen Aufbau eines Aufrufs von ip an:

ip [ OPTIONS ] OBJECT { COMMAND | help }

OPTIONS und OBJECT haben wir nun grob besprochen. Was noch fehlt ist entweder der COMMAND-Teil bzw. help. Das, was im Kommando folgen kann ist abhängig vom Objekt, d.h. jedes Objekt hat seinen eigenen Satz an Kommandos. Diese kann man sich z.B. mit help anzeigen lassen. Nehmen wir das address-Objekt nochmal als Beispiel:

ip a help
Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]
                                                      [ CONFFLAG-LIST ]
       ip address del IFADDR dev IFNAME [mngtmpaddr]
       ip address {save|flush} [ dev IFNAME ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]
       ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]
                         [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]
                         [ label LABEL ] [up] [ vrf NAME ] ]
       ip address {showdump|restore}
IFADDR := PREFIX | ADDR peer PREFIX
          [ broadcast ADDR ] [ anycast ADDR ]
          [ label IFNAME ] [ scope SCOPE-ID ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG  := [ permanent | dynamic | secondary | primary |
           [-]tentative | [-]deprecated | [-]dadfailed | temporary |
           CONFFLAG-LIST ]
CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG
CONFFLAG  := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]
LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]
LFT := forever | SECONDS
TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
          gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |
          nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |
          hsr | macsec

Wem das zu kryptisch ist, der kann auch für die man pages für die einzelnen Objekte anschauen. Dabei verbindet man ip durch einen Bindestrich mit dem jeweiligen Objekt und erhält so den Namen der man page (die Abkürzungen funktionieren hier natürlich nicht):

man ip-address

Da es heute um die Weiterleitung geht, brauchen wir aber das route-Objekt. Das zu route gehörige Kommando kann sehr komplex sein, denn Linux is diesbezüglich sehr mächtig. Wie brauchen heute aber nur die Funktionen, um selbst Einträge in die Weiterleitungstabelle einzutragen oder zu löschen, wenn mal Fehler gemacht wurden. Auch das Anzeigen der Tabelle wird benötigt, aber die "Power-Feature", die Linux uns bereitstellt, werden wir nicht benötigen.

Der grundsätzliche Aufbau zur Manipulation der Weiterluntungstabelle sieht so aus:

ip route { add | del | change | append | replace } ROUTE

Von den hier abgebildeten Kommandos brauchen wir primär add, um einen Eintrag hinzuzufügen, und wenn etwas schief geht noch del um einen Eintrag wieder zu löschen. Was sich hier so harmlos als ROUTE anschliesst, kann ebenfalls sehr komplex werden. Aber auch hier brauchen wir nur ganz einfache Varianten.

Beispielnetzwerk

Nehmen wir an, dass wir das oben abgebildete Netzwerk vorliegen haben. Wir sind auf Router R1 eingeloggt und wollen einen Eintrag in seiner Weiterleitungstabelle vornehmen, so dass Pakete für das Subnetz 192.0.2.0/24 vermittelt werden können. Man sieht in der Abbildung den Router, der das Paket als nächstes bekommen soll, dann den Rest des Netzes als Wolke dargestellt und dann am Ende das Zielsubnetz. Auf Router R1 müsste dieser Eintrag wie folgt angelegt werden:

ip route add 192.0.2.0/24 via 10.0.0.1

Optional kann auch noch die Netzwerkschnittstelle angegeben werden. Dazu wird einfach dev ifname anghängt, wobei ifname durch den Namen der Netzwerkschnittstelle ersetzt wird. Die Namen der Schnittstellen können z.B. durch ip a ermittelt werden, wie wir vorhin gesehen haben.

In der Vorlesung hatten wir noch einen speziellen Eintrag in der Weiterleitungstabelle kennengelernt, die Default Route. Diese ist 0.0.0.0/0, und wird z.B. von Endsystemen genutzt.

Löschen kann man ebenfalls einen Eintrag. Dazu muss nur der zu löschende IP-Präfix angegeben werden:

ip route del 192.0.2.0/24

Man kann auch herausfinden wohin ein Paket mit einer Zieladresse weitergeleitet werden würde:

ip route get 192.0.2.12

Hier wird der Eintrag ausgegeben, der genutzt wird, um ein Paket mit der Ziel-IP-Adresse 192.0.2.12 weiterzuleiten.

Die Weiterleitungstabelle kann man natürlich auch im Ganzen anzeigen lassen mit:

ip route

Damit ist alles, was von ip für das Praktikum benötigt wird erläutert. Es kann also losgehen.

Viel Erfolg!

Das letzte mal haben wir mit Mininet gearbeitet. Heute benutzen wir es wieder, aber mit einer komplexeren Topologie, die darüber hinaus nicht das tut, was sie tun sollte: es fehlen Weiterleitungstabelleneinträge in den Hosts und den Routern. In der Datei router_topo.py ist eine Netzwerktopologie vorbereitet, mit der wir heute arbeiten werden. Diese sieht so aus:

Topologie

Um Mininet mit dieser Topologie zu starten, müssen wir diesmal die gerade heruntergeladene Datei ausführen und zwar so:

sudo python3 router_topo.py

Hinweis: evtl. kann hier auch einfach nur python anstelle von python3 benutzt werden, je nach Linux-Distribution.

Sie sollten nun die ihnen schon bekannte Mininet CLI vor sich haben.

Bevor wir aber mit den Aufgaben starten, hier noch ein Hinweis. Sie werden für die Aufgaben auf Routern und Hosts nachschauen müssen, ob Pakete ankommen, oder nicht. Dazu können Sie natürlich Wireshark öffnen. Aber mit vielen Wireshark-Fenstern und dem GUI-Overhead dauert dies typischerweise unnötig lange. Es gibt aber ein Programm, das auch auf der Kommandozeile die Pakete anzeigt, die ankommen und gesendet werden: tcpdump. Starten Sie tcpdump so, damit alle Netzwerkschnittstellen aufgezeichnet werden (was beim Router evtl. nützlich ist, da hier mehrere schnittstellen vorhanden sind):

tcpdump -i any

Auf einem Host müsste auch nur

tcpdump

ausreichen.

Damit kann es jetzt aber richtig losgehen!

  1. Gehen Sie auf einen beliebigen Host (z.B. mit xterm oder zentral durch die Mininet CLI, wenn Sie vergessen haben wie das geht, schauen Sie sich nochmal die Vorbereitung zum vorheringen Praktikum an) und geben sie einfach ip route ein, um sich die Routing-Tabelle anzusehen. Wofür ist der vorhandene Eintrag in der Routingtabelle? Wiederholen Sie dies auf einem beliebigen Router. Wieviele und welche Einträge sind hier vorhanden und warum?
  2. Versuchen Sie einen Ping von Host 3 an die folgenden Adressen zu senden (ping <IP-Adresse>): 223.1.2.1 223.1.9.2 223.1.9.1 Versuchen Sie zu erklären, warum welche Adressen funktionieren und warum die anderen nicht funktionieren! Dazu koennen Sie sich auch auf die Router verbinden und schauen, ob die Ping Pakete überhaupt ankommen (mit tcpdump z.B.).
  3. Fügen Sie bei Host 3 nun mit Hilfe vom ip-Kommando eine Default-Route hinzu (0.0.0.0/0) und pingen Sie folgenden Adressen erneut von Host 3 aus an: 223.1.2.1 223.1.9.2 223.1.9.1 Auch hier schauen Sie, ob die Ping-Pakete ankommen, oder nicht. Versuchen Sie zu erklären, warum welche Adressen jetzt funktionieren und warum die anderen nicht funktionieren!
  4. Fügen Sie dem Router R1 einen Eintrag in die Weiterleitungstabelle hinzu, so dass alle diese drei Pings vom Host H3 funktionieren.
  5. Vervollständigen Sie alle Routing-Tabellen, so dass ein pingall in der Mininet-CLI anzeigt, dass jeder Konten jeden anderen anpingen kann. Wenn noch nicht alles funktioniert, dann kann pingall etwas dauern. Sie können pingall mit Strg-C aber jederzeit abbrechen.

In der Vorlesung haben wir das Longest Prefix Matching kennengelernt. Jetzt aggregieren wir Eintäge in der Weiterletungstabelle, d.h. aus einer gegebenen Tabelle, versuchen wir Einträge zusammenzufassen, um möglichst wenige Einträge zu erhalten, ohne, dass wir die Weiterleitung der Pakete dadurch beeinflussen!

Prinzipiell können zwei Präfixe aggregiert werden, wenn Sie:

  1. den gleichen next hop haben, also an den gleichen Router weitergeleitet werden. Nur wenn dies der Fall ist werden nach dem Aggregieren alle Pakete weiterhin zum gleichen Router weitergeleitet.
  2. zusätzlich einen zusammenhängenden Adressraum bilden. Das tun sie grundsätzlich, wenn der eine Präfix den anderen komplett beinhaltet, also z.B. 192.168.0.0/24 ist komplett im IP-Praefix 192.0.0.0/8 enthalten. Wenn dies nicht der Fall ist, dann bilden zwei Präfixe einen zusammenhängenden Adressraum, wenn ihre Praefixlängen gleich sind und sie sich nur im letzten Bit Ihres Netzteils unterscheiden. Hier ein Beispiel:

Präfix

Next hop

10.0.0.0/24

192.168.1.4

10.0.1.0/24

192.168.1.4

Die oben gezeigten Präfixe (links in der Tabelle) haben beide den gleichen next hop (rechts in der Tabelle) und unterscheiden sich nur im 24. Bit, daher können diese zu 10.0.0.0/23 aggrgiert werden. Dieses Vorgehen lässt sich auf eine 2 hoch n Anzahl von Präfixen erweitern, d.h. 4, 8, 16, 32 usw. Diese lassen sich zusammenfasseen wenn alle 2 hoch n Präfixe die gleiche Präfixlänge haben und sich ihr Netzteil nur in den letzten n Bit unterscheiden. Dann könnten z.B. 16 zusammenhängende /24 zu einem /20 aggregiert werden.

Hier Ihre Aufgabe. Agreggieren Sie die unten gezeigte Tabelle so weit es möglich ist, d.h. minimieren Sie die Anzahl der Einträge in der Tabelle:

Präfix

Next hop

10.0.64.0/20

192.168.1.4

10.0.128.0/20

192.168.1.4

10.1.0.0/20

192.168.1.4

10.2.0.0/20

192.168.1.4

10.2.16.0/20

192.168.1.222

10.3.0.0/20

192.168.2.2

10.3.16.0/20

192.168.2.2

10.4.0.0/23

192.168.3.1

10.4.2.0/23

192.168.3.1

10.4.4.0/23

192.168.3.1

10.4.6.0/23

192.168.3.1

Wir hatten schon gesehen als wir im DNS-Praktikum CDNs besprochen hatten, dass IP Adressen etwas über die Lage im Netz aber auch die geografische Lage aussagen. Einige CDNs nutzen die IP-Adresse des rekursiven DNS-Servers, um den dazu nächstgelegenen Server zu bestimmen.

Aber was kann man sonst noch über IP Adressen, aber auch über DNS-Namen herausfinden? Natürlich gibt es dafür ein Protokoll: das Registration Data Access Protocol (RDAP).

RDAP ist ein einfaches Protokoll, dass HTTP nutzt. Anfragen sind als Pfad in der URL kodiert und je nach Ressource, die man anfragt, sieht dieser Pfad unterschiedlich aus. Die Pfadkomponente für IP-Adressen sehen so aus:

/ip/192.0.2.17

und für IP-Präfixe so:

/ip/192.0.2.0/24

Bleibt die Frage, wie lautet der Hostname, den man dem Pfad voranstellt? Es gibt hier eine Liste von IP-Präfixen und dazugehörigen Servern, bei denen man anfragen kann (und natürlich Webseiten im Internet und Tools, die all das automatisch manchen). Probieren wir doch einfach eine IP-Adresse aus. Nehmen wir die von www.example.com. Wie sie an die IP-Adresse kommen wissen Sie ja bereits: mit Hilfe von dig.

Wenn man das alles zusammen im Browser eingibt als:

https://rdap.db.ripe.net/ip/93.184.216.34

dann bekommt man diverse Informationen über die IP-Adresse, wem der dazugehörige Präfix gehört, Kontakt Adressen, falls der Präfix misbraucht wird (für Spam z.B.) und vieles mehr.

Für DNS wird die /domain/-Pfadkomponente eingesetzt. Nicht jede Registry betreibt einen RDAP-Server, aber hier finden sie eine Liste von RDAP-Servern für einen großen Teil der TLDs. Nach der Pfadkomponente folgt einfach der Name, für den Informationen gesucht werden. Also z.B.

https://rdap.verisign.com/com/v1/domain/example.com

Wenn Sie einen eigenen DNS-Namen reserviert haben, dann schauen Sie doch mal nach, was Sie so rausfinden? Spielen Sie mit RDAP herum. Manchmal findet man ganz interessante Dinge.

Hier werden die sogenannten Bootstrap Files für RDAP gehostet. Neben dem DNS und IPv4 finden Sie unter anderem z.B. auch IPv6. Schauen Sie mal den IPv6 File an und vergleichen diesen mit IPv4. Warum ist der IPv6 File wohl wesentlich kleiner?

Versuchen Sie über die /domain/-Pfadkomponente mal einen reverse DNS Lookup. Wenn Sie nicht mehr wissen wie die IP-Adressen beim reverse DNS Lookup kodiert werden, dann führen Sie mit dig nochmal einen solchen Lookup durch und schauen sich die Query-Section an.

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