formacion-ubrss-ubiquiti

[GUÍA] Servidor Ubuntu en contenedores Docker con Mikrotik.

[GUÍA] Servidor Ubuntu en contenedores Docker con Mikrotik.

Hace muy poco tiempo Mikrotik liberó la versión 7.4 beta 4 añadiendo nuevamente el soporte de contenedores, que han discontinuado en la versión 7.0 beta3. Esta nueva versión, aun en beta, trae algunas novedades sobre el uso de contendores Docker en routers Mikrotik.

Anteriormente, hemos hablado sobre el uso de contenedores en Mikrotik. En esta nueva entrada, dejaremos una guía práctica de como desplegar contenedores en RouterOS, pero iremos un poco más allá, y directamente desplegaremos un servidor Ubuntu basándonos en una imagen de Docker.

En esta nueva versión, además de corregir errores, se añadió la función de descargar los contenedores directamente desde el repositorio de DockerHub, sin tener que convertir la imagen en .tar, como era en su versión anterior.

Tipos de imágenes disponibles.

DockerHub es un repositorio público de imágenes Docker, allí podremos encontrar imágenes desde servidores Apache, Nginx, bases de datos como Mysql, Postgres, MongoDB e incluso servicios como Proxy, DNS o servidores Radius.

DockerHub nos facilita la implementación de determinados servicios, si estamos en busca de implementar un servidor Apache o aplicaciones específicas, podríamos primero buscarlas en el repositorio previamente.

¿Pero qué sucede si tenemos una implementación muy específica? En esos casos podremos desplegar directamente un contenedor con un servidor Linux e instalar los paquetes necesarios para la implementación, con esta opción, tendremos la flexibilidad de instalar los paquetes necesarios a medida y controlar el entorno.

Requisitos

Estos son los requisitos para poder instalar contenedores Docker en RouterOS:

  1. Instalar la versión 7.4beta4 disponible en Mikrotik.
  2. Contar con un Router Mikrotik con arquitecturas ARM, ARM64 o x86 (CHR).
  3. Descargar el paquete de contenedores, es requisito descarga la versión «Extra Packages».
  4. No es obligatorio, pero es recomendable contar con almacenamiento externo, para el uso de los contenedores.

Desplegando contenedores Docker en RouterOS

En esta guía utilizaremos la arquitectura x86 implementada sobre un router CHR en una máquina virtual. Al final de esta guía podrás desplegar el mismo contenedor en arquitectura ARM, con las imágenes adecuadas.

Luego de haber actualizado la versión de RouterOS e instalar el paquete container ya podremos comenzar.

Al finalizar la actualización, es necesario habilitar la función de contenedores, además de tener instalado el paquete, abrimos a una nueva consola CLI y ejecutamos el siguiente comando:

/system/device-mode/update container=yes

Es recomendable asegurar el router previamente.

Luego hay que reiniciar el router o la máquina virtual. Podremos verificar si el cambio se aplicó correctamente ejecutando el comando /system/device-mode/print. Deberíamos ver lo siguiente:

Creando la red virtual

Para el uso de redes en los contenedores, es necesario crear interfaces virtuales

Escribimos lo siguiente en la consola para crear la red virtual del contenedor, junto con la dirección IP y gateway.

/interface/veth/add name=veth1 address=172.17.0.2/16 gateway=172.17.0.1

Creando un Bridge

Crearemos un Bridge añadiendo la interfaz virtual creada previamente y asignando una IP al bridge dentro de la misma red, con las siguientes líneas:

/interface/bridge/add name=docker

/ip/address/add address=172.17.0.1/16 interface=docker

/interface/bridge/port add bridge=docker interface=veth1

NAT

Para que nuestro contenedor disponga de salida a internet, es necesario crear un NAT de su red. Lo haremos con el siguiente comando:

/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/16

Configurando el repositorio para obtener la imagen de nuestro servidor

Gracias a esta nueva función, podremos descargar directamente a nuestro router la imagen del contenedor. Ejecutamos el siguiente comando en la CLI.

/container/config/set registry-url=https://registry-1.docker.io

Descargando la imagen del servidor Ubuntu en RouterOS

Hemos diseñado una imagen con una máquina Linux con la distribución Ubuntu, de esta forma evitamos crear la imagen por medio del Dockerfile y convertirla en .tar y subirla a nuestro Router.

Escribiremos lo siguiente en la consola:

/container/add remote-image=lanpixel/ubunutu_ssh:v1 interface=veth1

Verificando la instalación correcta

Ahora verificamos con el siguiente comando si todo es correcto:

/container/print

Deberíamos ver:

Para iniciar el contenedor ejecutamos el comando:

/container/start 0

El contenedor tiene que estar en el estado de «running».

Verificando la conexión y accediendo a nuestro servidor

Ya con nuestro contenedor en ejecución, vamos a verificar si responde por ICMP.

Tenemos respuesta, nuestro último paso es intentar una conexión por SSH, lo haremos desde nuestro Mikrotik con el comando:

/system/ssh 172.17.0.2 user=root

Podremos ver que tenemos respuesta del servidor SSH, nos solicita un password, la misma es: lanpixel

Luego de ingresar el password, ya deberíamos estar dentro de nuestro contenedor Ubuntu!

Actualizando paquetes e instalando el paquete curl

Para probar nuestro contenedor Ubuntu, ejecutaremos los siguientes comandos:

apt update

apt install curl -y

Luego verificamos el correcto funcionamiento ejecutando: curl https://google.com

Del mismo modo, podremos instalar los paquetes que necesitemos para nuestro despliegue.

Arquitectura ARM

Esta guía está orientada a arquitectura x86, pero la podremos realizar igual en arquitecturas ARM, la imagen a utilizar es:

/container/add remote-image=lanpixel/ubuntu_ssh:arm interface=veth1

Accediendo desde nuestra LAN

Para acceder desde nuestra LAN a nuestro contenedor Ubuntu es necesario crear una regla de DST-NAT:

/ip firewall nat add action=dst-nat chain=dstnat dst-address=[IP_ROUTER] dst-port=2022
protocol=tcp to-addresses=172.17.0.2 to-ports=22

Hay que tener en cuenta que el puerto de acceso es el 2022 desde nuestra LAN.

Recomendaciones

Como hemos comentado anteriormente, es recomendable utilizar un disco externo para los despliegues de contenedores, en esta demo, no lo hemos utilizado, pero puedes consultar la documentación oficial para ver los pasos necesarios.

También es recomendable asegurar el router correctamente, ya que podríamos tener algún vector sobre un contenedor.

Descargar imágenes verificadas u oficiales. Puedes descargar el Dockerfile de esta demo desde aquí:

Enlaces adicionales

Documentación oficial y desplegando PiHole en RouterOS

Dockerfile y Dockerbuild

Notas finales

En esta guía de introducción hemos desplegado un contenedor Ubuntu por medio de una imagen disponible, pero podremos crearla por medio de Dockerfile con nuestros propios parámetros.

Gracias a esta nueva característica disponible en Mikrotik, tendremos la capacidad de implementar servicios adicionales en el mismo router, como una página web, una base de datos e incluso un control de DNS.

¡Nos vemos la próxima!

Artículos relacionados
Comentarios
Leonardo F. Calderón

Excelente guía, tan pronto sea posible la pondré en práctica. Excelente equipo de LANPIXEL.

Comments are closed.