Académique Documents
Professionnel Documents
Culture Documents
_______________________________________________________________________________________________________________
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 :
______________________________________________________________________________
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
_______________________________________________________________________________________________________________
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
_______________________________________________________________________________________________________________
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)
(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,
______________________________________________________________________________
ESP 2022 – 2023 | DIC3 TR et M2 SRT