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 ip
s Funktionen kennenlernen und zwar die, die sich mit der Weiterleitungstabelle beschäftigen.
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:
address
- Manipulation und Ausgabe von IP-Adressen einer Netzwerkschnittstelleroute
- Die Weiterleitungstabelle anzeigen oder anpassenlink
- Aspekte der Sicherungsschicht ausgeben und verändernneighbour
- Den ARP-Cache verwaltenEs 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.
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:
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!
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?ping
): 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.).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!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:
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.