Docker Routing: Práctica routing y nating con docker
Los docentes encargados del módulo de redes en ciclos formativos o en otras disciplinas relacionadas requieren implementar una infraestructura, generalmente virtual, para que los estudiantes realicen prácticas de enrutamiento y configuración de NAT entre distintos equipos interconectados en diversas redes.
He desarrollado un proyecto que facilita, de manera sencilla, la creación de dicha infraestructura utilizando contenedores Docker. Este sistema permite construir, de forma eficiente, una red de múltiples máquinas Linux conectadas a diferentes redes, brindando a los estudiantes un entorno práctico donde pueden llevar a cabo sus prácticas.
Docker Routing
Puedes encontrar la documentos y los ficheros necesario en el repositorio de github: Docker Routing. En este repositorio encontraremos un fichero docker-compose.yaml
donde tenemos un escenario de ejemplo de contenedores Docker. El esquema de red que se va a crear es el siguiente:
Tenemos que tener en cuenta lo siguiente:
- Podemos modificar este fichero
docker-compose.yaml
para crear escenarios diferentes. - En el ejemplo que vamos a estudiar, los únicos contenedores que tienen acceso al exterior son los que están conectados a la
red_externa
, en nuestro casopc1
yrouter1
.
Instalación del escenario
Instala docker y docker-compose:
sudo apt install docker.io docker-compose
Clona este repositorio:
git clone https://github.com/josedom24/docker_routing.git
cd docker_routing
Todas las instrucciones docker-compose
hay que ejecutarlas dentro del directorio docker_routing
, para levantar el escenario:
sudo docker-compose up -d
Docker incluye reglas de cortafuego muy estrictas que evitan el tráfico entre redes docker. Para poder trabajar con enrutamiento necesitamos quitar estas reglas, para ello ejecutamos en el ordenador donde hemos instalado docker estas instrucciones (si es necesario tendrás que instalar el paquete iptables
):
sudo iptables -I DOCKER-ISOLATION-STAGE-1 1 -j RETURN
sudo iptables -P FORWARD ACCEPT
NOTA IMPORTANTE: La primera instrucción la tendrás que ejecutar cada vez que levantes el escenario con sudo docker-compose up -d
.
Podemos ver los contenedores que se han creado:
sudo docker-compose ps
Name Command State Ports
----------------------------------------
pc1 sleep infinity Up
pc2 sleep infinity Up
pc3 sleep infinity Up
router1 sleep infinity Up
router2 sleep infinity Up
router3 sleep infinity Up
Para acceder a un contenedor:
sudo docker exec -it <nombre_contenedor> bash
Por ejemplo:
sudo docker exec -it pc1 bash
root@pc1:/#
Ya puedes empezar a configurar el escenario para realizar las prácticas de enrutamiento o de NAT.
Después de trabajar con el escenario, puedes destruirlo con:
sudo docker-compose down
Explicación detallada del fichero docker-compose
- Cuando se crean los contenedores se crea una nueva imagen llamada
midebian:latest
ejecutando el ficheroDockerfile
que encuentras en el directoriobuild
. Esta imagen se basa en la imagendebian
pero se le instalan los paquetes necesarios para nuestro ejercicio de enrutamiento. Si al finalizar queremos borrar las imágenes, ejecutaremos:sudo docker rmi debian:latest sudo docker rmi midebian:latest
- Se crean 5 redes docker:
- La red llamada
red_externa
es la única que permite acceso al exterior, es decir, los contenedores conectadas a ella (router1
ypc1
) tienen una ruta por defecto a la puerta de enlace172.25.0.1
que permite el acceso a exterior. - Las redes
redX
están configuradas como redes internas (internal: true
), esto significa que los contenedores conectados a estas redes, aunque tienen una ruta por defecto a la puerta de enlace172.XX.0.254
(hemos indicado esa puerta de enlace para que podamos usar las direcciones172.XX.0.1
) no tienen conectividad al exterior.
- La red llamada
- Se crean 6 contenedores:
routerX
: Son contenedores que tienen el rol de router y están conectados a varias redes. Se ha activada el bit de forwarding (sysctls: net.ipv4.ip_forward: "1"
) para que enrruten paquetes.pcX
: Son contenedores que hacen de equipos conectados a las redes.
- En el parámetro
networks
de la definición de cada contenedor encontramos a que red está conectado y con qué ip se va a configurar. Además se añade la capacidad de administrador de red (cap_add: NET_ADMIN
) al contenedor. Esta capacidad le permite al contenedor realizar tareas relacionadas con la administración de redes, como configurar interfaces de red, habilitar el reenvío de paquetes, agregar rutas, configurar NAT (traducción de direcciones de red), entre otras acciones de red que normalmente requieren privilegios elevados.
De una manera sencilla, podremos crear nuevos ficheros docker-compose.yaml
que nos permitan construir distintos escenarios. Espero que este proyecto sea de utilidad.
Leave a Comment
Your email address will not be published. Required fields are marked *