Qué es una tabla de flujos
Una tabla de flujos es la lista de reglas que un switch OpenFlow recorre con cada paquete. Cada regla tiene una condición, una prioridad y una acción, y el switch aplica la mejor que coincide.
En la biblioteca de una universidad, la impresora y el portátil del bibliotecario deben hablar. La wifi de invitados no debe llegar a la impresora. Todo eso cabe en cuatro flujos.
Al final de esta lección
Nota
Puedo leer un flujo y decir cuál aplica un switch a un paquete.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Tabla de flujos | la lista de reglas de un switch | |
| Match | la condición que dice a qué paquetes se aplica un flujo | ip,nw_dst=192.168.10.5 |
| Prioridad | el número que decide qué flujo gana si coinciden varios | priority=40 |
| Acción | lo que hace el switch con el paquete | output:1 |
| Table-miss | el flujo de prioridad 0 que recoge lo que nadie quiso | |
| Puerto | cada entrada o salida numerada de un switch |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un flujo tiene condición, prioridad y acción
Mira este flujo: priority=40,ip,nw_dst=192.168.10.5 actions=output:1. Dice: a los paquetes IP con destino 192.168.10.5, envíalos por el puerto 1. Su prioridad es 40.
Preparamos sw1 con tres puertos, del 1 al 3, y le damos cuatro flujos. El puerto 1 es la impresora, el 2 el portátil y el 3 la wifi de invitados.
Crea sw1 con tres puertos
sudo ovs-vsctl --may-exist add-br sw1 -- set bridge sw1 datapath_type=system protocols=OpenFlow13 fail-mode=secure -- --may-exist add-port sw1 p1 -- set interface p1 type=internal ofport_request=1 -- --may-exist add-port sw1 p2 -- set interface p2 type=internal ofport_request=2 -- --may-exist add-port sw1 p3 -- set interface p3 type=internal ofport_request=3Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Vacía la tabla de flujos
sudo ovs-ofctl -O OpenFlow13 del-flows sw1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Carga cuatro flujos
printf 'priority=90,ip,nw_src=192.168.10.30,actions=drop\npriority=40,ip,nw_dst=192.168.10.5,actions=output:1\npriority=20,arp,actions=flood\npriority=0,actions=CONTROLLER:65535\n' | sudo ovs-ofctl -O OpenFlow13 add-flows sw1 -Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee la tabla de flujos
sudo ovs-ofctl -O OpenFlow13 dump-flows sw1 --no-statsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: los cuatro flujos de sw1
| Prioridad | Match | Acción | Qué dice |
|---|---|---|---|
| 90 | ip, origen 192.168.10.30 | drop | El tráfico IP de la wifi de invitados se descarta |
| 40 | ip, destino 192.168.10.5 | output:1 | El tráfico hacia la impresora sale por el puerto 1 |
| 20 | arp | FLOOD | Las preguntas ARP salen por todos los demás puertos |
| 0 | nada: coincide con todo | CONTROLLER | Lo demás se manda al controlador |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Gana el flujo de mayor prioridad que coincide
Un paquete puede coincidir con varios flujos a la vez. El switch aplica solo uno: el de prioridad más alta. Los demás se ignoran.
ovs-appctl ofproto/trace hace la prueba sin enviar nada: le describes un paquete y dice qué flujo lo recoge. El filtro grep deja solo el flujo y su acción.
Un paquete del portátil a la impresora
sudo ovs-appctl ofproto/trace sw1 in_port=2,ip,nw_src=192.168.10.20,nw_dst=192.168.10.5 | grep -A1 '^ 0\.'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un paquete de la wifi de invitados
sudo ovs-appctl ofproto/trace sw1 in_port=3,ip,nw_src=192.168.10.30,nw_dst=192.168.10.5 | grep -A1 '^ 0\.'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una pregunta ARP
sudo ovs-appctl ofproto/trace sw1 in_port=1,arp | grep -A1 '^ 0\.'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: quién gana en cada paquete
| Paquete | Flujos que coinciden | Gana |
|---|---|---|
| Portátil a impresora | Prioridades 40 y 0 | 40: output:1 |
| Invitados a impresora | Prioridades 90, 40 y 0 | 90: drop |
| Pregunta ARP | Prioridades 20 y 0 | 20: FLOOD |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El table-miss recoge lo que nadie quiso
Un paquete que no coincide con ningún flujo se llama un table-miss, un fallo de tabla. Si la tabla tiene un flujo de prioridad 0 sin match, ese flujo lo recoge.
Aquí lo manda al controlador. Sin ese flujo, un switch en modo secure descarta el paquete. Quitamos el flujo de prioridad 0 y repetimos la prueba.
Un destino que ningún flujo conoce
sudo ovs-appctl ofproto/trace sw1 in_port=2,ip,nw_src=192.168.10.20,nw_dst=192.168.10.9 | grep -A1 '^ 0\.'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Borra solo el flujo de prioridad 0
sudo ovs-ofctl -O OpenFlow13 --strict del-flows sw1 priority=0Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Repite la prueba sin table-miss
sudo ovs-appctl ofproto/trace sw1 in_port=2,ip,nw_src=192.168.10.20,nw_dst=192.168.10.9 | grep -A1 '^ 0\.'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que un switch recorre los flujos en el orden en que se escribieron y se queda con el primero que coincide. No es así: manda la prioridad, no el orden. Escribe antes o después un flujo de prioridad 90 y gana igual.