Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
TP1 – Prise en main d’un Lab Virtuel d’apprentissage SDN/NFV
Objectifs : Savoir déployer un Lab virtuel pour l’apprentissage SDN et NFV. Concevoir des topologies réseau à
l’aide de Mininet et Python. Comprendre la CLI Mininet, les méthodes de découvertes de topologies et les
tests de performances.
Déploiement du Lab virtuel
Le Lab virtuel sera déployé sur une machine virtuelle (VM) où sont préinstallés l’ensemble des outils
du Lab. Il suffit de télécharger l’image comnetsemu_sdn_nfv_esp.ova via le lien ci-dessous puis de
l’importer sur VirtualBox (version 7).
https://drive.google.com/file/d/1R2KCg5_Y5bne8Pm2Zrir-g_3cJwu5wrX/view?usp=sharing
Les informations de connexion à la VM sont :
• Login : vagrant
• Password : vagrant
Mininet
Mininet vous permet de d’émuler sur une seule machine, des réseaux, commutateurs, routeurs, pare feux
ou tout autre équipement réseau, ainsi que vos applications dans des "hôtes virtuels". Les réseaux
virtuels sont créés en utilisant la virtualisation basée sur les processus et les espaces de noms réseau.
Dans Mininet, les hôtes sont émulés comme des processus bash s'exécutant dans un espace de noms
réseau, de sorte que tout code qui s'exécuterait normalement sur un serveur Linux devrait s'exécuter sans
problème dans un "hôte" Mininet.
− Mininet fournit un Lab Virtuel et un environnement de développement SDN (Software-defined
networks) et NFV (Network Function Virtualization).
− On peut tester des topologies complexes sans avoir à câbler un réseau physique.
− Les réseaux Mininet exécutent du vrai code, y compris des applications réseau Unix/Linux
standard, ainsi que le noyau Linux réel et la pile réseau.
− Les commutateurs de Mininet sont des commutateurs logiciels comme Open vSwitch supportant
OpenFlow et P4.
− Mininet fournit une API Python extensible pour la création et l'expérimentation de réseaux.
ComNetsEmu
ComNetsEmu est un émulateur de réseau qui émule un déploiement et une orchestration réels
d'applications conteneurisées devant s’exécuter sur un cluster de serveurs physiques vers un seul
ordinateur de bureau ou portable. ComNetsEmu est une extension de Mininet permettant une meilleure
émulation des applications réseau NFV/SDN.
− Utiliser les hôtes Docker comme nœud dans les topologies Mininet.
− L'hôte Docker avec des conteneurs Docker internes (Docker-in-Docker) est utilisé pour imiter un
hôte physique réel qui exécute des conteneurs Docker.
− ComNetsEmu est principalement développé en Python. Afin de réduire la complexité des
dépendances, ComNetsEmu essaie d'exploiter autant que possible la bibliothèque standard Python.
______________________________________________________________________________
[email protected] Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
Ryu
Ryu est un contrôleur SDN open source conçu pour accroître l'agilité du réseau en facilitant la gestion
et l'adaptation du traitement du trafic. Le contrôleur Ryu fournit des composants logiciels, avec des API
bien définies, qui permettent aux développeurs de rapidement et facilement modifier les composants
existants ou implémenter les leurs pour s'assurer que le réseau underlay peut répondre aux demandes
changeantes de leurs applications.
Prise en main des outils
Mininet CLI
Il est possible d’utiliser Mininet directement via l’outil en ligne de commande CLI, ou bien de s’en
servir comme une librairie Python.
• Commandes de base
1. Pour lancer Mininet avec sa topologie par défaut, saisir simplement :
sudo mn
Qu’observez-vous à la sortie ?
2. Lister tous les nœuds. Commenter.
nodes
3. Lister tous les liens. Commenter.
net
4. Afficher un rapport sur l’état des liens
links
5. Afficher des informations sur tous les nœuds :
dump
6. Il est possible d’accéder au terminal de chaque nœud. Il suffit de précéder les commandes bash par
le nom du nœud.
h1 ip a
Et pour le switch :
s1 ip a
Commenter les résultats.
7. Pour tester la communication entre nœud, vous pouvez utiliser la commande ping avec l’adresse IP
ou avec le nom des nœuds.
h1 ping h2
8. Pour générer la matrice de connectivité, utiliser la commande ci-dessous. Commenter.
pingall
______________________________________________________________________________
[email protected]
Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
9. Il est possible de couper un lien.
link s1 h2 down
Faire un ping de h1 vers h2. Qu’observez-vous ?
10. Pour restaurer un lien, saisir :
link s1 h2 up
Faire un ping de h1 vers h2. Qu’observez-vous ?
11. Pour quitter Mininet, saisir :
exit
12. Si Mininet se bloque pour une raison quelconque, nettoyez-le :
sudo mn -c
Mininet API Python
Des topologies personnalisées peuvent également être facilement définies à l'aide d'une API Python.
Cette option est bien plus puissante et automatisable, il est possible de créer des topologies dynamiques,
d’y inclure des routeurs, des firewalls, des proxys…
13. Créer un fichier nommé simple_topology.py puis l’éditer avec le script suivant :
from mininet.topo import Topo
class MyTopo( Topo ):
def build( self ):
# Add Switches
s1 = self.addSwitch("s1")
s2 = self.addSwitch("s2")
# Add Hosts
h1 = self.addHost("h1")
h2 = self.addHost("h2")
# Add links Host to Switch
self.addLink(h1, s1)
self.addLink(h2, s2)
# Add links Switch to Swttch
self.addLink(s1, s2)
topos = { "mytopo": ( lambda: MyTopo() ) }
Ou bien télécharger le script à partir de Github avec la commande :
wget https://raw.githubusercontent.com/osadio/cours_sdn_nfv/main/tp1/simple_topology.py
14. Dessiner la topologie décrite par le script Python.
15. Déployer la topologie dans Mininet à partir du script Python.
sudo mn --custom simple_topology.py --topo mytopo
16. Retrouver la description complète de la topologie à l’aide des commandes vues plus haut.
______________________________________________________________________________
[email protected]
Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
Mininet topologies avancées
Mininet permet d’induire de la latence, ou réduire la bande passante des différents liens, ce qui peut être
très pratique pour tester les performances de nos applications dans un contexte réaliste. Mininet s’appuie
sur tc (traffic control)) pour ce faire.
17. Créer un fichier nommé ring_topology.py puis l’éditer avec le script suivant :
from mininet.topo import Topo
from mininet.link import TCLink
class MyTopo( Topo ):
def build( self ):
# Add Switches
s1 = self.addSwitch("s1", stp=True, failMode="standalone")
s2 = self.addSwitch("s2", stp=True, failMode="standalone")
s3 = self.addSwitch("s3", stp=True, failMode="standalone")
s4 = self.addSwitch("s4", stp=True, failMode="standalone")
# Add Hosts
h1 = self.addHost("h1", ip="10.0.0.1")
h2 = self.addHost("h2", ip="10.0.0.2")
h3 = self.addHost("h3", ip="10.0.0.3")
# Add links Host to Switch
self.addLink(h1, s1, cls=TCLink, bw=1000, delay=1)
self.addLink(h2, s2, cls=TCLink, bw=1000, delay=1)
self.addLink(h3, s3, cls=TCLink, bw=1000, delay=1)
# Add links Switch to Swttch
self.addLink(s1, s2, cls=TCLink, bw=1000, delay=1)
self.addLink(s2, s3, cls=TCLink, bw=10, delay=50, loss=20)
self.addLink(s3, s4, cls=TCLink, bw=100, delay=10)
self.addLink(s4, s1, cls=TCLink, bw=1000, delay=1)
topos = { "mytopo": ( lambda: MyTopo() ) }
Ou bien télécharger le script à partir de Github avec la commande :
wget https://raw.githubusercontent.com/osadio/cours_sdn_nfv/main/tp1/ring_topology.py
18. Dessiner la topologie décrite par le programme puis indiquer les caractéristiques de chaque lien.
19. Déployer la topologie dans Mininet à partir du script Python.
20. Patienter pendant 60s puis générer la matrice de connectivité.
21. Tester la latence entre les différents hôtes ainsi que les pertes de paquets. Commenter les résultats.
h1 ping -c10 h2
h1 ping -c10 h3
h2 ping -c10 h3
22. Tester le débit entre les différents hôtes de la topologie. Commenter les résultats.
iperf h1 h2
iperf h1 h3
iperf h2 h3
23. Couper le lien entre les commutateurs s3 et s4. Patientez pendant 60s puis refaire les tests de
latence, pertes de paquets et de débit. Que constatez-vous ?
______________________________________________________________________________
[email protected]
Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
Ryu
Il est possible de spécifier l'application Ryu sur la ligne de commande mn ou bien de lancer séparément.
C’est cette dernière qui sera employée dans ce TP.
24. Lancer l’application Ryu de switching nommée simple_switch_13.
ryu run ryu.app.simple_switch
25. Sur un autre terminal, créer la topologie dans Mininet à partir du script Python
ring_topology.py en ajoutant l’option liant cette topologie au contrôleur SDN.
sudo mn --custom ring_topology.py --topo mytopo --controller remote
NB : par défaut, le contrôleur SDN utilise le protocole OpenFlow. Le numéro de port utilisé par défaut
est le 6653.
26. Qu’observez-vous sur la sortie du terminal du contrôleur Ryu ?
27. Faire les tests de latence, pertes de paquets et de débit. Que constatez-vous ?
28. Afficher la table de flux des commutateurs SDN. Commenter les résultats puis dresser les tables
MAC ou CAM de chaque commutateur de la topologie.
dpctl dump-flows -O OpenFlow13
29. Couper le lien entre les commutateurs s3 et s4. Qu’observez-vous sur la sortie du terminal du
contrôleur Ryu ?
30. Faire un ping entre les différents hôtes. Qu’observez-vous sur la sortie du terminal du contrôleur
Ryu ?
NB : ignorer les adresse MAC multicast 33:33:00:00:00:* utilisée par IPv6 pour la découverte.
31. Dresser de nouveau les tables MAC ou CAM de chaque commutateur de la topologie.
32. Restaurer le lien entre les commutateurs s3 et s4. Qu’observez-vous sur la sortie du terminal du
contrôleur Ryu ?
33. Dresser encore les tables MAC ou CAM de chaque commutateur de la topologie.
34. Conclure sur le changement des tables CAM.
Ryu topology viewer
Ryu propose une application permettant de visualiser la topologie créée sur Mininet et de voir le flux de
paquets.
35. Arrêter l’application simple_switch puis lancer sur l’application Ryu gui_topology avec
l’option d’observation de lien.
ryu run --observe-links ryu.app.gui_topology.gui_topology
36. Arrêter Mininet puis le relancer avec toujours la topologie précédente.
37. Pour visualiser la topologie, ouvrir votre navigateur puis indiquer l’url suivant en remplaçant ip_vm
par l’adresse IP de la machine virtuelle.
http://ip_vm:8080
38. Qu’observez-vous ? Quelle est l’effet du Spanning Tree sur la topologie observée ?
39. Sur Mininet, couper des liens et observez de nouveau la topologie obtenue. Conclure.
______________________________________________________________________________
[email protected]
Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
Comnetsemu
Comnetsemu permet de remplacer les hôtes Mininet bash en conteneur Docker dans les topologies.
40. Créer un fichier nommé dockerhost_topology.py puis l’éditer avec le script suivant :
from comnetsemu.cli import CLI
from comnetsemu.net import Containernet
from mininet.link import TCLink
from mininet.log import info, setLogLevel
from mininet.node import Controller
def myTopo():
net = Containernet(controller=Controller, link=TCLink)
info("*** Adding controller\n")
net.addController("c0")
info("*** Adding switch\n")
s1 = net.addSwitch("s1")
info("*** Adding hosts\n")
h1 = net.addDockerHost(
"h1", dimage="dev_test", ip="10.0.0.1", docker_args={"hostname": "h1"}
)
h2 = net.addDockerHost(
"h2", dimage="dev_test", ip="10.0.0.2", docker_args={"hostname": "h2"}
)
info("*** Creating links\n")
net.addLinkNamedIfce(s1, h1, bw=10, delay="100ms")
net.addLinkNamedIfce(s1, h2, bw=10, delay="100ms")
info("*** Starting network\n")
net.start()
info("*** Enter CLI\n")
info("Use help command to get CLI usages\n")
CLI(net)
info("*** Stopping network")
net.stop()
if __name__ == "__main__":
setLogLevel("info")
myTopo()
Ou bien télécharger le script à partir de Github avec la commande :
wget https://raw.githubusercontent.com/osadio/cours_sdn_nfv/main/tp1/dockerhost_topology.py
41. Déployer la topologie à partir du script Python.
sudo python3 dockerhost_topology.py
NB : pour un premier lancement, l’image Docker dev_test de 247MB sera téléchargée depuis
Dockerhub. Vous devez donc patienter quelques minutes durant la création des hôtes.
42. Faire un ping de h1 vers h2.
h1 ping -c5 h2
NB : attention les commandes impliquant les hôtes docker ne peuvent pas être arrêtées à partir de la CLI
Mininet. Il est recommandé d’utiliser des terminaux xterm en ajoutant le paramètre xterms=True lors
de l’instanciation de Containernet.
______________________________________________________________________________
[email protected]
Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
43. Vous pouvez aussi utiliser la commande docker pour observer l’état des hôtes et images Docker.
docker images
docker ps
44. Accéder au conteneur de l’hôte h1 en ouvrant un nouveau terminal puis saisir :
docker exec -it h1 /bin/bash
45. Pour l’hôte h2, ouvrir un autre nouveau terminal puis saisir :
docker exec -it h2 /bin/bash
46. A partir du terminal de l’hôte h1, faire un ping vers h2. Attention, utiliser des adresses IP à la place
des noms d’hôtes.
ping -c5 10.0.0.2
47. Utiliser l’outil iperf pour mesurer le débit entre h1 et h2. Pour ce faire :
− Saisir sur le terminal de h1
iperf -s
− Saisir sur le terminal de h2
iperf -c 10.0.0.1 -t 10
NB : en cas de problème sur Docker, vous pouvez arrêter le script Python exécutant Mininet, arrêter les
conteneurs puis nettoyer Mininet.
mypid=$(sudo ps -ef | grep "sudo python3 dockerhost_topology.py" | head -1 | awk '{print $2}')
sudo kill -9 $mypid
docker stop h1
docker stop h2
sudo mn -c
Comnetsemu et Ryu
La classe RemoteController permet de contrôler les commutateurs avec un contrôleur SDN.
48. Lancer l’application Ryu de switching nommée simple_switch_13.
ryu run ryu.app.simple_switch
49. Modifier le programme précédent avec le bout de code suivant :
from comnetsemu.cli import CLI
from comnetsemu.net import Containernet
from mininet.link import TCLink
from mininet.log import info, setLogLevel
from mininet.node import RemoteController
def myTopo():
net = Containernet(controller=RemoteController, link=TCLink)
info("*** Adding controller\n")
net.addController("c0", controller=RemoteController, ip="127.0.0.1", port=6653)
Ou bien télécharger le script à partir de Github avec la commande :
wget https://raw.githubusercontent.com/osadio/cours_sdn_nfv/main/tp1/dockerhost_with_sdn_topology.py
______________________________________________________________________________
[email protected]
Ecole Supérieure Polytechnique de Dakar (ESP) − DGI 2023 ⎯ 2024
TP SDN & NFV | Dr Ousmane SADIO DIC3 TR & M2SRT
_______________________________________________________________________________________________________________
50. Faire les tests de connectivité comme précédemment. Qu’observez-vous sur la sortie du contrôleur
SDN ? Commenter.
Exercice
SenCloud est une entreprise IT évoluant dans le domaine du Cloud Computing. Il a été décidé que c’est
l’architecture réseau switch fabric qui sera déployée sur le datacenter devant héberger les services Cloud.
En tant qu’Ingénieur Réseaux et Systèmes, on vous confie la tâche de prototyper à l’aide de l’émulateur
Comnetsemu le réseau du datacenter avec 2 Spines et 3 Leafs. Chaque rack devra avoir un serveur. Ces
serveurs seront représentés par des conteneurs Docker avec l’image dev_test.
− Pour visualiser la topologie, vous pouvez utiliser la plateforme suivante :
http://demo.spear.narmox.com/app/?apiurl=demo#!/mininet
− Les tests d’accessibilité (ping, iperf) ne marcheront pas du fait que les fonctions réseaux ne sont
pas encore installées dans les commutateurs.
______________________________________________________________________________
[email protected]