sdn-start-mit-mininet-vm-ryu-floodlight-opendaylight
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
sdn-start-mit-mininet-vm-ryu-floodlight-opendaylight [2014/07/25 13:51] – benny | sdn-start-mit-mininet-vm-ryu-floodlight-opendaylight [2024/06/09 10:29] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Software-Defined-Networks | + | ====== Software-Defined-Network |
- | <WRAP center round todo 60%> | + | <WRAP center round alert 60%> |
- | Dieser Artikel | + | Dieser Artikel |
</ | </ | ||
- | Aller Anfang ist schwer oder doch nicht? Die virtuellen Maschinen von [[http:// | ||
- | ===== Voraussetzung | + | Aller Anfang ist schwer oder doch nicht? Die virtuellen Maschinen von [[http:// |
+ | |||
+ | ===== Voraussetzungen | ||
* [[http:// | * [[http:// | ||
Zeile 14: | Zeile 15: | ||
===== Einstieg ===== | ===== Einstieg ===== | ||
- | Die virtuelle Maschine bringt eine große Anzahl | + | Die virtuelle Maschine bringt eine Vielzahl |
- | Ryu ist ein SDN-Controller der von der NTT (Nippon Telegraph and Telephone Corporation) entwickelt wird. In Europa kennt man vielleicht eher die Tochtergesellschaft [[www.dimensiondata.com/ | + | Ryu ist ein SDN-Controller der von der [[http:// |
- | |Dimension Data]]. | + | |
- | Neben dem SDN Controller ist in der VM noch [[http:// | + | Mir gefällt dieser Controller besonders gut, da die Community ([[https:// |
+ | |||
+ | Neben dem SDN Controller ist in der VM auch [[http:// | ||
Jeder der hier angesprochenen Bausteine hätte seinen eigenen kilometerlangen Artikel verdient, aber heute möchte ich nur Starthilfe geben. :) | Jeder der hier angesprochenen Bausteine hätte seinen eigenen kilometerlangen Artikel verdient, aber heute möchte ich nur Starthilfe geben. :) | ||
- | * adsf | + | ===== Mininet ===== |
- | * | + | |
+ | Was ist nun zu tun um folgendes Netz zu simulieren? | ||
+ | {{ : | ||
+ | < | ||
+ | $ sudo mn --topo single,4 --mac --controller remote --switch ovsk, | ||
+ | </ | ||
+ | |||
+ | ==== Bedeutung der einzelnen Befehlselemente ==== | ||
+ | * --topo => Topologie | ||
+ | * --topo single,4 => ein Switch, vier Teilnehmer/ | ||
+ | * Weitere Optionen: linear, tree | ||
+ | * --mac => Einfache MAC-Adressen z.B. 00: | ||
+ | * --controller remote => Unser SDN Controller soll nicht aus Mininet kommen (wir wollen ja Ryu verwenden, kommt im nächsten Kapitel) | ||
+ | * --switch ovsk, | ||
+ | * (Optional) --link tc, | ||
+ | |||
+ | === Nach dem Start begrüßt uns die Mininet-Shell === | ||
+ | < | ||
+ | $ sudo mn --topo single,4 --mac --controller remote --switch ovsk, | ||
+ | *** Creating network | ||
+ | *** Adding controller | ||
+ | Unable to contact the remote controller at 127.0.0.1: | ||
+ | *** Adding hosts: | ||
+ | h1 h2 h3 h4 | ||
+ | *** Adding switches: | ||
+ | s1 | ||
+ | *** Adding links: | ||
+ | (h1, s1) (h2, s1) (h3, s1) (h4, s1) | ||
+ | *** Configuring hosts | ||
+ | h1 h2 h3 h4 | ||
+ | *** Starting controller | ||
+ | *** Starting 1 switches | ||
+ | s1 | ||
+ | *** Starting CLI: | ||
+ | mininet> | ||
+ | </ | ||
+ | |||
+ | ==== Kommandos in Mininet ==== | ||
+ | === Anzeige der Elemente / Nodes === | ||
+ | < | ||
+ | mininet> nodes | ||
+ | available nodes are: | ||
+ | c0 h1 h2 h3 h4 s1 | ||
+ | </ | ||
+ | |||
+ | === Anzeige der Netzwerkverbindungen / Links === | ||
+ | < | ||
+ | mininet> net | ||
+ | h1 h1-eth0: | ||
+ | h2 h2-eth0: | ||
+ | h3 h3-eth0: | ||
+ | h4 h4-eth0: | ||
+ | s1 lo: s1-eth1: | ||
+ | c0 | ||
+ | </ | ||
+ | |||
+ | === Detaillierte Anzeige der Konfiguration === | ||
+ | < | ||
+ | mininet> dump | ||
+ | <Host h1: h1-eth0: | ||
+ | <Host h2: h2-eth0: | ||
+ | <Host h3: h3-eth0: | ||
+ | <Host h4: h4-eth0: | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | === Befehl im Kontext eines Teilnehmers / Hosts ausführen === | ||
+ | < | ||
+ | mininet> h1 ifconfig | ||
+ | h1-eth0 | ||
+ | inet addr: | ||
+ | inet6 addr: fe80:: | ||
+ | UP BROADCAST RUNNING MULTICAST | ||
+ | RX packets:8 errors:0 dropped:0 overruns:0 frame:0 | ||
+ | TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 | ||
+ | collisions: | ||
+ | RX bytes:648 (648.0 B) TX bytes:1068 (1.0 KB) | ||
+ | |||
+ | lo Link encap:Local Loopback | ||
+ | inet addr: | ||
+ | inet6 addr: ::1/128 Scope: | ||
+ | UP LOOPBACK RUNNING | ||
+ | RX packets:6 errors:0 dropped:0 overruns:0 frame:0 | ||
+ | TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 | ||
+ | collisions: | ||
+ | RX bytes:672 (672.0 B) TX bytes:672 (672.0 B) | ||
+ | </ | ||
+ | |||
+ | === Ping von h1 zu h2 ausführen === | ||
+ | < | ||
+ | mininet> h1 ping h2 | ||
+ | PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. | ||
+ | From 10.0.0.1 icmp_seq=1 Destination Host Unreachable | ||
+ | From 10.0.0.1 icmp_seq=2 Destination Host Unreachable | ||
+ | From 10.0.0.1 icmp_seq=3 Destination Host Unreachable | ||
+ | ^C | ||
+ | --- 10.0.0.2 ping statistics --- | ||
+ | 5 packets transmitted, | ||
+ | pipe 3 | ||
+ | </ | ||
+ | <WRAP center round tip 60%> | ||
+ | Wir haben noch keinen SDN-Controller der die Kommunikation ermöglicht, | ||
+ | </ | ||
+ | |||
+ | === Öffnen eines xterm Fensters für Teilnehmer / Hosts === | ||
+ | < | ||
+ | mininet> xterm h1 | ||
+ | </ | ||
+ | {{ :: | ||
+ | |||
+ | === Nach Abschluss der Tests mit Mininet aufräumen === | ||
+ | <WRAP center round important 60%> | ||
+ | Dieses Kommando erst nach Beendigung der Tests durchführen! | ||
+ | </ | ||
+ | < | ||
+ | $ sudo mn -c | ||
+ | </ | ||
+ | |||
+ | ===== SDN-Controller: | ||
+ | |||
+ | Damit unsere Ping-Aktivitäten nicht weiter fehlschlagen, | ||
+ | |||
+ | ==== Start von Ryu ==== | ||
+ | < | ||
+ | $ cd / | ||
+ | </ | ||
+ | |||
+ | ==== Bedeutung der einzelnen Befehlselemente ==== | ||
+ | | ||
+ | * --verbose => Gibt mehr Details auf der Konsole aus | ||
+ | * ryu/ | ||
+ | * Im Verzeichnis /app befinden sich viele Beispielapplikationen | ||
+ | * simple_switch_13.py ist ein normaler Switch mit OpenFlow v1.3 Unterstützung | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | Im Fenster oben können wir sehen dass sich unser Mininet Switch mit dem Controller verbindet. Es werden im Rahmen dieser Anmeldung auch die Fähigkeiten (Features) mitgeteilt. Wenn man dem Switch später referenzieren möchte, wird dafür die " | ||
+ | <WRAP center round tip 60%> | ||
+ | Im Rahmen dieses Artikels ist es nicht wirklich relevant welche " | ||
+ | </ | ||
+ | |||
+ | ===== Erkunden der SDN-Lösung: | ||
+ | |||
+ | ==== OpenFlow Kommunikation zwischen Mininet Switch und Ryu ==== | ||
+ | |||
+ | Um sehen zu können was passiert, sollte der in der VM enthaltene Wireshark gestartet werden. Damit wir darin alle Schnittstellen sehen, ist es notwendig diesen mit " | ||
+ | < | ||
+ | $ sudo wireshark & | ||
+ | </ | ||
+ | {{ :: | ||
+ | Da wir alle Kommunikation lokal abwickeln, sollte um die OpenFlow-Kommunikation zu sehen auf der " | ||
+ | |||
+ | ==== Anzeige der hinterlegten Flows ==== | ||
+ | Bevor wir jetzt zwischen den Teilnehmern / Hosts pingen, sollten wir uns die hinterlegten Flows im OpenVSwitch (OVS) anschauen. | ||
+ | < | ||
+ | mininet> dpctl dump-flows --protocols OpenFlow13 | ||
+ | *** s1 ------------------------------------------------------------------------ | ||
+ | OFPST_FLOW reply (OF1.3) (xid=0x2): | ||
+ | | ||
+ | </ | ||
+ | Dieser Flow besagt: Alles zum Controller schicken! Normalerweise ist dies die "Regel des letzten Auswegs" | ||
+ | |||
+ | ==== Der erste Ping ==== | ||
+ | Genug mit der Theorie, ich will pingen! | ||
+ | < | ||
+ | mininet> h1 ping h2 | ||
+ | PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. | ||
+ | 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=210 ms | ||
+ | 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.963 ms | ||
+ | 64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.092 ms | ||
+ | 64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.086 ms | ||
+ | 64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=0.096 ms | ||
+ | ^C | ||
+ | --- 10.0.0.2 ping statistics --- | ||
+ | 5 packets transmitted, | ||
+ | rtt min/ | ||
+ | mininet> dpctl dump-flows --protocols OpenFlow13 | ||
+ | *** s1 ------------------------------------------------------------------------ | ||
+ | OFPST_FLOW reply (OF1.3) (xid=0x2): | ||
+ | | ||
+ | | ||
+ | | ||
+ | mininet> | ||
+ | </ | ||
+ | Wie man sehen kann, wurden dadurch zwei neue Flow-Einträge erzeugt. (Außerdem kann man sehen wieviel Pakete/ | ||
+ | |||
+ | ==== Woher kommen diese Einträge? ==== | ||
+ | Durch den Eintrag dass alle unbekannten Daten an den Controller gesendet werden, hat Ryu diese Anfragen erhalten und entschieden was damit zu tun ist. | ||
+ | {{ :: | ||
+ | |||
+ | Im Wireshark können wir nun auch eine Reihe von neuen Paketen sehen (wichtig ist hier nach " | ||
+ | |||
+ | {{ :: | ||
+ | Dies ist der Versuch von **h1** den Partner **h2** zu erreichen. Da h1 nicht weiß welche MAC-Adresse h2 hat, wird zuerst ein ARP-Request zum Auflösen der h2-IP -> MAC-Adresse gesendet. Außerdem ist oben die Information enthalten auf welchem OFB-IN-Port (1) das Paket reingekommen ist. Wir müssen auch besondere Aufmerksamkeit auf die **Buffer ID: 256** legen, denn hier hat der OVS das Paket abgespeichert bis der SDN-Controller ihm sagt wie damit zu verfahren ist. | ||
+ | |||
+ | {{ :: | ||
+ | Da auch der SDN-Controller bisher keine Übersicht hat, was wo angeschlossen (wenn auch virtuell) ist, wird der OVS instruiert das Paket auf alle Ports außer dem eingehenden zu senden (flood). Hier kann man auch die im vorherigen Schritt verwendete **Buffer ID: 256** wiederfinden (damit weiß der OVS um welches Paket es geht). | ||
+ | |||
+ | {{ :: | ||
+ | Durch den " | ||
+ | Der OVS hat für diese Kommunikation bisher noch keinen vollständigen Flow-Eintrag, | ||
+ | |||
+ | {{ :: | ||
+ | {{ :: | ||
+ | Nun passiert etwas sehr wichtiges, der SDN-Controller fügt einen Flow-Eintrag hinzu da jetzt genug Informationen über die Kommunikation vorliegen. Dieser bedeutet: Wenn ein Paket auf OFB-IN-PORT 3 (dort ist **h2** angeschlossen) reinkommt und als Ziel die MAC-Adresse (ETH-DST) von **h1** hat, dann sende das Paket auf OF-PORT 1 raus. (Dies vermeidet dass für weitere Pakete dieser Art der Controller gefragt werden muss.) // | ||
+ | |||
+ | {{ :: | ||
+ | Hier referenziert Ryu nun die **Buffer ID: 257** und instruiert den OVS das Paket auf OF-Port 1 zu senden. | ||
+ | |||
+ | {{ :: | ||
+ | Hier geht nun der eigentliche " | ||
+ | |||
+ | {{ :: | ||
+ | {{ :: | ||
+ | Hier kann man nun den Eintrag des Flows von OFB-IN-PORT 1 zu **h2** (ETH_DST) sehen. | ||
+ | |||
+ | {{ :: | ||
+ | Hier nun abschließend die Instruktion an den OVS das Paket an **Buffer ID: 258** auf OF-Port 3 rauszuschicken. | ||
+ | |||
+ | ==== Mininet Flow-Table ==== | ||
+ | Mit allem was wir uns angeschaut haben, machen diese Einträge nun auch Sinn! | ||
+ | * Bei eingehenden Paket auf Port (in_port) 1 mit dem Ziel dl_dst=00: | ||
+ | * Aussenden auf Port 3 | ||
+ | * Bei eingehenden Paket auf Port (in_port) 3 mit dem Ziel dl_dst=00: | ||
+ | * Aussenden auf Port 1 | ||
+ | * Passen die eingehenden Pakete nicht auf diese Flows, dann sende die Pakete an den Controller | ||
+ | < | ||
+ | mininet> dpctl dump-flows --protocols OpenFlow13 | ||
+ | *** s1 ------------------------------------------------------------------------ | ||
+ | OFPST_FLOW reply (OF1.3) (xid=0x2): | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== Abschließende Informationen ==== | ||
+ | |||
+ | === Idle Timeout === | ||
+ | Beim **Idle Timeout** handelt es sich die Zeit (in Sekunden) nach der der Flow aufgrund von Inaktivität (Flow hat nicht auf eingehende Pakete gepasst, engl. " | ||
+ | |||
+ | 0 = unendlich | ||
+ | |||
+ | === Hard Timeout === | ||
+ | Beim **Hard Timeout** handelt es sich die Zeit (in Sekunden) nach der der Flow **trotz Aktivität** entfernt wird. | ||
+ | |||
+ | 0 = unendlich | ||
+ | === Priority === | ||
+ | Je höher die **Priority**, | ||
+ | ===== Relevante Dokumentation ===== | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
sdn-start-mit-mininet-vm-ryu-floodlight-opendaylight.1406296315.txt.gz · Zuletzt geändert: 2024/06/09 10:29 (Externe Bearbeitung)