Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Software-Defined-Networks (SDN) Einstieg ohne Hardware mit Mininet VM und Ryu/Floodlight/OpenDaylight Controller
Dieser Artikel befindet sich noch im Aufbau! :)
Aller Anfang ist schwer oder doch nicht? Die virtuellen Maschinen von SDN Hub machen uns den Einstieg leicht(er)!
Voraussetzungen
- SDN Hub „All-in-one SDN App Development Starter VM“ herunterladen
- Virtualbox, dort wird die heruntergeladene VM (OVA) importiert
Einstieg
Die virtuelle Maschine bringt eine große Anzahl von SDN Controllern bereits mit. Wir fokussieren uns in diesem Artikel allerdings auf Ryu, später vielleicht noch auf Floodlight und OpenDaylight.
Ryu ist ein SDN-Controller der von der NTT (Nippon Telegraph and Telephone Corporation) entwickelt wird. In Europa kennt man vielleicht eher die Tochtergesellschaft Dimension Data. Mir gefällt dieser Controller besonders gut, da die Community (ryu-devel Mailingliste) sehr hilfsbereit ist. Es fällt auf dass die Entwickler sich selbst Zeit nehmen um auf die Anfragen zu reagieren und den Controller auch auf Anfragen hin weiterentwickeln wenn eine API o.ä. bisher nicht vorhanden ist. Ryu ist in Python entwickelt und kommt mit diverse Beispiel Applikationen mit denen man arbeiten kann. (Natürlich kann man Ryu auch selbst erweitern, dies würde aber den Rahmen dieses Artikels sprengen …)
Neben dem SDN Controller ist in der VM noch Mininet enthalten. Mininet erlaubt uns neben einem oder mehreren Switches auch noch Clients/Teilnehmer am Netz zu simulieren.
Jeder der hier angesprochenen Bausteine hätte seinen eigenen kilometerlangen Artikel verdient, aber heute möchte ich nur Starthilfe geben. :)
Mininet
Was ist nun zu tun um folgendes Netz zu simulieren?
$ sudo mn --topo single,4 --mac --controller remote --switch ovsk,protocols=OpenFlow13
Bedeutung der einzelnen Befehlselemente
- –topo ⇒ Topologie
- –topo single,4 ⇒ ein Switch, vier Teilnehmer/Hosts
- Weitere Optionen: linear, tree
- –mac ⇒ Einfache MAC-Adressen z.B. 00:00:00:00:00:01 für Host 1
- –controller remote ⇒ Unser SDN Controller soll nicht aus Mininet kommen (wir wollen ja Ryu verwenden, kommt im nächsten Kapitel)
- –switch ovsk,protocols=OpenFlow13 ⇒ Verwendung des OpenVSwitch mit OpenFlow Standard v1.3
- (Optional) –link tc,bw=10,delay=10ms ⇒ Dies würde die Bandbreite auf 10Mbit begrenzen und künstlich eine Verzögerung (Delay) auf die Links legen
Nach dem Start begrüßt uns die Mininet-Shell
$ sudo mn --topo single,4 --mac --controller remote --switch ovsk,protocols=OpenFlow13 *** Creating network *** Adding controller Unable to contact the remote controller at 127.0.0.1:6633 *** 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:s1-eth1 h2 h2-eth0:s1-eth2 h3 h3-eth0:s1-eth3 h4 h4-eth0:s1-eth4 s1 lo: s1-eth1:h1-eth0 s1-eth2:h2-eth0 s1-eth3:h3-eth0 s1-eth4:h4-eth0 c0
Detaillierte Anzeige der Konfiguration
mininet> dump <Host h1: h1-eth0:10.0.0.1 pid=10802> <Host h2: h2-eth0:10.0.0.2 pid=10803> <Host h3: h3-eth0:10.0.0.3 pid=10804> <Host h4: h4-eth0:10.0.0.4 pid=10805> <OVSSwitch s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None,s1-eth3:None,s1-eth4:None pid=10808> <RemoteController c0: 127.0.0.1:6633 pid=10795>
Befehl im Kontext eines Teilnehmers / Hosts ausführen
mininet> h1 ifconfig h1-eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:01 inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0 inet6 addr: fe80::200:ff:fe00:1/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:1068 (1.0 KB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 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, 0 received, +3 errors, 100% packet loss, time 4024ms pipe 3
Wir haben noch keinen SDN-Controller der die Kommunikation ermöglicht, daher ist dieses Ergebnis zu diesem Zeitpunkt erwartet.
Öffnen eines xterm Fensters für Teilnehmer / Hosts
mininet> xterm h1
SDN-Controller: Ryu
Damit unsere Ping-Aktivitäten nicht weiter fehlschlagen, brauchen wir nun einen SDN-Controller.
Start von Ryu
$ cd /home/ubuntu/ryu && ./bin/ryu-manager --verbose ryu/app/simple_switch_13.py
Bedeutung der einzelnen Befehlselemente
- ./bin/ryu-manager ⇒ Ryu-Manager der für uns die eigentliche Applikation startet
- –verbose ⇒ Gibt mehr Details auf der Konsole aus
- ryu/app/simple_switch_13.py
- 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 „datapath_id“ (DPID) und nicht die IP-Adresse verwendet.
Im Rahmen dieses Artikels ist es nicht wirklich relevant welche „Buffer“ oder „Table“-Fähigkeiten der virtuelle Switch hat, dies ist aber später auf physikalischen Switches sehr wichtig zu wissen.