Vous êtes sur la page 1sur 4

SDN et NFV TP2 – Applications de switching SDN | Dr Ousmane SADIO

_______________________________________________________________________________________________________________

TP2 – Implémentation d’applications de switching SDN (4H)

A partir du code du TP1 (learning switch), écrire et tester des applications de switching L3, L4, de
filtrage à partir de tables multiples, proxy ARP. Apprendre à exploiter la documentation sur Ryu, à
examiner des scripts afin de lister et comprendre l’usage de certaines attributs et méthodes des
différentes classes formant le module Ryu.

A. Avant de commencer
Dans ce TP, vous allez commencer à écrire des applications Ryu étape par étape. Le code de base sera
celui de l’application simple_switch_13.
Consulter la documentation pour comprendre les messages et les structures d’OpenFlow avec Ryu.
https://ryu.readthedocs.io/en/latest/ofproto_v1_3_ref.html
La lecture des scripts des modules ethernet, ipv4 se fera en consultant les liens ci-dessous :
* ether_types : liste de protocoles de la couche 3 prise en compte par le module ether_types
https://github.com/faucetsdn/ryu/blob/master/ryu/lib/packet/ether_types.py
* packet : contient la définition ses classes (attributs et méthodes) des protocoles réseau (ethernet, arp,
ipv4, tcp, udp, icmp…) :
https://github.com/faucetsdn/ryu/tree/master/ryu/lib/packet
* class OFPMatch : liste de champs prise en charge pour le matching des paquets (Match fields)
https://github.com/faucetsdn/ryu/blob/master/ryu/ofproto/ofproto_v1_3_parser.py
Préparation des deux machines hôtes
− Configurer deux machines avec des adresses IP statiques appartenant au même réseau.
− Brancher les deux machines sur votre switch OpenFlow.
− Ensuite indiquer vos configurations sur le tableau suivant :

Adresse MAC Adresse IP Port Switch


Machine 1
Machine 2

NB : si le pare-feu Windows Defender de votre machine est activé, désactiver le !


B. App 1 : switch_L3_app
Un commutateur de niveau 3 (L3) est un dispositif qui transmet le trafic (trames) en fonction des
informations de couche 3. En plus de prendre en charge toutes les fonctions de commutation, ces
commutateurs sont conçus pour améliorer les performances de routage sur les grands réseaux locaux
(LAN).
Le but de l’application switch_L3_app est de remplir les tables de flux sur la base des informations de
la couche 3 : adresse IP source et de destination.
(1) Copier le script simple_switch_13.py et le renommer switch_L3_app.py
(2) Commencer à éditer le script switch_L3_app.py en incluant d’abord la bibliothèque IPv4 :
from ryu.lib.packet import ipv4

______________________________________________________________________________
ESP 2022 – 2023 | DIC3 TR et M2 SRT
SDN et NFV TP2 – Applications de switching SDN | Dr Ousmane SADIO
_______________________________________________________________________________________________________________

(3) Dans la partie traitement du packet_in, précisément dans le bloc de bloc implémentant l’installation
d’un flux, effectuer les actions suivantes :
− Dans la trame Ethernet, vérifiez que le champ d’entête type correspond à IP.
− Désencapsuler le paquet IPv4 à partir du paquet_in

ip = pkt.get_protocol(ipv4.ipv4)

− Extraire le src_ip (source IP) et le dst_ip (destination IP) à partir du paquet IPv4
− Mettre à jour OpenFlow Match (via la variable match) avec les champs eth_type, ipv4_src, ipv4_dst
(4) Lancer l’application puis effectuer des tests de validation.
− Faire un ping d’une machine vers une autre connectée sur le même switch.
− Afficher la table de flux dans le commutateur. Interpréter.

C. App 2 : switch_L4_app
Un commutateur de niveau 4 (L4) est un commutateur multicouche qui transmet le trafic (trames) en
fonction des informations de couche 3 et 4. Un commutateur de couche 4 constitue une amélioration du
commutateur de couche 3.
Le but de l’application switch_L4_app est de remplir les tables de flux sur la base des informations des
couche 3 et 4 : adresse IP source et de destination, protocole de transport (TCP, UDP, port source et de
destination).
(5) Copier le script simple_switch_13.py et le renommer switch_L4_app.py
(6) Commencer à éditer le script switch_L4_app.py en incluant les modules suivants :
from ryu.lib.packet import in_proto
from ryu.lib.packet import ipv4
from ryu.lib.packet import icmp
from ryu.lib.packet import tcp
from ryu.lib.packet import udp

(7) Dans la partie traitement du packet_in, précisément dans le bloc de bloc implémentant l’installation
d’un flux, effectuer les actions suivantes :
− Dans la trame Ethernet, vérifiez que le champ d’entête type correspond à IP.
− Désencapsuler le paquet IPv4 à partir du paquet_in (variable pkt)

ip = pkt.get_protocol(ipv4.ipv4)

− Extraire le src_ip (source IP), le dst_ip (destination IP) et le protocole à partir du paquet IPv4.
− Mettre à jour OpenFlow Match (via la variable match) avec les champs suivants :
▪ Si le protocole est de type ICMP, mettre eth_type, ipv4_src, ipv4_dst et ip_proto
▪ Si le protocole est de type TCP, désencapsuler le segment TCP à partir du paquet_in (variable
pkt). Ensuite mettre eth_type, ipv4_src, ipv4_dst, ip_proto, tcp_src et tcp_dst

tcp_proto = pkt.get_protocol(tcp.tcp)

▪ Si le protocole est de type UDP, mettre eth_type, ipv4_src, ipv4_dst, ip_proto, udp_src et udp_dst
udp_proto = pkt.get_protocol(udp.udp)

______________________________________________________________________________
ESP 2022 – 2023 | DIC3 TR et M2 SRT
SDN et NFV TP2 – Applications de switching SDN | Dr Ousmane SADIO
_______________________________________________________________________________________________________________

(8) Lancer l’application puis effectuer des tests de validation.


− Faire un ping d’une machine vers une autre connectée sur le même switch. Afficher la table de flux
dans le commutateur. Interpréter.
(9) Pour générer un trafic TCP ou UDP, vous devez installer l’outil Iperf3 sur vos machines :
− Télécharger Iperf3 via ce lien : https://iperf.fr/iperf-download.php#windows
− Décompresser le fichier zip, puis copier le chemin du répertoire contenant l’exécutable iperf.exe
− Sur l’invite de ligne de commande Windows, saisir les commandes suivantes :

cd chemin_du_repertoire_iperf3

− Pour générer un trafic TCP, saisir la commande serveur sur la machine 1, la commande client sur
la machine 2. Afficher la table de flux dans le commutateur. Interpréter.
# commande serveur
iperf3 -s
# commande client
iperf3 -c @IP serveur

− Pour générer un trafic UDP, saisir la commande serveur sur la machine 1, la commande client sur
la machine 2. Afficher la table de flux dans le commutateur. Interpréter.
# commande serveur
iperf3 -u -s
# commande client
iperf3 -u -c @IP serveur

D. App 3 : switch_filter_app
Les paquets peuvent être traités à travers plusieurs tables, c’est le traitement en pipeline. L’intérêt des
tables multiples est de permettre de créer des tables avec un traitement bien spécifique à appliquer sur
des paquets. Exemple, le filtrage de paquet ICMP.

Le but de l’application switch_filter_app est de bloquer les paquets ICMP (ping). En plus de la table 0
(qui existe par défaut), deux autres tables seront créées :
− FILTER TABLE (Table 5) : ajoutera des règles de filtrage de paquets (règles ACL). Ici, la règle
est de bloquer le trafic ICMP.
− FORWARD TABLE (Table 10) : applique les règles de commutation (switch L2)
Bon à savoir : comment bloquer un flux
Par défaut, dans OpenFlow, si aucune action (instruction) n’est associée à flux, alors ce flux sera détruit
(action=drop). Ainsi, si vous avez une règle de destruction de flux, vous devez simplement associer
aucune action à l’entrée correspondant à ce flux dans la table.
N'oubliez pas de garder ceci à l'esprit : si vous avez plus d'une règle de flux qui correspond au paquet,
celle qui a la plus haute priorité sera celle qui prendra effet. Ainsi, pour détruire un flux, mettre une
priorité élevée (supérieure aux autres règles) à la règle de flux qui correspond au paquet.

______________________________________________________________________________
ESP 2022 – 2023 | DIC3 TR et M2 SRT
SDN et NFV TP2 – Applications de switching SDN | Dr Ousmane SADIO
_______________________________________________________________________________________________________________

(10) Copier le script simple_switch_13.py et le renommer switch_filter_app.py


(11) Commencer à éditer le script switch_filter_app.py en incluant les modules et constants suivants :
from ryu.lib.packet import in_proto
from ryu.lib.packet import ipv4

FILTER_TABLE = 5
FORWARD_TABLE = 10

(12) Ajouter ces trois méthodes (fonctions) dans la classe de votre application.
def add_default_table(self, datapath):
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
inst = [parser.OFPInstructionGotoTable(FILTER_TABLE)]
mod = parser.OFPFlowMod(datapath=datapath, table_id=0, instructions=inst)
datapath.send_msg(mod)

def add_filter_table(self, datapath):


ofproto = datapath.ofproto
parser = datapath.ofproto_parser
inst = [parser.OFPInstructionGotoTable(FORWARD_TABLE)]
mod = parser.OFPFlowMod(datapath=datapath, table_id=FILTER_TABLE,
priority=1, instructions=inst)
datapath.send_msg(mod)

def apply_filter_table_rules(self, datapath):


ofproto = datapath.ofproto
parser = datapath.ofproto_parser
match = parser.OFPMatch(eth_type=ether_types.ETH_TYPE_IP,
ip_proto=in_proto.IPPROTO_ICMP)
mod = parser.OFPFlowMod(datapath=datapath, table_id=FILTER_TABLE,
priority=10000, match=match)
datapath.send_msg(mod)

NB : vous remarquerez que dans la fonction apply_filter_table_rules() l’entrée ajoutée à la table de


flux ne comporte aucune action (instruction) et que la priorité est à 10000 (plus grande priorité).
(13) Ajouter les tables FILTER_TABLE et FORWARD_TABLE ainsi que la règle de filtrage sur
chaque switch détecté. Pour ce faire, appeler ces trois méthodes à la fin de la méthode
switch_features_handler().
self.add_default_table(datapath)
self.add_filter_table(datapath)
self.apply_filter_table_rules(datapath)

(14) Le paramètre table_id de la méthode OFPFlowMod() prend par défaut le numéro de table 0. Vous
allez modifier ce paramètre afin le flux final soit traité à travers la table FORWARD_TABLE.
Ainsi lors de les appels de la méthode parser.OFPFlowMod(), indiquer aussi ce paramètre :

, table_id=FORWARD_TABLE,

(15) Lancer l’application puis effectuer des tests de validation.


− Afficher la table flux dans le commutateur. Commenter.
− S’assurer d’abord que l’application laisse bien passer les autres types de paquets utilisant iperf3
(voir l’application switch_L4_app). Ensuite, afficher la table flux dans le commutateur.
Commenter.
− Ensuite faire un ping d’une machine à une autre. Que remarquez-vous ? Discuter.

______________________________________________________________________________
ESP 2022 – 2023 | DIC3 TR et M2 SRT

Vous aimerez peut-être aussi