¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Tablas de flujos en OpenFlow

Después de esta lección: Puedo leer un flujo y decir cuál aplica un switch a un paquete.

Lección de 55 min10 comandosLaboratorio de redes definidas por software: Open vSwitch, Mininet y un controlador OpenFlow en una VM

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

PalabraQué significaEjemplo
Tabla de flujosla lista de reglas de un switch
Matchla condición que dice a qué paquetes se aplica un flujoip,nw_dst=192.168.10.5
Prioridadel número que decide qué flujo gana si coinciden variospriority=40
Acciónlo que hace el switch con el paqueteoutput:1
Table-missel flujo de prioridad 0 que recoge lo que nadie quiso
Puertocada 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

Comando
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=3

Se 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

Comando
sudo ovs-ofctl -O OpenFlow13 del-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.

Carga cuatro flujos

Comando
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

Comando
sudo ovs-ofctl -O OpenFlow13 dump-flows sw1 --no-stats

Se 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

PrioridadMatchAcciónQué dice
90ip, origen 192.168.10.30dropEl tráfico IP de la wifi de invitados se descarta
40ip, destino 192.168.10.5output:1El tráfico hacia la impresora sale por el puerto 1
20arpFLOODLas preguntas ARP salen por todos los demás puertos
0nada: coincide con todoCONTROLLERLo 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

Comando
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

Comando
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

Comando
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

PaqueteFlujos que coincidenGana
Portátil a impresoraPrioridades 40 y 040: output:1
Invitados a impresoraPrioridades 90, 40 y 090: drop
Pregunta ARPPrioridades 20 y 020: 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

Comando
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

Comando
sudo ovs-ofctl -O OpenFlow13 --strict del-flows sw1 priority=0

Se 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

Comando
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.

Sobre este laboratorio y su código: Laboratorio de redes definidas por software: Open vSwitch, Mininet y un controlador OpenFlow en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.