Comment écrit-on une règle de flux ?
Écrire une règle de flux, c’est dire ce que l’on vise, son importance et ce que l’on en fait. La commande ovs-ofctl add-flow la pose dans un commutateur OpenFlow.
Avec quelques règles, on laisse deux machines se parler et on en bloque une troisième. Dans une bibliothèque universitaire, ce sont ces règles qui séparent les postes du personnel, le serveur et le Wi-Fi des visiteurs.
À la fin de cette leçon
Remarque
Je peux écrire des règles qui laissent deux machines se parler et qui en bloquent une troisième.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| ovs-ofctl | la commande qui lit et écrit les règles d’un commutateur Open vSwitch | |
| ARP | la demande qui cherche l’adresse MAC d’une adresse IP | |
| Inondation | envoyer un paquet sur tous les ports sauf celui d’entrée | actions=flood |
| Abandon | jeter le paquet | actions=drop |
| Port d’entrée | le port par lequel le paquet arrive | in_port=3 |
| Politique | ce que le réseau doit permettre et interdire |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une politique se traduit en règles
Une politique est une phrase : « le poste du personnel et le serveur se parlent, et les invités ne parlent à personne ». Chaque morceau devient une règle.
Dans notre exemple, le poste du personnel est sur le port 1, le serveur sur le port 2 et un invité sur le port 3. Le blocage de l’invité est une règle sur in_port=3, avec l’action drop.
Sans ARP, aucun paquet IP ne part
Avant d’envoyer un paquet IP, une machine doit connaître l’adresse MAC de sa cible. Elle la demande par un message ARP envoyé à tout le monde.
Si le commutateur jette cette demande, la machine ne saura jamais où envoyer son paquet. Il faut donc une règle pour l’ARP, par exemple arp,actions=flood, qui renvoie la demande sur tous les autres ports.
Le blocage doit être plus prioritaire
Une règle de blocage ne sert à rien si une règle plus prioritaire laisse passer le même paquet. On donne donc au blocage la priorité la plus haute : ici 300, contre 200 pour l’ARP et 100 pour le reste.
L’ARP d’un invité est ainsi jeté lui aussi. Une règle drop a un autre avantage : elle compte les paquets qu’elle arrête.
Exemple travaillé : de la politique aux règles
| Phrase de la politique | Règle de flux | Priorité |
|---|---|---|
| Aucun paquet d’invité ne passe | in_port=3 actions=drop | 300 |
| Les demandes ARP circulent | arp actions=flood | 200 |
| Tout ce qui va au serveur y va | ip,nw_dst=192.168.5.20 actions=output:2 | 100 |
| Tout ce qui va au poste y va | ip,nw_dst=192.168.5.10 actions=output:1 | 100 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Poser les règles sur le commutateur d’essai
On reprend le commutateur demo de la leçon précédente. La première commande le recrée s’il a disparu, sans erreur s’il existe.
replace-flows remplace toute la table par les règles lues sur l’entrée : on repart donc d’une table propre. Ensuite, ofproto/trace dit quelle règle chaque paquet rencontrerait, sans en envoyer un seul.
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.
Poser la politique en quatre règles
printf 'priority=300,in_port=3,actions=drop\npriority=200,arp,actions=flood\npriority=100,ip,nw_dst=192.168.5.20,actions=output:2\npriority=100,ip,nw_dst=192.168.5.10,actions=output:1\n' | sudo ovs-ofctl -O OpenFlow13 replace-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.
Le poste du personnel écrit au serveur
sudo ovs-appctl ofproto/trace demo in_port=1,ip,nw_dst=192.168.5.20 | 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.
L’invité écrit au serveur
sudo ovs-appctl ofproto/trace demo in_port=3,ip,nw_dst=192.168.5.20 | 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.
Le poste du personnel demande une adresse
sudo ovs-appctl ofproto/trace demo in_port=1,arp,arp_op=1 | 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.
L’invité demande une adresse
sudo ovs-appctl ofproto/trace demo in_port=3,arp,arp_op=1 | 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.
Le poste du personnel écrit à l’invité
sudo ovs-appctl ofproto/trace demo in_port=1,ip,nw_dst=192.168.5.30 | 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.
Lire un message d’erreur
sudo ovs-ofctl -O OpenFlow13 add-flow demo "priority=300,in_port=4,actions=jeter"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 qu’une règle sur les adresses IP suffit pour que deux machines se joignent. Ce n’est pas assez : avant le paquet IP, il y a la demande ARP. Sans règle pour l’ARP, la machine ne connaît pas l’adresse MAC de sa cible, et rien ne part.