Instrukcja do laboratorium 1 Zapoznanie ze środowiskiem Mininet. Instalacja zewnętrznego kontrolera SDN. 1. Cel ćwiczenia Celem ćwiczenia jest zaznajomienie się ze środowiskiem Mininet, protokołem OpenFlow oraz zewnętrznym kontrolerem sieci SDN. 2. Przygotowanie stanowiska 2.1 Instalacja programu Whireshark Proszę sprawdzić dostępność aplikacji Wireshark w systemie Ubuntu 16 oraz wtyczki pozwalającej na rozpoznawanie pakietów protokołu OpenFlow (Help About Wireshark Plugins). W przypadku stwierdzenia braku, instalacji można dokonać wykonując następujące polecenia z wiersza poleceń: $ sudo apt-get update $ sudo apt-get install software-properties-common python-softwareproperties $ sudo add-apt-repository ppa:pi-rho/security $ sudo apt-get update $ sudo apt-get install wireshark W razie problemów z instalacją należy wykonać następujące polecenia: $ sudo rm /var/lib/apt/lists/lock $ sudo rm /var/cache/apt/archives/lock $ sudo rm /var/lib/dpkg/lock $ sudo apt-get update 3. Mininet wprowadzenie Mininet to środowisko pozwalające na emulację sieci. Można w nim tworzyć rzeczywistą sieć uruchamianą na poziomie jądra systemu operacyjnego. Integruje nowoczesne rozwiązania takie jak np. Open vswitch, z wirtualnymi interfejsami (veth) oraz wydzielanymi przestrzeniami nazw. Uruchomienie środowiska Mininet następuje po wydaniu komendy: $ sudo mn W celu wyświetlenia listy opcji startowych należy wydać polecenie: $ sudo mn -h W razie problemów ze środowiskiem proszę skorzystać z polecenia: $ sudo mn -c 1
3.1 Domyślna topologia Domyślna topologia (minimal) zawierająca jeden przełącznik OpenFlow łączący dwa hosty oraz referencyjny kontroler OpenFlow została przedstawiona na rysunku 1. Jej uruchomienie następuje po wydaniu polecenia: $ sudo mn lub $ sudo mn --minimal Kontroler c0 Przełącznik s1 Host h1 Host h2 RYSUNEK 1. Domyślna topologia (minimal) Zadanie 1. Proszę zaobserwować proces zestawiania połączenia przełącznika z kontrolerem OpenFlow. Uwaga: przed uruchomieniem środowiska Mininet należy uruchomić sniffowanie w programie Wireshark na interfejsie loopback. 3.2 Pomocne polecenia Po uruchomieniu środowiska warto także zapoznać się z następującymi komendami: mininet> help W celu wyświetlenia listy węzłów: mininet> nodes W celu wyświetlenia istniejących połączeń: mininet> net Zrzut wszystkich podstawowych informacji o węzłach następuje po wydaniu polecenia: mininet> dump 2
Aby wykonać polecenie na danym węźle, należy w CLI podać nazwę węzła a następnie wykonywane na nim polecenie. Przykładowo, aby wyświetlić listę wszystkich interfejsów sieciowych należących do hosta h1 należy wydać polecenie: mininet> h1 ifconfig -a Uwaga: Ponieważ emulowane hosty działają we własnych przestrzeniach nazw, ich interfejsy sieciowe widoczne są tylko z poziomu emulowanych hostów. Ponieważ emulowany przełącznik OpenFlow wykorzystuje przełącznik Open vswitch działający w przestrzeni jądra systemy operacyjnego, jego interfejsy będą widoczne w przestrzeni nazw należącej do systemu operacyjnego. Proszę wydać podobne polecenie jak wyżej dla uruchomionego przełącznika z poziomu środowiska Mininet oraz sprawdzić wszystkie interfejsy sieciowe z poziomu użytkownika root głównego systemu (Ubuntu, nie mininet potrzebna jest dodatkowa konsola). Podczas pracy ze środowiskiem Mininet przydatnymi komendami uruchamianymi na danych urządzeniach mogą być także polecenia route, ps, arp, jobs, kill, & (oraz inne polecenia powłoki Bash). 3.3 Testowanie połączenia. Obserwacja wiadomości OpenFlow Uwaga: Przed wykonaniem zadania proszę uruchomić sniffowanie w programie Wireshark lub wyczyścić listę obserwowanych pakietów. Aby przetestować łączność pomiędzy hostatmi h1 oraz h2, z poziomu CLI można wydać następujące polecenie: mininet> h1 ping h2 Zadanie 2. Proszę dokładnie przeanalizować komunikację pomiędzy przełącznikiem a kontrolerem, tj. pakiety: packet_in, packet_out, flow_mod. Zadanie 3. Dlaczego pierwszy pakiet ICMP miał zdecydowanie większe opóźnienie od kolejnych (dyskusja). Proszę powtórzyć polecenie ping. Czy taka sytuacja ma dalej miejsce? Przydatne polecenie: mininet> pingall testuje łączność pomiędzy wszystkimi węzłami 3.4 Wykorzystanie xterms Mininet pozwala na bezpośredni dostęp do konsoli emulowanych urządzeń z wykorzystaniem emulatora terminala xterm. W celu uruchomienia emulatora terminala dla hosta h1 należy wydać polecenie: mininet>xterm h1 Proszę wypróbować podstawowe polecenia powłoki Bash wewnątrz tego terminala. Proszę sprawdzić działanie także podstawowych programów, np. tcpdump. 3
Uwaga: Podczas startu środowiska możliwe jest automatyczne uruchomienie terminali dla wszystkich urządzeń z wykorzystaniem opcji -x, np. $ mn -x 3.5 Uruchamianie podstawowych usług sieciowych (serwer HTTP) Środowisko Mininet oprócz podstawowych poleceń ma wbudowane podstawowe usługi pozwalające na testowanie własnych rozwiązań, np. serwer HTTP. Proszę w konsoli xterm węzła h1 wydać następujące polecenie: # python -m SimpleHTTPServer 80 Polecenie to uruchamia prosty serwer HTTP nasłuchujący na porcie 80. Następnie z poziomu CLI środowiska proszę wydać polecenie: mininet> h2 wget -O - h1 Zadanie 4. Proszę dokładnie prześledzić komunikację przełącznik-kontroler (protokół OpenFlow) podczas zestawiania sesji HTTP. 3.5 Wykorzystanie innych (dostępnych domyślnie) topologii Proszę uruchomić środowisko następującymi poleceniami: $ mn --topo single,3 $ mn --topo linear,4 $ mn --topo tree,depth=2 $ mn --topo tree,depth=2,fanout=4 Zadanie 5. Proszę narysować uruchomione topologie 3.6 Testowanie wydajności połączeń Środowisko Mininet pozwala na korzystanie z popularnych rozwiązań do testowania połączeń, np. programu iperf. Aby przetestować szybkość połączenia w podstawowej topologii należy wydać polecenie: minient> iperf Polecenie to tworzy na jednym z hostów serwer iperf, na drugim zaś jego aplikację kliencką i uruchamia test między nimi. Para ta zawsze tworzona jest pomiędzy hostami o najwyższym i najniższym ID. Zadanie 6. Proszę przetestować szybkość połączenia pomiędzy hostem h1 a h2 w podstawowej topologii. 4
Mininet pozwala także na zmiany parametrów dostępnych łączy. W celu ustawienia dodatkowych opóźnień oraz przepustowości łączy wykorzystuje popularne narzędzie tc. Zadanie 7. Proszę uruchomić podstawową topologię z następującymi parametrami: $ sudo mn --link tc,bw=5,delay=20ms oraz przetestować łączność: mininet> iperf mininet> h1 ping h2 Pytanie: Skąd wynika opóźnienie rzędu 80ms? 3.7 Wyświetlanie zainstalowanych przepływów w tablicy przełącznika Proszę uruchomić jeszcze raz minimalną topologię poleceniem: $ mn następnie proszę podłączyć się do emulatora konsoli przełącznika s1 poleceniem mininet> xterm s1 oraz wydać wewnątrz tej konsoli polecenie: # ovs-ofctl dump-flows s1 Jeśli nie było ruchu pomiędzy hostami h1 oraz h2 lista zainstalowanych przepływów w przełączniku powinna być pusta. Następnie proszę puścić pinga z h1 do h2 oraz ponownie wyświetlić listę przepływów. Zadanie 8. Proszę z poziomu przełącznika skasować wszystkie zainstalowane przepływy 5
4. Tworzenie własnych topologii Środowisko Mininet pozwala na tworzenie własnych (bardziej skomplikowanych) topologii z wykorzystaniem prostego API (Python). Proszę utworzyć plik o nazwie example-topo.py zawierający następujące linie: ""Custom topology example Two directly connected switches plus a host for each switch: host --- switch --- switch --- host Adding the 'topos' dict with a key/value pair to generate our newly defined topology enables one to pass in '--topo=mytopo' from the command line. """ from mininet.topo import Topo class MyTopo( Topo ): "Simple topology example." def init ( self ): "Create custom topo." # Initialize topology Topo. init ( self ) # Add hosts and switches lefthost = self.addhost( 'h1' ) righthost = self.addhost( 'h2' ) leftswitch = self.addswitch( 's3' ) rightswitch = self.addswitch( 's4' ) # Add links self.addlink( lefthost, leftswitch ) self.addlink( leftswitch, rightswitch ) self.addlink( rightswitch, righthost ) topos = { 'mytopo': ( lambda: MyTopo() ) } Uruchomienie własnej topologii następuje po wydaniu polecenia: $ sudo mn --custom example-topo.py --topo mytopo 6
Host h4 Host h3 Host h1 RYSUNEK 2. Topologia do implementacji Host h2 Zadanie 9. Proszę na podstawie przykładu utworzyć topologię przedstawioną na rysunku 2. Zadanie 10. Proszę rozszerzyć konfigurację topologii z rysunku 2 o nadanie wszystkim łączom przepustowości 10Mb/s oraz opóźnienia 10ms. Zadanie 11. Proszę rozszerzyć zadaną konfigurację o nadanie następujących adresów IP poszczególnym hostom: h1: 1.1.1.1 h2: 2.2.2.2 h3: 3.3.3.3 h4: 4.4.4.4 7
5. Uruchamianie zewnętrznego kontrolera sieci SDN W trakcie tych oraz kolejnych zajęć laboratoryjnych wykorzystywać będziemy zewnętrzny kontroler sieci SDN o nazwie Floodlight. Napisany jest on w języku Java. 5.1 Przygotowanie środowiska Przed zbudowanie i uruchomieniem środowiska należy zainstalować potrzebne repozytoria poleceniem: $ sudo apt-get install build-essential ant maven python-dev 5.2 Pobieranie i budowanie kontrolera Proszę pobrać kontroler (version 1.2) ze strony projektu https://github.com/floodlight/floodlight/archive/v1.2.tar.gz a następnie rozpakować go, np. poleceniem: $ tar -xf floodlight* Następnie należy przejść do rozpakowanego katalogu i zbudować kontroler ze źródeł poleceniem $ ant 5.3 Uruchomienie i testowanie zewnętrznego kontrolera Uwaga: Przed uruchomieniem kontrolera proszę zamknąć wszystkie topologie uruchomione w środowisku Mininet W celu uruchomienia kontrolera należy z wiersza poleceń wydać polecenie: $ java -jar target/floodlight.jar Proszę zaobserwować start kontrolera. Kontroler od tej pory powinien nasłuchiwać przełączników za pomocą protokołu LLDP. Następnie (w innej konsoli) należy uruchomić środowisko Mininet, tym razem wskazując, że wykorzystany zostanie zewnętrzny kontroler: $ sudo mn --controller=remote,ip=<controller ip>,port=6653 Zadanie 12. Proszę przetestować działanie sieci z wykorzystaniem zewnętrznego kontrolera. Zadanie 13. W jaki sposób można zmienić poziom logowania przez kontroler? Zadanie 14. Proszę uruchomić własną topologię z zewnętrznym kontrolerem Floodlight. 8