Laboratorio de pasarela NAT: masquerade y reenvío de puertos con nftables en tu navegador
Un laboratorio de redes sobre la traducción de direcciones: tres máquinas construidas dentro de la única máquina virtual Ubuntu del alumno, un equipo privado en 10.0.0.0/24, una pasarela y un servidor exterior en 203.0.113.0/24. El equipo no puede llegar al servidor, porque el exterior no tiene ruta de vuelta a una dirección privada, y el alumno tiene que descubrir por qué y corregirlo en la pasarela con nftables.
No hay nada que instalar ni ningún router que comprar: cada máquina es un network namespace, los comandos reales funcionan y el servidor exterior responde a cada petición con la dirección de la que la vio llegar, de modo que el alumno ve lo que hace la traducción.
Qué aprenden los alumnos
Por qué una dirección privada no puede usarse en internet y cómo habla una pasarela por las máquinas que tiene detrás: el masquerade, que reescribe la dirección de origen de lo que sale, y el reenvío de puertos, que reescribe el destino de lo que llega para que el exterior alcance un servicio de un equipo privado. Leen la tabla de conexiones de la pasarela con conntrack, observan un enlace con tcpdump, dejan pasar el flujo reenviado por un cortafuegos que descarta todo lo demás sin abrirlo más de la cuenta y guardan las reglas para que sobrevivan a un reinicio.
La topología y la tarea
Un equipo de la red local con una página web en el puerto 80 y una página privada en el puerto 8081, una pasarela con un cable a cada lado y un servidor exterior en el puerto 8000. Hoy la pasarela solo deja que la red local inicie conexiones y descarta el resto. El alumno consigue que el equipo local llegue al servidor exterior como la dirección exterior de la pasarela y después que la página web local sea accesible desde fuera en el puerto 8080, y nada más. 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.
- 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.
- Parte del ejemplo. La página ofrece ejemplos para empezar. Elige NAT gateway: masquerade and port forwarding. Usar un ejemplo sustituye el texto, y «Deshacer» recupera el tuyo.
- Publica e inicia tu propia copia. Publica y después pulsa «Iniciar». El script de preparación del laboratorio instala nftables y algunas herramientas de red desde el archivo de Ubuntu y construye las tres máquinas la primera vez que se inicia la máquina virtual, en unos diez segundos.
- Abre el terminal. Abre su terminal y lee README.md en la carpeta personal: dice qué hacer y no da ninguna respuesta. netlab status lista las máquinas y netlab shell gw abre una shell dentro de la pasarela.
Una lección básica en este laboratorio
NAT Basics es una lección breve hecha en este laboratorio, que es una máquina virtual Ubuntu: cada paso está explicado 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, pide su página al servidor exterior y ve cómo la petición caduca, lee las rutas del servidor exterior para ver que no tiene ninguna hacia una dirección privada y lee las reglas de la pasarela para ver que ninguna traduce una dirección.
Miran alrededor y dejan la tarea propia del laboratorio, hacerlo funcionar, al alumno, así que la lección no da respuestas. Una cuenta personal gratuita la recibe en el módulo Basics, que está en Inicio, cada centro puede copiarla de la carpeta Basics de la Biblioteca, y un centro nuevo la tiene en un módulo llamado Networking Basics (Sample). Es deliberadamente breve: muestra a un docente lo que es una lección hecha en un laboratorio, y el laboratorio hace el resto. Copia la lección en un módulo propio 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 limpio, así que solo ve lo que el alumno guardó en /etc/nftables.conf, y califica lo que hace la red, no cómo están escritas las reglas. Una petición del equipo local debe llegar al servidor exterior, que debe haber visto la dirección exterior de la pasarela. Una petición desde fuera al puerto 8080 debe llegar a la página local, que debe haber visto la dirección propia del cliente, así que un proxy en la pasarela no la supera. La página privada y cualquier otro puerto deben seguir cerrados, y la pasarela debe seguir descartando lo que no se le ha dicho que permita. Las reglas escritas en la pasarela en marcha y nunca guardadas no la superan, y la primera línea de lo que imprimió la comprobación dice por qué.
- 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.
- 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.
- Califícalo. Lee lo que imprimió la comprobación. Cuando un alumno detiene su máquina virtual, la lista de la clase muestra además lo que ha cambiado, los paquetes que instaló y los archivos que escribió, así que puedes calificar sin iniciarla. 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, topología, README y comprobación. Pide una CPU y 1 GB. Cópialo y cámbialo para hacer el tuyo.
Preguntas frecuentes
- ¿Es el exterior el internet real?
- No. El exterior es un network namespace dentro de la máquina virtual del alumno, con 203.0.113.0/24, un rango reservado para documentación. La propia máquina virtual solo llega al archivo de paquetes de Ubuntu, PyPI, npm y GitHub, así que un laboratorio no puede dirigirse a un equipo de internet.
- ¿Puede un alumno usar los comandos reales de Linux?
- Sí, y esa es la idea. sudo ip netns exec gw nft list ruleset y sudo ip netns exec gw conntrack -L funcionan tal como están escritos, y netlab shell gw es un atajo.
- ¿Cuál es la diferencia entre masquerade y el reenvío de puertos?
- Masquerade reescribe la dirección de origen de lo que sale de la red privada, y así el host de la LAN llega al servidor exterior. El reenvío de puertos reescribe el destino de lo que llega, y así el exterior alcanza un servicio de un host privado. El laboratorio pide ambos, con el reenvío en el puerto 8080.