Mikrotik: Networking containers RouterOS
En mi experiencia, con Containers, Docker y Kubernetes, creo que la parte más compleja de entender para la mayoría de personas es el networking para manejar contenedores.
Puedes comprender las capas de abstracción si sabes de virtualización y lo que comprende un contenedor, pero saber como interactuar con él, el host, el resto de la LAN e incluso Internet, suele dar ciertos dolores de cabeza. Esto en RouterOS se vuelve incluso más complejo, por no ser contenedores tan estándar.
Para configurar el networking para un grupo de contenedores que corren en RouterOS de MikroTik, necesitas seguir una serie de pasos detallados que incluyen la configuración de interfaces, bridges, y reglas NAT para gestionar correctamente el tráfico entre tus contenedores y la red exterior.
Ya os di unas pinceladas en esta entrada:
A continuación, os proporciono una tabla con los parámetros esenciales basados en las directrices de la documentación de MikroTik para la configuración de contenedores. Posteriormente, vamos a explicar con ejemplos prácticos como nos manejamos con ellos:
Comando/Configuración | Descripción | Ejemplo/Especificaciones |
---|---|---|
/interface/veth/add |
Agrega una interfaz virtual Ethernet para conectar contenedores. | name=veth1 address=172.17.0.2/24 gateway=172.17.0.1 |
/interface/bridge/add |
Crea un puente para agrupar interfaces, incluyendo las de contenedores. | name=containers |
/ip/address/add |
Asigna una dirección IP al puente para gestionar el acceso a la red de los contenedores. | address=172.17.0.1/24 interface=containers |
/interface/bridge/port add |
Añade interfaces al puente. | bridge=containers interface=veth1 |
/ip/firewall/nat/add |
Establece reglas NAT para el tráfico saliente desde los contenedores hacia la red externa (Internet, por ejemplo). | chain=srcnat action=masquerade src-address=172.17.0.0/24 |
/system/device-mode/update |
Habilita el modo contenedor en dispositivos RouterOS, necesario antes de iniciar cualquier contenedor. | container=yes |
/container/add |
Comando para añadir y configurar un contenedor especificando la imagen, interfaces y configuraciones de almacenamiento. | remote-image=your-container-image interface=veth1 root-dir=/usb1/containers/nginx |
Voy a lanzar un container NGINX para hacer la prueba:
1 2 3 4 5 6 7 8 |
[ELBLOGDENEGU@MikroTik] > /container add hostname=nginx remote-image=nginx:latest interface=veth1 root-dir=usb1/containers/nginx [ELBLOGDENEGU@MikroTik] > /container/print 0 name="06fc522e-8edf-47e5-bdd0-744d613fc009" tag="nginx:latest" os="" arch="" interface=veth1 root-dir=usb1/containers/nginx mounts="" dns="" hostname="nginx" status=extracting [ELBLOGDENEGU@MikroTik] > /container start number=0 [ELBLOGDENEGU@MikroTik] > /container/print 0 name="06fc522e-8edf-47e5-bdd0-744d613fc009" tag="library/nginx:latest" os="linux" arch="arm64" interface=veth1 root-dir=usb1/containers/nginx mounts="" dns="" hostname="nginx" status=running |
El router Mikrotik RB5009, que es mi router actual, dispone, una vez configurados los comandos de la tabla, la IP 172.17.0.1, y actúa como gateway de la red que usaré para los containers. Reviso que responde:
1 2 3 4 5 6 |
[ELBLOGDENEGU@MikroTik] > ping 172.17.0.1 SEQ HOST SIZE TTL TIME STATUS 0 172.17.0.1 56 64 199us 1 172.17.0.1 56 64 307us 2 172.17.0.1 56 64 306us sent=3 received=3 packet-loss=0% min-rtt=199us avg-rtt=270us max-rtt=307us |
Con el container NGINX como ejemplo, revisamos desde el router, que entre el router (gateway) y el propio container que acabamos de generar se ven y responde:
1 2 3 4 5 6 7 |
[ELBLOGDENEGU@MikroTik] > ping 172.17.0.2 SEQ HOST SIZE TTL TIME STATUS 0 172.17.0.2 56 64 257us 1 172.17.0.2 56 64 290us 2 172.17.0.2 56 64 302us 3 172.17.0.2 56 64 299us sent=4 received=4 packet-loss=0% min-rtt=257us avg-rtt=287us max-rtt=302us |
Abrir puerto container RouterOS Mikrotik a LAN
Este container con IP (172.17.0.2) está corriendo por defecto en el puerto 80 el servidor web por defecto de NGINX, para poder acceder a la página web que genera, deberemos crear una regla NAT desde mi red LAN (la IP del router que actúa como host de virtualización):
1 |
/ip firewall nat add action=dst-nat chain=dstnat dst-address=192.168.88.1 dst-port=8081 protocol=tcp to-addresses=172.17.0.2 to-ports=80 comment="Prueba container NGINX" |
Abrimos un navegador desde mi LAN, y vamos a la URL del puerto que hemos decidido apuntando al router directamente, en el ejemplo 8081, que nos redirigirá al puerto 80 del container NGINX con IP 172.17.0.2:
1 |
http://192.168.88.1:8081/ |
Si adicionalmente, queremos conectarnos vía shell al container, lo podéis hacer de la siguiente forma:
1 2 |
[ELBLOGDENEGU@MikroTik] > /container/shell number=0 root@nginx:/# |
Dentro del container podemos revisar que tenemos conectividad hacia Internet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
root@nginx:/# ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=10.4 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=10.8 ms ^C --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 10.376/10.599/10.823/0.223 ms root@nginx:/# ping google.es PING google.es (142.250.184.163) 56(84) bytes of data. 64 bytes from mad07s23-in-f3.1e100.net (142.250.184.163): icmp_seq=1 ttl=116 time=9.80 ms 64 bytes from mad07s23-in-f3.1e100.net (142.250.184.163): icmp_seq=2 ttl=116 time=10.4 ms ^C --- google.es ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 9.801/10.091/10.381/0.290 ms |
Permitir tráfico desde Internet al contenedor
Esto no es muy recomendable, pero si queréis abrir el tráfico desde Internet a vuestro container, complementando la regla de NAT anterior, generaremos la siguiente:
1 2 |
/ip firewall filter add action=accept chain=forward connection-nat-state=dstnat dst-port=8081 protocol=tcp |
- action=accept: Acción para aceptar el paquete.
- chain=forward: Aplica la regla a la cadena de reenvío.
- connection-nat-state=dstnat: Aplica la regla solo a las conexiones que han sido redirigidas.
- dst-port=8081: El puerto de destino que debe permitirse en las reglas del firewall.
Monitorizar tráfico containers RouterOS
Para monitorear el tráfico de red de los contenedores en RouterOS de MikroTik, puedes utilizar diversas herramientas y funciones integradas en el sistema RouterOS. Estas herramientas te permitirán obtener una visión clara del uso de la red por parte de los contenedores, identificar posibles cuellos de botella y asegurar que los recursos de red se utilicen eficientemente. Aquí te explico algunas de las principales estrategias y comandos que puedes utilizar:
- Monitoreo con la herramienta Tool Torch de la interfaz asignada al contenedor:
1 2 3 4 5 |
[ELBLOGDENEGU@MikroTik] /interface/list> /tool torch interface=containers Columns: TX, RX, TX-PACKETS, RX-PACKETS TX RX TX-PACKETS RX-PACKETS 2.7kbps 0bps 1 0 2.7kbps 0bps 1 0 |
- Puedes usar Simple Queues para monitorear y, opcionalmente, limitar el tráfico hacia y desde el contenedor:
1 |
/queue simple add name="container-traffic" target=172.17.0.2/24 interface=containers max-limit=10M/10M |
- Para un análisis más detallado del tráfico, puedes utilizar la herramienta “Packet Sniffer”:
1 2 |
/tool sniffer set interface=containers /tool sniffer start |
- RouterOS también ofrece herramientas gráficas para visualizar el tráfico de red a lo largo del tiempo:
1 |
/tool graphing interface add interface=containers |
- Otra buena opción es marcar el tráfico para los containers, lo haremos con una regla MANGLE:
1 2 3 |
/ip firewall mangle add action=mark-packet new-packet-mark=container_traffic chain=prerouting src-address=172.17.0.2 passthrough=yes add action=mark-packet new-packet-mark=container_traffic chain=prerouting dst-address=172.17.0.2 passthrough=yes |
- action=mark-packet: Esta acción permite marcar los paquetes para su posterior procesamiento.
- new-packet-mark=container_traffic: Etiqueta que se asigna a los paquetes marcados.
- chain=prerouting: La cadena prerouting es utilizada para marcar los paquetes antes de que se tomen decisiones de enrutamiento.
- src-address=172.17.0.2 y dst-address=172.17.0.2: Estas condiciones aseguran que tanto el tráfico de salida como de entrada del contenedor sean marcados.
- passthrough=yes: Esto permite que el paquete sea procesado por reglas adicionales después de esta.
- Una vez que los paquetes están marcados, puedes referenciar esta marca en otras reglas, como las Simple Queues, para priorizar, limitar o monitorear específicamente este tráfico:
1 2 |
/queue simple add name="Container Traffic Queue" target=172.17.0.2/24 packet-mark=container_traffic max-limit=2M/10M |
Activar DHCP para red Containers Mikrotik
Personalmente, es interesante configurar el servidor DHCP para la red de containers, así os olvidáis de mantener IPs manualmente:
Espero que os parezca interesante…
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?