Pourquoi ce paquet passe-t-il, et pas celui-là ?
Une table de flux est la liste de règles qu’un commutateur OpenFlow consulte pour chaque paquet. La lire permet de prédire ce que le commutateur fera d’un paquet sans en envoyer un seul.
Dans un lycée, le trafic web d’une salle ne sort plus, alors que le reste marche. La réponse est toujours dans la table : une règle plus prioritaire jette ces paquets.
À la fin de cette leçon
Remarque
Je peux lire une règle de flux et dire laquelle s’applique à un paquet.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Table de flux | la liste des règles d’un commutateur | |
| Correspondance | la partie d’une règle qui dit quels paquets elle vise | tcp,tp_dst=80 |
| Priorité | un nombre : la plus haute règle qui correspond gagne | priority=30 |
| Action | ce que le commutateur fait du paquet | output:2 |
| Règle par défaut | la règle de priorité 0 qui correspond à tout paquet | |
| Port | une prise numérotée du commutateur |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une règle de flux a trois parties
Une règle dit : pour les paquets qui ressemblent à ceci, faire cela, avec cette importance. Ses trois parties sont la correspondance, la priorité et l’action.
Prenons priority=20,tcp,tp_dst=80 actions=output:2. La correspondance est « un paquet TCP vers le port 80 », c’est-à-dire du web. La priorité est 20. L’action envoie le paquet sur le port 2 du commutateur.
La plus haute priorité gagne
Plusieurs règles peuvent correspondre au même paquet. Le commutateur retient celle dont la priorité est la plus haute. L’ordre dans lequel on les a écrites ne compte pas.
La règle par défaut a la priorité 0 et ne demande rien au paquet. Elle attrape donc tout ce que les autres laissent passer. Sans règle du tout, un commutateur OpenFlow 1.3 jette le paquet.
Exemple travaillé : quelle règle choisit-on ?
| Paquet | Règles qui correspondent | Règle retenue | Résultat |
|---|---|---|---|
| TCP vers le port 80 | Priorité 20 et priorité 0 | Priorité 20 | Sortie sur le port 2 |
| TCP vers le port 22 | Priorité 30 et priorité 0 | Priorité 30 | Jeté |
| TCP vers le port 443 | Priorité 0 seulement | Priorité 0 | Jeté |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un commutateur d’essai pour regarder sans risque
Pour ne pas toucher à br0, on construit un second commutateur, demo, avec trois ports numérotés 1, 2 et 3. La commande qui le crée peut être relancée sans erreur. Rien n’y est branché : on y pose des règles et on demande ce qui arriverait.
ofproto/trace simule un paquet et dit quelle règle il rencontre. Sur une table vide, la réponse est No match. puis drop.
Créer le commutateur demo
sudo ovs-vsctl --may-exist add-br demo -- set bridge demo datapath_type=system protocols=OpenFlow13 fail-mode=secure -- --may-exist add-port demo p1 -- set interface p1 type=internal ofport_request=1 -- --may-exist add-port demo p2 -- set interface p2 type=internal ofport_request=2 -- --may-exist add-port demo p3 -- set interface p3 type=internal ofport_request=3Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un paquet web sur une table vide
sudo ovs-appctl ofproto/trace demo in_port=1,tcp,tp_dst=80 | grep -A 2 "^ 0\."Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Poser trois règles d’un coup
printf 'priority=0,actions=drop\npriority=20,tcp,tp_dst=80,actions=output:2\npriority=30,tcp,tp_dst=22,actions=drop\n' | sudo ovs-ofctl -O OpenFlow13 add-flows demo -Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire la table de flux
sudo ovs-ofctl -O OpenFlow13 --no-stats --rsort=priority dump-flows demoAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Où va un paquet web ?
sudo ovs-appctl ofproto/trace demo in_port=1,tcp,tp_dst=80 | grep -A 2 "^ 0\."Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Où va un paquet SSH ?
sudo ovs-appctl ofproto/trace demo in_port=1,tcp,tp_dst=22 | grep -A 2 "^ 0\."Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Où va un paquet sur le port 443 ?
sudo ovs-appctl ofproto/trace demo in_port=1,tcp,tp_dst=443 | grep -A 2 "^ 0\."Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens pensent que le commutateur lit les règles de haut en bas et s’arrête à la première qui correspond. Ce n’est pas le cas : c’est la priorité qui décide. Une règle peut être écrite en dernier et gagner, si sa priorité est la plus haute.