MANUAL DE MININET Creación de topologías SDN Por Bruno Cárdenas
CONTENIDO 1. INTRODUCCIÓN 1.1.- VIRTUALIZACIÓN 1.2.- SOFTWARE DEFINED NETWORKS 2. OBJETIVOS DEL MANUAL 2.1.- DESCARGA DE LA IMAGEN VM-MININET 2.2.- INSTALACIÓN DE VIRTUALBOX 2.3.- CONFIGURACIÓN DE LA MÁQUINA VIRTUAL 2.4.- USO DEL WIRESHARK 3. CREACIÓN DE TOPOLOGÍAS CON CLI 3.1. TOPOLOGÍA BÁSICA CON CLI 3.2- DESCRIPCIÓN DE LAS LÍNEAS DE COMANDO 3.3.- TOPOLOGÍA TIPO ÁRBOL CON CLI 4. CREACIÓN DE TOPOLOGÍAS CON PYTHON 4.1- TOPOLOGÍA LINEAL CON PYTHON 4.2- ESCENARIO NAT CON PYTHON
CONTENIDO 1. INTRODUCCIÓN 1.1.- VIRTUALIZACIÓN 1.2.- SOFTWARE DEFINED NETWORKS 2. OBJETIVOS DEL MANUAL 2.1.- DESCARGA DE LA IMAGEN VM-MININET 2.2.- INSTALACIÓN DE VIRTUALBOX 2.3.- CONFIGURACIÓN DE LA MÁQUINA VIRTUAL 2.4.- USO DEL WIRESHARK 3. CREACIÓN DE TOPOLOGÍAS CON CLI 3.1. TOPOLOGÍA BÁSICA CON CLI 3.2- DESCRIPCIÓN DE LAS LÍNEAS DE COMANDO 3.3.- TOPOLOGÍA TIPO ÁRBOL CON CLI 4. CREACIÓN DE TOPOLOGÍAS CON PYTHON 4.1- TOPOLOGÍA LINEAL CON PYTHON 4.2- ESCENARIO NAT CON PYTHON
1.- INTRODUCCIÓN Conceptos 1.1.- VIRTUALIZACIÓN (MiniNet) Virtualización es la creación -a través de software- de una versión virtual de algún recurso tecnológico. Esto puede ser hardware virtualization, platform virtualization, server virtualization o network virtualization. MiniNet es un banco de pruebas de red virtual que ayuda a los investigadores que deseen innovar y estudiantes que le gustaría entender el funcionamiento de las redes informáticas. MiniNet principalmente gana importancia en el estudio e implementación de Software Defined Network.
1.2.- SOFTWARE DEFINED NETWORKS (SDN) SDN es una de las más emergentes y prometedoras tecnologías de red en los últimos años. Se refiere a una infraestructura de red en la que el plano de control es desacoplado del plano que envía los paquetes de datos. Esta separación permite la aplicación del plano de control en un software externo, entidad llamada controlador, y la implementación del plano de datos en el Switch. El Switch simplemente se centra en la tarea de reenvío. Este enfoque ayuda en la prueba rápida y implementación de nuevas ideas. También aumenta la flexibilidad y agilidad, facilita una mayor tasa de innovación, y reduce complejidad, así como el costo de los elementos de conmutación.
2.- OBJETIVOS DEL MANUAL
Descarga de imagen de máquina virtual mininet (mininet vm image).
Instalación de VirtualBox.
Configuración de la máquina virtual.
Uso del wireshark en la vm (máquina virtual).
Uso de lineas de comandos (CLI) para crear topologías de una manera simple.
Manejo de python para crear topologías más personalizadas.
*IMPORTANTE
De ahora en adelante vamos a desarrollar los pasos detallados suponiendo que estamos trabajando sobre un S.O. de Windows ya que es el más usado actualmente, de este modo el manual será más práctico.
Empecemos ingresando a la siguiente página http://mininet.org
En esa página encontraremos en la toda la información acerca de mininet y todas las posibilidades que nos deparan con el SDN. Por el momento nos concentraremos en la instalación de mininet-VM y el aprendizaje básico de topologías de red.
MiniNet es un emulador de red que crea una red de hosts virtuales, conmutadores, reguladores, y enlaces por lo tanto requiere ser ejecutado sobre una PC o laptop de media a alta gama para gozar de una mejor performance.
2.1.- DESCARGA DE LA IMAGEN VM-MININET Paso 1: Nos dirigimos al siguiente enlace: https://github.com/mininet/mininet/wiki/Mininet-VM-Images Paso 2: Elegimos la siguiente opción:
•
Así de simple, una vez descargada la imagen la descomprimimos y seguimos con el paso de instalación del VirtualBox.
2.2.- INSTALACIÓN DE VIRTUALBOX Paso 1: Ahora nos dirigimos al siguiente enlace: https://www.virtualbox.org Paso 2: Descargamos la última versión y realizamos una instalación Típica. Paso 3: Una vez instalada la VirtualBox procederemos a configurar la VM descargada previamente y al abrir el programa se verá la siguiente ventana:
2.3.- CONFIGURACIÓN DE LA MÁQUINA VIRTUAL Paso 1: Una vez ejecutándose VM VirtualBox damos click en el botón “Nueva” para crear una máquina virtual, luego procedemos a introducir el nombre que deseemos para nuestra nueva VM, tipo Linux y versión Ubuntu (32 bit) y le damos en “Next”.
Paso 2: Cambiamos el tamaño de la memoria a 1024 (recomendable para los requerimientos de trabajo) y luego clickeamos “Next”.
Paso 3: Elegimos la tercera opción y buscamos archivo descomprimido previamente para abrirlo, por último le damos Click en “Crear”.
Paso 4: Ahora ya tenemos la VM creada:
Paso 5: Es hora de configurar las redes de la VM creada, nos vamos a la pestaña “Archivo” donde seleccionamos “Preferencias” para luego ubicarnos en la opción “Red”:
Paso 6: Ya que estamos en la pestaña de Redes Nat vamos a eliminar NatNetwork seleccionando la opción (-). Paso 7: Ahora volvemos a crear una nueva seleccionando la opción (+) y luego Aceptar.
Paso 8: Seguidamente regresamos a la ventana principal y seleccionamos el botón “Configuración” y nos vamos a “Redes”, ya ahí nos vamos a la pestaña “Adaptador 2” donde habilitamos el Adaptador de Red y seleccionamos “Adaptador sólo-anfitrión”, por último le damos a OK.
Paso 9: Ahora que ya tenemos lista la VM procedemos a encenderla dándole doble click y nos logeamos escribiendo mininet para el login y password:
Paso 10: Procedemos a digitar el comando ifconfig para visualizar el información de las interfaces:
Paso 11: A simple vista nos damos cuenta de la ausencia de la interface eth1, para visualizarla habrá que ejecutar el comando inconfig –a:
Paso 12: Para asignarle una dirección ip automáticamente a eth1 introducimos el comando sudo “dhclient eth1”, luego verificamos que su ip es 192.168.56.101:
Paso 13: Para fijar permanentemente ésta ip haremos una configuración en las interfaces tipo nano (editor) introduciendo la siguiente linea:
•
A continuación nos trasladaremos al editor nano y veremos lo siguiente:
Paso 14: Ahora procederemos a editar de la siguiente manera y para guardar los cambios presionar Ctrl + O, doble Enter y para salir Ctrl + X:
Paso 15: Ahora vamos a instalar una interface gráfica para la VM, su importancia es crucial para usar Wireshark, para ello necesitamos descargar un servidor X Xming del siguiente Link: http://sourceforge.net/projects/xming/ Paso 16: Realizamos una instalación típica y ejecutamos el programa. •
Aparentemente no se observará algún indicio de que se esté ejecutando Xming, para verificar esto nos vamos al lado del reloj de Windows y desplegamos los programas para verificar:
Paso 17: Ahora descargamos PuTTY de la siguiente página: http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe
Paso 18: Ejecutamos PuTTY, desplegamos SSH y nos ubicamos en X11 para marcar el cuadro “Enable X11 forwarding”.
Paso 19: Ahora nos vamos a la Categoría “Session” e introducimos la ip de eth1 que obtuvimos en la diapostiva #18, finalmente le damos click a Open:
Paso 20: Se abrirá la ventana de PuTTY donde nos logearemos del mismo modo que en la VM (mininet/mininet):
Paso 21: Una vez logeados procederemos a ejecutar la línea “xterm” para abrir la interfaz gráfica donde trabajaremos de ahora en adelante por comodidad:
2.4.- USO DEL WIRESHARK Paso 1: Para poder visualizar los paquetes OpenFlow que pasan entre los dispositivos que crearemos pronto es necesario ejecutar el Wireshark, lo haremos escribiendo el siguiente comando:
Paso 2: Ahora que tenemos abierto el Wireshark nos ubicamos en filtros “Filter” y escribimos “of”, esto permitirá visualizar únicamente los paquetes OpenFlow, seguido de ello hacemos click en Apply:
Paso 3: Nos ubicamos en el botón de Lista de Captura para seleccionar las interfaces de las que analizaremos el flujo, se abrirá una ventana donde marcaremos “eth1” y “any”, finalmente presionamos Start:
Paso 4: Ahora nos encontraremos en una ventana que capturará los paquetes OpenFlow, ahora sale vacía pues no hemos empezado a crear flujos aún:
3.- CREACIÓN DE TOPOLOGÍAS CON CLI 3.1. Topología básica con CLI
Paso 1: ¡Ya tenemos todo listo! Empezaremos usando líneas de comandos (CLI) ya que es la manera más sencilla de crear topologías en mininet. Ejecutando “sudo mn”
creamos una topología muy simple que consta de un Controlador c1, un Switch s1 y dos hosts h1 y h2.
Paso 2: Ahora vamos a la ventana del Wireshark y podemos observar que aparecen varios flujos OpenFlow, el análisis de éstos mensajes escapa del manual, ahora simplemente usaremos el Wireshark para verificar el flujo:
Paso 3: Haremos un ping general para verificar el estado de nuestra topología, con el comando “pingall”, como podemos observar hemos hecho un ping entre cada host, 0% dropped indica que el total de paquetes llegaron a su destino:
Paso 4: Vamos a la ventana del Wireshark y podemos observar que un flujo nuevo de paquetes, podemos identificar el ip del controlador c1 127.0.0.1 y de los hosts h1 10.0.0.1y h2 10.0.0.2, estos se generan por defecto:
•
Es hora de probar una topología más complicada, los comandos CLI nos permiten especificar las características de la topología que crearemos, el número de switches, el número de host, los ip de cada dispositivo, el ancho de banda de enlace, etc.
3.2- Descripción de las Líneas de Comando Aquí les dejo una lista de las opciones más importantes para creación de topologías en mininet: --topo=TOPO representa a la topología de la red virtual, donde TOPO puede ser: minimal – esta es la topología por defecto con 1 switch y 2 host. single,X – 1 switch con X host enlazados a él. lienar,X – crea switches conectados de forma linealm cada sw con un host ligado. tree,X - crea una topo tipo árbol donde X es el número de ramas. --switch=SWITCH crea diferentes tipos de switches, como: ovsk – este es el switch por defecto Open vSwitch que viene instalado en la VM. user – es el switch que se ejecuta en el espacio de nombres de software (es más lento). --controller=CONTROLLER donde el controlador puede ser: ovsc – crea un controlador OVS Controller por defecto que viene instalado en el VM. nox – crea al bien conocido NOX Controller. remote – NO crea un controlador sino que escucha para las conexiones de controladores externos. --mac configura direcciones MAC fáciles de leer para los dispositivos.
Para ver los nodos de la topología se ejecuta el comando “ dump”.
Para ver enlaces entre los nodos se ejecuta el comando “net”.
Ahora vamos a poner en práctica los comandos vistos previamente, pero primero para salir de la topología ejecutamos “exit” y luego para borrarla escribimos el comando “sudo mn –c”:
3.3. Topología tipo Árbol con CLI
Paso 1: Una vez borrada la topología anterior, procedemos a crear otra más compleja ejecutando la siguiente línea de comando:
sudo mn --topo tree,depth=2,fanout=3 --mac --switch ovsk --controller ovsc
La novedad aquí es que hemos especificado una topología tipo árbol (tree), que al ponerle 2 al valor de depth indicamos que tenga 2 niveles de switches y al ponerle 3 al valor de fanout indicamos que de cada nodo se abrirán 3 ramas.
De inmediato se crean los dispositivos de la red, los links se muestran entre paréntesis los cuales enlazan switches con switches y switches con hosts.
Paso 2: Luego hacemos un “pingall” y observamos en el wireshark que efectivamente hay un flujo de mensajes entre cada host con su respectivo ip:
4.- CREACIÓN DE TOPOLOGÍAS CON PYTHON Hay una forma alternativa de crear topologías en mininet, y es usando Python. Python es un lenguaje de programación multiparadigma que nos va a ser de gran ayuda a la hora de crear las topologías ya que cuenta con librerías especiales para trabajar con mininet. En éste manual aprenderemos cómo usar estas librerías que nos permitirán crear enlaces, dispositivos de red, definir ip’s, etc. Antes de empezar les dejo una lista de las principales Clases, Métodos, Funciones y Variables que usaremos en nuestra programación en Python orientada a Mininet: Topo: La clase base para las topologías Mininet. build(): El método para anular en su clase de topología. Parámetros contructores (n) serán pasados a través automáticamente por Topo.__init__(). addSwitch(): Agrega un Switch a una topología y retorna el nombre del Switch addHost(): Agrega un Host a una topología y retorna el Hostname addLink(): Agrega un Link bidireccional a una topología. Los Links en Mininet son bidireccionales al menos que se especifique lo contrario. Mininet: Clase principal para crear y administrar una red. start(): Inicia tu Red. pingAll(): Hace un ping entre todos los nodos. stop(): Detiene tu Red. net.hosts: Todos los hosts en una red. dumpNodeConnections(): Deshace conexiones a/de un set de nodos. setLogLevel( 'info' | 'debug' | 'output' ): establece el nivel de salida por defecto de MiniNet; Se recomienda 'info' para proveer información útil.
4.1- Topología Lineal con Python Paso 1: Para empezar nos ubicamos dentro de la carpeta examples usando la siguiente ruta:
Paso 2: Ahora vamos a crear una topología entrando al editor nano y nombrándola como gustemos: “sudo nano lineal.py”. •
Este comando nos llevará a un editor de python donde empezaremos a escribir nuestro código.
Como podemos apreciar el editor de python tiene una lista de opciones en la parte inferior las cuales se activan presionando la letra indicada al mismo tiempo que el botón CTRL del teclado.
Paso 2: Vamos a utilizar las librerías mininet.net y mininet.topo de las cuales importaremos las funciones Mininet y Linear Topo. Paso 3: Igualamos la variable Linear a la función LinearTopo de k=4 la cual nos indica el número de switches lineales que creará dicha función. Paso 4: Igualamos la variable net a la función Mininet especificando que la topología va a ser igual a la variable Linear previamente definida. Paso 5: Por último llamamos a las funciones net.start() para iniciar la red, net.pingAll() para hacer un ping general y net.stop() para finalizar la red.
Paso 6: Luego de escribir este código en el editor procedemos a guardarlo con Ctrl+O, doble Enter y Ctrl+X.
Paso 7: Regresaremos a la ventana de la VM donde probaremos nuestra topología escribiendo el siguiente comando: sudo python lineal.py
•
Si capturamos los paquetes con Wireshark podremos verificar que efectivamente se ha realizado un ping general entre los 4 hosts creados con el python:
4.2- Escenario NAT con Python
•
Tenemos un escenario que nos indica hacer un NAT para 2 redes de host pares e impares.
Paso 1: Usaremos el editor de Python para lograr crear el escenario, nos ubicamos en el editor escribiendo lo siguiente:
Paso 2: Una vez en el editor procederemos a importar las librerías necesarias para el escenario, son las siguientes: -mininet.topo -mininet.net -mininet.nodelib -mininet.log -mininet.cli
Paso 4: Copiamos el siguiente código (la explicación está en las mismas líneas de códigos):
Paso 5: Guardamos todo con CTRL+O y salimos con CTRL+X. Es hora de probar nuestro escenario.
Paso 6: Ejecutamos nuestra topología con el siguiente comando:
sudo python BRUNOnateo.py
Paso 7: Ahora vamos a mostrar los nodos y los enlaces con los comandos ya aprendidos: “dump” y “net”