Verificar prácticas de GNS3 con Teuton

per Juan Morote darrera modificació 2022-02-14T23:14:00+02:00
GNS3 es un excelente simulador de red Open Source que ademas se entiende con Teuton a las mil maravillas.

Que nuestros alumnos puedan dedicar gran parte del tiempo a poner en práctica los conceptos teóricos de redes creo que es una de las mejores formas que les podemos ofrecer para aprender. Conceptos como el de default gateway, dirección ip, máscara de red o incluso subnetting, se asimilan mucho mejor si el alumno tiene que configurar una serie de dispositivos por si mismo y hacer que la red funcione. Eso siempre les genera satisfacción.

Desde un punto de vista metodológico, el hecho de utilizar procesos eminentemente prácticos genera un aprendizaje activo, construyendo el conocimiento mediante la experiencia propia, aportando también un alto grado de aprendizaje colaborativo y observacional. 

Un complemento ideal para esta metodología constructivista es la evaluación formadora.

La mejor estrategia para la evaluación formadora es la un feedback constante, donde el profesor, los compañeros o incluso el mismo alumno pueda revisar el resultado de su tarea. De esta forma le podemos dar al alumno la oportunidad de buscar, comparar, colaborar, corregir y en definitiva construir su aprendizaje.

Pero cuando bajamos al barro, la cosa se complica y la teoría que tan buena pinta tiene sobre el papel no es fácil de llevar a la práctica en el aula con 20 o 30 alumnos. Quizá es un problema mio que no se me da demasiado bien el cálculo mental rápido, pero no soy capaz calcular direcciones de red en décimas de segundo mientras otros tres alumnos te piden que les revises si la máscara que han configurado es correcta y dos mas te preguntan porque no les responde el ping al default gateway.... 

Mi propuesta: Dejemos la simulación en manos de GNS3, el feed-back y la evaluación en manos de Teuton y de los alumnos,  y dediquémonos nosotros a ser el soporte de 2º nivel para aquellos casos en los que el alumno se encuentre con verdaderas dificultades.

¿Qué es GNS3?

Tal como dice en su página web:

"Cree, diseñe y pruebe su red en un entorno virtual sin riesgos y acceda a la comunidad de redes más grande para obtener ayudar. Da igual si está estudiando para su primer examen de redes o construyendo una red de telecomunicaciones para todo el estado, GNS3 ofrece una manera fácil de diseñar y construir redes de cualquier tamaño sin necesidad de hardware."

GNS3 nos proporciona un entorno sencillo para la simulación de redes, integrando componentes muy sencillos como los VPCS (PC muy ligero) pero también otros mas complejos, como los routers Cisco o la incorporación de máquinas virtuales de VirtualBox en la misma simulación.

Esta es la topología de red que les doy a los alumnos ya configurada para comprobar el entorno de trabajo. 

esquema GNS3

También integra en el mismo entorno herramientas potentes para analizar tráfico como wireshark.

gns3-02.png

¿Qué es Teuton?

Remitiéndome también a su página web:

"Teuton es una herramienta de test de infraestructura, útil:

Para profesores administradores de sistemas que quieren evaluar máquinas remotas de estudiantes.
Para aprendices de administradores de sistemas que quieren evaluar su proceso de aprendizaje como un juego.
Para administradores de sistemas profesionales que desean monitorizar máquinas remotas.
Teuton nos permite:

Escriba pruebas unitarias para dispositivos reales o virtuales, usando DSL simple.
Verificar el cumplimiento de los requisitos en las máquinas remotas."

Simplificando mucho, podemos definir una serie de comando que podemos ejecutar desde la máquina servidor de Teuton o desde las máquinas de los alumnos, recoger el resultado de dicho comando y evaluarlo en función de si el resultado del comando es el esperado o no.

Por ejemplo si queremos comprobar que el alumno ha configurado correctamente el interfaz de red wg0 con la ip almacenada en la variable host1_ipañadiremos a nuestro test:

target "Configuracion ip Wireguard"
run "ip address show dev wg0", on: :host1
expect get(:host1_ip)

Al lío, un ejemplo sencillo de la integración de ambos

Como yo me inicié en el uso de Teutón gracias al fantástico artículo de Victor Carceler, voy a seguir sus pasos en cuanto a la estructura del mismo a ver si logro el mismo efecto en los lectores del mio ;-)

Os presento la práctica que hago con mis alumnos simplemente para verificar que el entorno en el que vamos a trabajar el resto del curso está bien configurado y completamente operativo.

Yo les proporciono una máquina virtual Ubuntu desktop con las siguientes características:

  • GNS3 correctamente configurado
  • Un proyecto de GNS3 llamado test.gns3 en la que todos los dispositivos están configurados
  • El software de VPN wireguard instalado
  • Un interface de wireguard configurado al que solo le falta las claves y la ip de cada alumno.

y el manual de la actividad donde se describen las tareas que ellos deben desarrollar para poner en marcha su entorno de trabajo.

Desde el servidor donde voy a ejecutar los test creo el proyecto de Teutón:

ubuntu@gns3:~$ teuton new test

[INFO] Creating smx1a project skeleton
* Create dir        => test
* Create file       => test/config.yaml
* Create file       => test/start.rb

Dentro del directorio de destino test tenemos ya creado un archivo config.yaml en el que definiremos los equipos a los que testear y el archivo start.rb en el que definiremos que comandos vamos a ejecutar.

Fichero test/config.yaml

Gracias a la VPN de wireguard tengo a todos mis alumnos dentro de una misma red 10.0.101.0/24 independientemente de si están en clase o en casa, de forma que puedo generar el archivo con el siguiente contenido:

---
:global:
:host1_username: usuario
:host1_password: usuario
:proyecto: /home/usuario/GNS3/projects/test/test.gns3
:folderpr: /home/usuario/GNS3/projects/test
:ip_pc1: 192.168.1.11
:ip_pc2: 192.168.1.12
:ip_pc3: 192.168.1.13
:ip_pc4: 192.168.2.4
:ip_pc5: 192.168.2.5
:ip_r1_e0: 192.168.1.1
:ip_r1_e1: 192.168.2.1
:cases:
- :tt_members: Juan_control
:host1_ip: 10.0.101.41

- :tt_members: ip_10.0.101.102
:host1_ip: 10.0.101.102

- :tt_members: ip_10.0.101.103
:host1_ip: 10.0.101.103

...

- :tt_members: ip_10.0.101.123
:host1_ip: 10.0.101.123

En el fichero se pueden definir una serie variables globales, como el usuario y password de acceso al pc del alumno (host1) o las ips que deben tener los VPCS o routers en la simulación de GNS3 (ip_pc1 o ip_r1_e0)

Fichero test/start.rb

Aquí configuramos cada uno de los comandos que queremos testear en la máquina del alumno.

group "Comprobaciones Practica GNS3 - SMX-M05" do

target "Comprobacion proyecto test"
run "ls #{get(:folderpr)}", on: :host1
expect "Act08.gns3"

target "Existe PC1, PC2, PC3, PC4, PC5 y R1"
run "jq '.topology.nodes[] | select (.name == \"PC2\") | .console' #{get(:proyecto)}", on: :host1
set(:pc2con,result.value)
run "jq '.topology.nodes[].name' #{get(:proyecto)}", on: :host1
expect result.find(['PC1','PC2','PC3','PC4','PC5','R1']).count.eq 6

target "responde ping PC2 --> PC1"
run "echo \"ping #{get(:ip_pc1)} -c 5 -i 1 -w 100\" | curl -m 1 telnet://127.0.0.1:#{get(:pc2con)}", on: :host1
expect "bytes from"

target "responde ping PC2 --> R1E0"
run "echo \"ping #{get(:ip_r1_e0)} -c 5 -i 1 -w 100\" | curl -m 1 telnet://127.0.0.1:#{get(:pc2con)}", on: :host1
expect "bytes from"

target "responde ping PC2 --> R1E1"
run "echo \"ping #{get(:ip_r1_e1)} -c 5 -i 1 -w 100\" | curl -m 1 telnet://127.0.0.1:#{get(:pc2con)}", on: :host1
expect "bytes from"

target "responde ping PC2 --> PC4"
run "echo \"ping #{get(:ip_pc4)} -c 5 -i 1 -w 100\" | curl -m 1 telnet://127.0.0.1:#{get(:pc2con)}", on: :host1
expect "bytes from"

target "responde ping PC2 --> PC5"
run "echo \"ping #{get(:ip_pc5)} -c 5 -i 1 -w 100\" | curl -m 1 telnet://127.0.0.1:#{get(:pc2con)}", on: :host1
expect "bytes from"

end

play do
show
export
end

Cada una de las lineas target corresponden a uno de los items que queremos verificar y de los cuales el alumno tendrá feedback automático para que pueda revisar la configuración si no lo tiene correcto.

GNS guarda toda la configuración de los VPCS, routers, conexiones y demás componentes en el archivo del proyecto test.gns3 en formato json, lo cual nos facilita mucho la labor de verificar el trabajo del alumno.

La utilidad jq nos simplifica las consultas al archivo json. Por ejemplo, el segundo test del archivo start.rb es:

run "jq '.topology.nodes[].name' #{get(:proyecto)}", on: :host1
expect result.find(['PC1','PC2','PC3','PC4','PC5','R1']).count.eq 6

La primera linea nos devuelve una lista con los nombres de todos los nodos configurados en nuestra topologia de GNS3.

La segunda linea comprueba que en ese listado estén todos los elementos requeridos en el proyecto, en este caso PC1, PC2, PC3, PC4, PC5 y R1. Si en el listado de los 6 que se busca hay 6 ocurrencias, el test es correcto, de lo contrario el test fallará, el alumno tendrá que indagar el motivo del error y añadir el elemento que se haya dejado.

Con la simple verificación del archivo del proyecto GNS3 json, podríamos verificar prácticamente todo lo que se nos ocurra:

  • La configuracion ip/mascara de los VPCS
  • La correcta conexión de los nodos con otros nodos
  • La configuraciones de rutas de los routers
  • ...

Hay otro test que me parece también muy interesante y es el de comprobar la configuración ejecutando comandos ping desde cualquiera de los VPCS del proyecto.

Cuando GNS3 abre la consola de linea de comandos de uno de sus nodos, lo que hace en realidad es un telnet por la interfaz de loopback usando un puerto para cada uno de dichos nodos.

En el segundo test lanzamos un comando con el único objetivo de conocer el puerto por el que conectarnos a la consola del PC2 y almacenarlo en la variable :pc2con  

run "jq '.topology.nodes[] | select (.name == \"PC2\") | .console' #{get(:proyecto)}", on: :host1
set(:pc2con,result.value) 

Ahora que sabemos el puerto de la consola del PC2 podemos hacer los pings como en el tercer test del archivo:

target "responde ping PC2 --> PC1"
run "echo \"ping #{get(:ip_pc1)} -c 5 -i 1 -w 100\" | curl -m 1 telnet://127.0.0.1:#{get(:pc2con)}", on: :host1
expect "bytes from"

Ejecucion del test y FeedBack 

Yo suelo añadir la ejecución del proyecto de Teuton en el cron, de forma que se vaya ejecutando cada pocos minutos. Con la única precaución de que no se solapen ejecuciones puesto que eso suele acabar mal.

En cuanto al feedback al alumno hay varias alternativas. 

Teuton incorpora la posibilidad de enviarle el archivo de comprobación al alumno y dejarlo en su máquina, de forma que el alumno lo puede consultar y ver cual de los test ha superado y cual debe revisar.

A mi me gusta mas la opción de darles un panel web donde este proceso sea mas visual y que lo perciban casi como un reto o un juego, en el que hay que poner todas las casillas en verde para tener un 10 y marcharse con una notaza para contar en casa. 

Para esto último me hice un pequeño script que con los ficheros de resultados que genera teuton monta un código html sencillo, que publico en el propio servidor apache donde corro Teuton para que lo puedan consultar los alumnos.

Aquí tenéis un ejemplo en el que cada linea es un test y cada columna es un alumno.

gns3-03.png

Bueno, pues esta es mas o menos la forma en la que uso estas dos magníficas herramientas en el aula para ver si mis consigo atraer a mis alumnos al oscuro mundo de las redes o como mínimo que la experiencia en el aula les parezca motivadora. Espero que os parezca interesante y que os anime a utilizarlo en el aula.

Os dejo un resumen a los enlaces con los códigos, archivos, etc...