Cómo escribir un flujo en un switch OpenFlow
Escribir un flujo con ovs-ofctl add-flow es darle a un switch OpenFlow una regla nueva: qué paquetes y qué hacer con ellos. Con pocas reglas puedes dejar que dos equipos hablen y bloquear a un tercero.
En el aula de prácticas hay un servidor, el ordenador de un alumno y otro equipo sin autorizar. El servidor y el alumno deben entenderse. El tercero no debe llegar a nada.
Al final de esta lección
Nota
Puedo escribir los flujos que dejan hablar a dos equipos y bloquean a un tercero.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| add-flow | la orden de ovs-ofctl que añade un flujo a un switch | |
| Política | lo que se permite y lo que se prohíbe en la red | |
| Sentido | una dirección del tráfico: la ida o la vuelta | |
| ARP | el mensaje que pregunta qué MAC tiene una dirección IP | |
| Flood | enviar el paquete por todos los demás puertos | actions=flood |
| Drop | descartar el paquete sin responder | actions=drop |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cada regla de la política es una línea
La política del aula cabe en tres reglas. El alumno puede hablar con el servidor, y el servidor con el alumno. El tercer equipo no puede hablar con nadie.
Cada regla es una línea de flujo con la forma de ovs-ofctl: la prioridad, el match y la acción, unidos por comas, sin espacios. Los puertos son 1 el servidor, 2 el alumno y 3 el equipo sin autorizar.
Ejemplo: de la regla a la línea
| Regla | Línea de flujo |
|---|---|
| El alumno habla con el servidor | priority=40,ip,nw_src=172.16.0.20,nw_dst=172.16.0.10,actions=output:1 |
| El tercero no entra por su puerto | priority=100,in_port=3,actions=drop |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
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.
Un flujo mal escrito se rechaza
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=5,actions=nowhereSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Deja pasar del alumno al servidor
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=40,ip,nw_src=172.16.0.20,nw_dst=172.16.0.10,actions=output:1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Bloquea lo que entra por el puerto 3
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=100,in_port=3,actions=dropSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Prueba un paquete del alumno al servidor
sudo ovs-appctl ofproto/trace sw1 in_port=2,ip,nw_src=172.16.0.20,nw_dst=172.16.0.10 | 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.
Prueba un paquete del equipo sin autorizar
sudo ovs-appctl ofproto/trace sw1 in_port=3,ip,nw_src=172.16.0.30,nw_dst=172.16.0.10 | 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.
Cada sentido del tráfico necesita su propio flujo
Un flujo vale para un sentido. El flujo del alumno al servidor no deja pasar la respuesta del servidor al alumno. Para una conversación hacen falta dos.
Prueba primero la respuesta sin su flujo. Después añádelo y repite la prueba.
Prueba la respuesta del servidor
sudo ovs-appctl ofproto/trace sw1 in_port=1,ip,nw_src=172.16.0.10,nw_dst=172.16.0.20 | 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.
Deja pasar del servidor al alumno
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=40,ip,nw_src=172.16.0.10,nw_dst=172.16.0.20,actions=output:2Se 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 de la respuesta
sudo ovs-appctl ofproto/trace sw1 in_port=1,ip,nw_src=172.16.0.10,nw_dst=172.16.0.20 | 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 ping empieza con una pregunta ARP
Antes del primer paquete IP, el alumno necesita la MAC del servidor. La pide con ARP, un mensaje que no es IP.
Si ningún flujo deja pasar ARP, el switch lo descarta y el tráfico IP nunca llega a salir. Hace falta una regla de ARP que inunde el mensaje, con la acción flood.
Prueba una pregunta ARP del alumno
sudo ovs-appctl ofproto/trace sw1 in_port=2,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.
Deja pasar ARP
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=50,arp,actions=floodSe 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 de ARP
sudo ovs-appctl ofproto/trace sw1 in_port=2,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.
ARP desde el equipo sin autorizar
sudo ovs-appctl ofproto/trace sw1 in_port=3,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.
Un error frecuente
Advertencia
Mucha gente cree que basta con dejar pasar el tráfico IP para que un ping funcione. No basta: antes del ping va ARP, y el switch lo descarta si ningún flujo lo permite. Incluye siempre una regla para ARP.