Mininet Walkthrough
Presentado a:
PhD. Oscar Mauricio Caicedo Rendón
Presentado por:
Jaime Esteban Villamizar Rojas
Juan Sebastian Orozco Monje
Universidad del Cauca
FIET
Ingeniería Electrónica y Telecomunicaciones
Énfasis lll - Aplicaciones y Servicios Telemáticos
Popayán 16 de mayo de 2023
Primera Parte: Uso Diario de Mininet
Mostrar Opciones de Inicio
Abriendo las opciones de inicio de Mininet, se usa el comando: $ sudo mn -h
Figura 1.
Iniciar Wireshark
En resumen, para poder ver el tráfico de control utilizando el disector OpenFlow en
Wireshark, se puede abrir Wireshark en segundo plano ejecutando el comando "$ sudo
wireshark &". Esto permite utilizar la herramienta de inmediato sin requerir configuraciones
o instalaciones adicionales.
Figura 2.
Interactuando con host y conmutadores
Se pone en marcha la topología que tiene por defecto mininet con el comando “$ sudo mn” y
adicionalmente corre la CLI de mininet
Figura 3.
Mostrar comandos CLI de Mininet.
Figura 4.
Mostrar nodos:
Figura 5.
Mostrar links
Figura 6.
Volcar información de los nodos. Donde efectivamente se deben ver un switch y dos hosts en
la lista.
Figura 7.
Ejecutando un comando en uno de los procesos de host
Figura 8.
En la imagen proporcionada anteriormente, se pueden observar las interfaces de host
(h1-eth0) y loopback (lo). Es importante tener en cuenta que la interfaz (h1-eth0) no es
visible para el sistema principal de Linux cuando se ejecuta el comando ifconfig. Esto se debe
a que esta interfaz es específica del espacio de nombres de red del proceso de host.
Por otro lado, el conmutador se ejecuta en el espacio de nombres de red raíz de forma
predeterminada. Esto significa que ejecutar un comando en el "conmutador" es equivalente a
ejecutarlo desde una terminal normal en el sistema.
Figura 9.
Al ejecutar los comandos arp y route en h1 y s1, se puede observar cómo los hosts tienen un
estado de red aislado, destacando así los ejemplos. Esto es posible porque solo la red está
virtualizada, lo que significa que cada host ve el mismo conjunto de procesos y directorios.
Figura 10.
Para imprimir la lista de procesos desde un proceso de host, se utiliza el comando:
"h1 ps -a".
Figura 11.
Por otro lado, para imprimir la lista de procesos desde un proceso de conmutador, se debe
ejecutar el comando correspondiente. “s1 ps -a”
Figura 12.
Prueba de conectividad entre host
Verificando la conectividad haciendo ping entre el h1 y h2.
Figura 13.
Se repite el comando para hacer ping entre ambos host, para lo cual, se obtiene un tiempo
menor al caso anterior.
Figura 14.
Otra forma de ejecutar esta prueba es usar el comando “pingall” que hace ping entre los
pares.
Figura 15.
Ejecución de un servidor web y un cliente simples
Para iniciar un servidor HTTP simple en h1 se utiliza el comando: h1 python3 -m [Link]
80 &, luego se realiza una solicitud de h2 a h1. y finalmente se apaga el servidor web con h1
kill %python:
Figura 16.
Para averiguar la versión de python que está usando Mininet, se usa en el CLI el comando py
[Link]. Como se observa en la imagen se cuenta con Python 3 en su versión 3.10.6
Figura 17.
Finalmente para salir del CLI de mininet se usa el comando “exit”.
Figura 18.
Limpiar
Para evitar que Mininet colapse o en caso de que haya fallado por algún motivo, con este
comando “mn -c” se logra limpia:
Figura 19.
Segunda Parte: Opciones de inicio avanzadas
Ejecutar una prueba de regresión
Se abre el CLI de Mininet para ejecutar una prueba de regresión independiente con el
siguiente comando “mn –test pingpair”.
Figura 20.
Este comando creó una topología mínima, inició el controlador de referencia de OpenFlow,
ejecutó una prueba de ping de todos los pares y eliminó tanto la topología como el
controlador.
Se puede realizar otra prueba usando el comando “mn –test iperf”. Este comando crea la
misma Mininet, ejecuta un servidor iperf en un host, ejecuta un cliente iperf en el segundo
host y analiza el ancho de banda logrado.
Figura 21.
Cambiar el tamaño y tipo de tipología
Las topologías parametrizadas son una de las características más valiosas y potentes de
Mininet. La topología predeterminada consiste en un switch conectado a dos hosts. Sin
embargo, esta topología puede modificarse utilizando el comando "--topo" junto con
parámetros adicionales para crear una topología diferente.
Por ejemplo, para comprobar la conectividad de ping entre varios pares con un switch y tres
hosts, se ejecuta el siguiente comando: “mn –test pingall - - topo single,3”.
Figura 22.
Otro ejemplo, es obtener una topología lineal, es decir, donde cada conmutador tiene un host
y todos los conmutadores se conectan en una línea, se ejecuta el siguiente comando
“mn –test pingall - - topo linear,4”.
Figura 23.
Variaciones de enlace
Mininet permite establecer parámetros del enlace, e incluso se pueden configurar
automáticamente desde la línea de comando como se ve a continuación:
“$ sudo mn –link tc, bw=10, delay=10ms”
Figura 24.
Se establece el retardo de cada enlace de 10 ms, por lo cual el tiempo de ida y vuelta (RTT)
es aproximadamente de 40 ms ya que la solicitud de ICMP atraviesa dos enlaces (uno al
conmutador y otro al destino) y la respuesta de ICMP atraviesa dos enlaces de regreso .
Figura 25.
Verbosidad ajustable
Se utiliza el comando “$ sudo mn –v debug”, para ver la salida completa de depuración
usando el parámetro -v
Figura 26.
Figura 27.
Topologías personalizadas
Es posible definir topologías personalizadas de manera sencilla utilizando una API de
Python. Al proporcionar un archivo personalizado de Mininet, se pueden agregar nuevas
topologías, tipos de switches y pruebas a la línea de comandos.
● Identificación = MAC
Por defecto, los hosts se inician con direcciones MAC asignadas de forma aleatoria
cada vez que se crea una instancia de Mininet, lo que dificulta la correlación del
tráfico de control con hosts específicos. Para configurar direcciones MAC o IP
personalizadas para los hosts, se pueden utilizar identificadores pequeños, únicos y
fáciles de leer. Esto se logra mediante el siguiente comando:
Figura 28.
Pantalla XTerm
Para realizar una depuración más compleja, se puede iniciar Mininet para que genere uno o
más Xterms. Para generar un xterms para cada host y conmutador se utiliza el parámetro -X.
Figura 29.
Aparecen los xterms, con nombres de ventana configurados automáticamente.
Otro tipo de Switch
Para ejecutar el cambio de espacio de un usuario se utiliza el siguiente comando:
Figura 30.
Al utilizar el comando "--switch user" en Mininet, se indica que se debe utilizar el módulo
UserSwitch, el cual implementa un switch dentro del kernel de Linux. Sin embargo, es
importante destacar que el ancho de banda obtenido al utilizar este enfoque (619.4 Mbits/s) es
más bajo en comparación con el ancho de banda generado con el comando "$ sudo mn –test
iperf" (36 Gbits/s).
El bajo rendimiento observado en el caso de "--switch user" puede ser atribuido a varias
razones. Una posible explicación es que el módulo UserSwitch puede tener una menor
capacidad de procesamiento y rendimiento en comparación con otros enfoques de
conmutación disponibles en Mininet.
Mininet ofrece otro tipo de switch llamado Open vSwitch (OVS), el cual está preinstalado en
la máquina virtual de Mininet. Para utilizar el switch OVS en lugar del switch de usuario, se
utiliza el comando "--switch ovsk".
Por otro lado, el comando "--test iperf" se utiliza para realizar una prueba de ancho de banda,
y se muestra el resultado de dicha prueba. Es esperado que el ancho de banda reportado por
iperf sea similar al del kernel de OpenFlow y posiblemente más rápido.
El fin de emplear el comando "--switch ovsk" en Mininet, es utilizar el switch OVS en lugar
del switch de usuario. Al realizar una prueba de ancho de banda con "--test iperf", se espera
obtener resultados de ancho de banda similares o incluso más rápidos en comparación con el
kernel de OpenFlow.
Punto de referencia Mininet
Para registrar el tiempo de configuración y eliminación de una topología, se utiliza el
siguiente comando: “$ sudo mn --test none”.
Figura 31.
El siguiente comando se utiliza para medir el tiempo requerido para configurar y desmontar
una topología de red sin realizar ninguna prueba en particular. El parámetro "--test none"
indica que no se debe llevar a cabo ninguna prueba específica en la topología.
Todo en su propio espacio de nombres (solo switch de usuario). En este caso, la
configuración de la red se realiza utilizando únicamente switches de usuario, lo que implica
que cada host y switch se colocan en su propio espacio de nombres.
Por defecto, los hosts se encuentran en su propio espacio de nombres, mientras que los
switches y controladores se sitúan en el espacio de nombres raíz. Sin embargo, para colocar
los switches también en su propio espacio de nombres, se utiliza el siguiente comando:
Tercera Parte: Comandos de la Interfaz de Línea de Comandos (CLI) de
Mininet
Opciones de pantalla
Muestran las opciones con el comando help.
Figura 32.
Intérprete de Python
Cuando una línea en Mininet inicia con py, se ejecutan comandos de Python, como por
ejemplo: py ‘hello’ + ‘world’, ejecutado en el CLI de Mininet.
Figura 33.
Se puede imprimir las variables locales accesibles de la siguiente forma:
Figura 34.
Los métodos y propiedades disponibles para un nodo se pueden observar usando la función
dir().
Figura 35.
También se puede leer la documentación en línea de los métodos disponibles en un nodo
utilizando la función de help(), presionando ‘q’ para salir.
Figura 36.
Figura 37.
Finalmente, se evalúa los métodos de variables de la siguiente forma:
Figura 38.
Enlace arriba/ abajo
Para las pruebas de tolerancia a fallas, puede ser útil subir o bajar los enlaces.
Para deshabilitar un par de enlaces ethernet virtual, se usa el comando link s1 h1 down. Sin
embargo, no se generó notificación alguna con respecto al cambio de estado del puerto
OpenFlow.
Figura 39.
Para recuperar el enlace se usa:
Figura 40.
Visualización de XTerms
Para mostrar un Xterm para h1 y h2, se utiliza el comando xterm h1 h2
Figura 41.
Cuarta Parte: Ejemplos de la API de Python
Demonio SSH por Host
Un ejemplo que puede ser particularmente útil es ejecutar un demonio SSH en cada host,
utilizando el siguiente comando: “$ sudo ~/mininet/examples/[Link]”
Figura 42.
Y desde otra terminal se puede acceder a cualquier host y ejecutar comandos interactivos
como ssh y ping.
En el ejemplo accedemos al host 1 con ssh [Link] y se realiza ping a la dirección del host 2
[Link], como se observa en la figura 43 la comunicación es exitosa.
Figura 43.
Apéndice: Información Complementaria
Uso de un control remoto
Esta parte es adicional sin embargo es muy útil si se tiene un controlador fuera de la la
máquina virtual.
Se desea probar el ejemplo para ejecutar el interruptor de aprendizaje de muestra de POX con
los comandos:
“$ cd ~/pox”
“./[Link] fordwarding. l2_learning”
Figura 44.
y en otra ventana, se inicia Mininet para conectarse al “Controlador remoto”, entre comillas
porque en este caso se ejecuta localmente, pero fuera de Control de mininet.
Figura 45.
Ejercicio en clase
Se pide realizar la siguiente topología de red SDN
Figura 46. Topología lineal con dos switchs y un host en cada switch
Primero corremos wireshark para capturar los mensajes
“sudo -E wireshark &”
Figura 47. wireshark listo para capturar
Creación de la topología
Para que funcione esta topología se usa el siguiente comando “sudo mn --topo=linear,2” ,
donde muestra los 2 host (h1, h2), un switch (s1) y un controlador (c0), junto con sus
respectivos enlaces entre cada uno de dichos componentes de la topología.
Figura 48.
En la siguiente imagen se usa el comando “dump” para mostrar los nodos de la topología
Figura 49.
Re realiza ping entre h1 y h2 para comprobar su comunicación.
Figura 50.
Se capturan los mensajes que se envían para establecer comunicación entre los host h1 y h2
primeramente filtramos por OpenFlow, después con ARP y finalmente icmp.
Figura 51. Captura de datos con el protocolo openflow_v1.
Figura 52. Captura de mensajes con protocolo ARP.
Figura 52. Captura de mensajes con protocolo ICMP.
Con la captura de estos mensajes se desarrolla el Diagrama de secuencia cuando se hace
ping entre h1 y h2
Figura 53. Diagrama de secuencia