Laboratorio WireGuard: construye un túnel VPN entre dos sedes en el navegador

Este laboratorio da a cada alumno dos sedes pequeñas que unir. Se construyen cuatro máquinas dentro de la única máquina virtual Ubuntu del alumno: un equipo y una puerta de enlace en cada sede, con las dos puertas de enlace unidas por un enlace que hace de internet y no conoce ninguna de las dos redes privadas. El alumno construye un túnel WireGuard entre las puertas de enlace, hasta que un equipo de una sede puede hacer ping a uno de la otra.

No se instala nada en el ordenador del alumno ni hace falta ningún equipo VPN: cada equipo y cada puerta de enlace es un espacio de nombres de red, y el túnel es el WireGuard real que ofrece el núcleo de Ubuntu, con los comandos reales wg y wg-quick.

Qué aprenden los alumnos

Cómo un túnel VPN une dos redes privadas: crear un par de claves en cada puerta de enlace con wg genkey y wg pubkey, y por qué una clave privada no debe poder leerla nadie más; escribir wg0.conf con una dirección para el túnel, el par de cada puerta de enlace y las redes que pueden enviarse a él; levantar el túnel y leer wg show para ver el intercambio de claves (handshake); y encaminar las dos redes por él. Observan el enlace de internet con tcpdump y ven que lo que lo cruza es UDP cifrado, y consiguen que el túnel vuelva a levantarse desde sus archivos guardados tras un reinicio.

La topología

La sede A es el equipo a1 en 10.1.0.0/24 tras la puerta de enlace gwA, y la sede B es el equipo b1 en 10.2.0.0/24 tras la puerta de enlace gwB. Las puertas de enlace se unen por 203.0.113.0/24, internet, que no tiene ruta hacia ninguna de las dos redes privadas y nunca debe recibirla. Un ping de a1 a b1 falla hasta que se construye el túnel. Los archivos de WireGuard de cada puerta de enlace están en su propio /etc/wireguard, que en la máquina virtual es /etc/netns/gwA/wireguard y /etc/netns/gwB/wireguard. Las direcciones están en el README que el laboratorio deja en la carpeta personal, que dice qué hacer y no da ninguna respuesta.

Ejecútalo en tu navegador

Los laboratorios de máquina virtual se asignan como tarea de laboratorio en un módulo, y el ejemplo está en la página del laboratorio. La máquina es pequeña: una CPU, 1 GB de memoria y 10 GB de disco.

  1. Añade el laboratorio. En un módulo que impartes, añade una tarea y elige la tarjeta «Laboratorio de máquina virtual Ubuntu». La página muestra una breve descripción de la máquina en lugar de un archivo compose.
  2. Parte del ejemplo. La página ofrece laboratorios de ejemplo para empezar. Elige WireGuard tunnel. Usar un ejemplo sustituye el texto, y «Deshacer» recupera el tuyo.
  3. Publica e inicia tu propia copia. Publica y después pulsa «Iniciar». El script de preparación del laboratorio instala wireguard-tools y tcpdump desde el archivo de Ubuntu, y escribe el comando wglab y el README la primera vez que se inicia la máquina virtual, en unos segundos.
  4. Abre el terminal. Abre su terminal y lee README.md en la carpeta personal: dice qué hay que construir y no da ninguna respuesta.

Una lección básica en este laboratorio

WireGuard Basics es una lección pequeña que se trabaja en este laboratorio, que es una máquina virtual Ubuntu: cada paso se explica y tiene un botón Ejecutar que escribe su comando en el terminal de la máquina y muestra lo que imprimió. El alumno conoce las máquinas, hace ping al equipo lejano y recibe Destination Net Unreachable, lee las dos rutas de la puerta de enlace para ver por qué, y comprueba que wg show no imprime nada porque todavía no hay túnel.

La lección mira alrededor y deja al alumno la tarea propia del laboratorio, construir el túnel, así que no da ninguna respuesta. Es pequeña a propósito: muestra al docente lo que es una lección trabajada en un laboratorio, y el laboratorio hace el resto. Cópiala en un módulo tuyo para cambiarla.

Cómo se califica

El laboratorio tiene una comprobación. Se ejecuta sobre una copia de la máquina guardada tras un arranque nuevo, así que solo ve lo que el alumno guardó en el wg0.conf de cada puerta de enlace, y se supera solo si el estado real se cumple: las configuraciones solo las puede leer su propietario, cada una nombra la clave pública de la otra puerta de enlace, las dos tienen un intercambio de claves reciente, un ping entre los equipos mueve bytes por el túnel, y una captura en el enlace de internet muestra solo UDP y ninguna dirección privada. Una simple ruta estática entre las dos redes no lo supera, ni un túnel levantado a mano y nunca guardado, y la primera línea de lo que imprimió la comprobación dice por qué.

  1. Asígnalo. Asigna el laboratorio como cualquier tarea, con una fecha de entrega si quieres. Cada alumno recibe una máquina virtual propia, que se conserva de una sesión a otra.
  2. Ejecuta la comprobación. En la fila de un alumno de la lista de la clase, pulsa «Ejecutar la comprobación». Inicia una copia de su máquina guardada, sin guardar nada de vuelta, ejecuta como root el script de comprobación del laboratorio y muestra si se superó, qué imprimió y cuándo. Al alumno no se le comunica el resultado.
  3. Califícalo. Lee la primera línea de lo que imprimió la comprobación: dice qué no está bien, por ejemplo una clave que cualquiera puede leer o un ping que no pasó por el túnel. Devuelve el trabajo con un motivo si necesita más.

La definición en GitHub

El archivo es la definición completa del laboratorio, el mismo texto que ejecuta la plataforma: tamaño, script de preparación, herramienta de topología, README y comprobación. Cópialo y cambia las direcciones, o añade una tercera sede, para hacer un laboratorio más largo.

Preguntas frecuentes

¿El laboratorio necesita un equipo VPN o una licencia?
No. WireGuard es software libre, y el túnel lo hace el módulo del núcleo de Ubuntu con el paquete wireguard-tools, que se instala desde el archivo de Ubuntu cuando se inicia la máquina virtual del alumno. No distribuimos nada de ello.
¿Puede un alumno llegar al internet real desde el laboratorio?
No. La máquina virtual llega al archivo de Ubuntu, PyPI, npm y GitHub y a nada más, y el «internet» entre las dos sedes es un enlace virtual dentro de la máquina, así que el túnel une dos sedes que están en la misma máquina.
¿Cómo se corrige el laboratorio de WireGuard?
La comprobación se ejecuta sobre una copia de la máquina guardada tras un arranque limpio. Cada wg0.conf debe ser legible solo por su propietario y nombrar la clave pública de la otra pasarela, ambas pasarelas deben tener un handshake reciente y un ping entre los hosts debe mover bytes por el túnel. Una simple ruta estática no pasa.