Este artículo técnico detalla el diseño algorítmico, la inyección de scripts en RouterOS y los protocolos de conmutación dinámica para implementar árboles de colas (Queue Trees) en routers MikroTik configurados con esquemas de tolerancia a fallos (Failover) de múltiples proveedores de Internet (Multi-WAN). Implementaremos una arquitectura basada en el marcado jerárquico de paquetes mediante el motor de Mangle de Netfilter y estructuras HTB (Hierarchical Token Bucket), garantizando que las prioridades de ancho de banda y los límites de tráfico se adapten automáticamente en tiempo real cuando el enlace principal se degrade y entre en operación la línea de respaldo. Al finalizar este despliegue, el administrador de red habrá establecido un sistema QoS resiliente y automatizado, capaz de mitigar la saturación de paquetes y el fenómeno del Bufferbloat sin intervención manual durante eventos de conmutación de interfaces.
Fundamentos Técnicos del HTB y la Interacción con el Enrutamiento Multi-WAN
La implementación de Calidad de Servicio (QoS) mediante Queue Trees en escenarios con múltiples puertas de enlace (Gateways) requiere comprender con precisión el flujo de paquetes dentro de la arquitectura de RouterOS (Packet Flow v7). El error más común radica en asociar las colas a interfaces físicas fijas cuando las capacidades de ancho de banda difieren drásticamente entre el enlace principal y el de respaldo.
El Concepto de Parent Queue Virtual (global)
- Limitación de Interfaces Físicas: Si se define una interfaz física (como ether1) como la cola padre (Parent), el árbol de colas perderá efectividad por completo en el momento en que el tráfico sea redirigido dinámicamente hacia una interfaz secundaria (como ether2) debido a una falla del enlace principal.
- La Solución Global: En RouterOS v7, el parámetro
parent=globalactúa como un contenedor virtual unificado que procesa todo el tráfico que transita por el enrutador, independientemente de la interfaz física de entrada o salida. Esto permite centralizar las políticas HTB y delegar la segmentación del ancho de banda a las marcas de paquetes generadas dinámicamente.
Diagnóstico Operativo de las Interfaces WAN
Antes de estructurar el árbol de colas, determine con precisión matemática la capacidad máxima de descarga (Download) y carga (Upload) de cada uno de sus proveedores de Internet. Para este escenario de ingeniería, asumiremos los siguientes parámetros simétricos:
- Enlace Principal (WAN-1): Interfaz
ether1-wan1con 100 Mbps simétricos (100M Down / 100M Up). - Enlace de Respaldo (WAN-2): Interfaz
ether2-wan2con 30 Mbps simétricos (30M Down / 30M Up).
Bloque 1: Arquitectura de Marcado de Paquetes (Mangle)
El motor HTB de Queue Tree no puede clasificar flujos de datos basados en direcciones IP directas o puertos TCP/UDP; depende exclusivamente de etiquetas lógicas conocidas como marcas de paquetes (Packet Marks). Es obligatorio configurar el menú Mangle para clasificar el tráfico antes de que este ingrese al programador de colas.
Paso 1: Clasificación de Prioridades de Tráfico
Dividiremos el tráfico de la red corporativa en tres niveles estrictos de prioridad para optimizar el rendimiento del hardware y la experiencia del usuario:
- Prioridad 1 (RealTime): Consultas DNS, tráfico de voz sobre IP (VoIP), protocolos de túneles VPN y paquetes ICMP de diagnóstico.
- Prioridad 2 (Core-Web): Navegación web HTTP/HTTPS segura, correo electrónico empresarial y aplicaciones en la nube (SaaS).
- Prioridad 3 (Default-Bulk): Descargas masivas de archivos, actualizaciones de sistemas operativos y tráfico no clasificado.
Paso 2: Inyección de Reglas Mangle para la Cadena de Prerouting y Postrouting
Ejecute el siguiente script en la terminal para establecer el marcado de conexiones y paquetes. Note que el uso de passthrough=yes se restringe únicamente al marcado de conexiones, optimizando la eficiencia de la CPU al detener la evaluación de reglas una vez asignada la marca de paquete definitiva (passthrough=no).
/ip firewall mangle
# Marcado de Conexiones de Prioridad Alta (VoIP y DNS)
add action=mark-connection chain=prerouting comment="Conexiones de Alta Prioridad" dst-port=53,5060,5061,4500 protocol=udp new-connection-mark=conn_priority_1 passthrough=yes
add action=mark-connection chain=prerouting dst-port=53 protocol=tcp new-connection-mark=conn_priority_1 passthrough=yes
# Marcado de Conexiones de Navegación y Core Business
add action=mark-connection chain=prerouting comment="Conexiones Navegacion Core" dst-port=80,443 protocol=tcp new-connection-mark=conn_priority_2 passthrough=yes
# Marcado de Conexiones por Defecto (Bulk)
add action=mark-connection chain=prerouting comment="Conexiones Bulk por Defecto" connection-mark=no-mark new-connection-mark=conn_priority_3 passthrough=yes
# Generación de Packet Marks basándose en Connection Marks para Descarga (Download)
add action=mark-packet chain=forward connection-mark=conn_priority_1 new-packet-mark=pk_down_p1 passthrough=no in-interface-list=WAN
add action=mark-packet chain=forward connection-mark=conn_priority_2 new-packet-mark=pk_down_p2 passthrough=no in-interface-list=WAN
add action=mark-packet chain=forward connection-mark=conn_priority_3 new-packet-mark=pk_down_p3 passthrough=no in-interface-list=WAN
# Generación de Packet Marks basándose en Connection Marks para Carga (Upload)
add action=mark-packet chain=forward connection-mark=conn_priority_1 new-packet-mark=pk_up_p1 passthrough=no out-interface-list=WAN
add action=mark-packet chain=forward connection-mark=conn_priority_2 new-packet-mark=pk_up_p2 passthrough=no out-interface-list=WAN
add action=mark-packet chain=forward connection-mark=conn_priority_3 new-packet-mark=pk_up_p3 passthrough=no out-interface-list=WAN
Nota de configuración imperativa: Para que el script anterior funcione sin errores semánticos, verifique que las interfaces WAN estén correctamente agrupadas en una lista de interfaces ejecutable mediante el siguiente comando base:
/interface list member
add interface=ether1-wan1 list=WAN
add interface=ether2-wan2 list=WAN
Bloque 2: Construcción Estática del Queue Tree para el Enlace Principal (WAN-1)
Con las marcas de paquetes fluyendo en tiempo real a través del núcleo del router, procedemos a diseñar la estructura HTB. Inicialmente, dimensionaremos las colas raíz (Root Queues) y las colas hijas (Child Queues) calculando los límites basados en la velocidad de la WAN-1 (100 Mbps).
Paso 1: Estructuración de las Colas Raíz (Parents)
Crearemos dos estructuras jerárquicas independientes bajo el nodo virtual global: una estructura dedicada para gestionar la descarga general de la LAN y otra para modelar la tasa de subida hacia Internet.
/queue tree
add name="Q_Root_Download" parent=global max-limit=100M
add name="Q_Root_Upload" parent=global max-limit=100M
Paso 2: Creación y Asignación de Prioridades a las Colas Hijas (Child Queues)
Las colas hijas distribuyen el ancho de banda total definido en la cola raíz. El parámetro limit-at representa el ancho de banda garantizado (CIR – Committed Information Rate), mientras que max-limit define el techo máximo de ráfaga o ancho de banda disponible bajo demanda (PIR – Peak Information Rate). El parámetro priority acepta valores del 1 (máxima prioridad) al 8 (mínima prioridad).
/queue tree
# Subárbol de Descarga (Download)
add name="Q_Down_P1_RealTime" parent="Q_Root_Download" packet-mark=pk_down_p1 priority=1 limit-at=10M max-limit=100M queue=pcq-download-default
add name="Q_Down_P2_Core" parent="Q_Root_Download" packet-mark=pk_down_p2 priority=3 limit-at=50M max-limit=100M queue=pcq-download-default
add name="Q_Down_P3_Bulk" parent="Q_Root_Download" packet-mark=pk_down_p3 priority=7 limit-at=10M max-limit=80M queue=pcq-download-default
# Subárbol de Carga (Upload)
add name="Q_Up_P1_RealTime" parent="Q_Root_Upload" packet-mark=pk_up_p1 priority=1 limit-at=10M max-limit=100M queue=pcq-upload-default
add name="Q_Up_P2_Core" parent="Q_Root_Upload" packet-mark=pk_up_p2 priority=3 limit-at=50M max-limit=100M queue=pcq-upload-default
add name="Q_Up_P3_Bulk" parent="Q_Root_Upload" packet-mark=pk_up_p3 priority=7 limit-at=10M max-limit=80M queue=pcq-upload-default
Bloque 3: Automatización del Failover y Recálculo Dinámico de Límites
Si la interfaz ether1-wan1 pierde conectividad física o lógica, el mecanismo de Failover del router desviará el tráfico hacia la interfaz ether2-wan2. Sin embargo, debido a que la WAN-2 posee únicamente 30 Mbps de capacidad, el árbol de colas configurado previamente a 100 Mbps generará una saturación masiva inmediata del enlace de respaldo, ya que el router intentará procesar más paquetes de los que la interfaz física de contingencia soporta. Para solucionar esto, implementaremos scripts de contingencia automatizados mediante Netwatch.
Paso 1: Configuración del Mecanismo de Failover Básico por Distancia de Rutas
Asegúrese de contar con una configuración de enrutamiento estático con verificación de disponibilidad mediante ping de IP (Check Gateway) y distancias administrativas diferenciadas.
/ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1 check-gateway=ping distance=1 comment="Ruta Principal WAN-1"
add dst-address=0.0.0.0/0 gateway=192.168.2.1 distance=2 comment="Ruta Respaldo WAN-2"
Paso 2: Scripts de Automatización del Árbol de Colas mediante Netwatch
Utilizaremos la herramienta nativa /tool netwatch para monitorear un servidor DNS público confiable a través de la interfaz WAN-1. Cuando el estado del enlace cambie a caído (Down) o recuperado (Up), Netwatch disparará de forma instantánea comandos internos para reconfigurar los parámetros max-limit y limit-at de la arquitectura HTB.
/tool netwatch
add host=8.8.8.8 interval=5s timeout=1s comment="Monitoreo Logico Enlace WAN-1" \
up-script="/queue tree {\ fund set [find name=\"Q_Root_Download\"] max-limit=100M;\ fund set [find name=\"Q_Root_Upload\"] max-limit=100M;\ fund set [find name=\"Q_Down_P1_RealTime\"] limit-at=10M max-limit=100M;\ fund set [find name=\"Q_Down_P2_Core\"] limit-at=50M max-limit=100M;\ fund set [find name=\"Q_Down_P3_Bulk\"] limit-at=10M max-limit=80M;\ fund set [find name=\"Q_Up_P1_RealTime\"] limit-at=10M max-limit=100M;\ fund set [find name=\"Q_Up_P2_Core\"] limit-at=50M max-limit=100M;\ fund set [find name=\"Q_Up_P3_Bulk\"] limit-at=10M max-limit=80M;\ }; /log warning \"Mecanismo Netwatch: Enlace WAN-1 Activo. Queue Tree ajustado a 100 Mbps.\"" \
down-script="/queue tree {\ fund set [find name=\"Q_Root_Download\"] max-limit=30M;\ fund set [find name=\"Q_Root_Upload\"] max-limit=30M;\ fund set [find name=\"Q_Down_P1_RealTime\"] limit-at=5M max-limit=30M;\ fund set [find name=\"Q_Down_P2_Core\"] limit-at=15M max-limit=30M;\ fund set [find name=\"Q_Down_P3_Bulk\"] limit-at=3M max-limit=20M;\ fund set [find name=\"Q_Up_P1_RealTime\"] limit-at=5M max-limit=30M;\ fund set [find name=\"Q_Up_P2_Core\"] limit-at=15M max-limit=30M;\ fund set [find name=\"Q_Up_P3_Bulk\"] limit-at=3M max-limit=20M;\ }; /log error \"Mecanismo Netwatch: Alerta Failover detectado. WAN-1 Caida. Queue Tree contraido a 30 Mbps.\""
Bloque 4: Pruebas de Validación del HTB y Auditoría del Failover
Posterior a la inyección sistemática de las colas y scripts de automatización, es de carácter obligatorio ejecutar una auditoría técnica estructural para confirmar la convergencia del sistema bajo condiciones simuladas de estrés y fallas operativas.
Paso 1: Validación del Flujo de Marcado de Paquetes
Antes de forzar la caída del enlace, verifique que los contadores de paquetes del menú Mangle se incrementen progresivamente de acuerdo con las actividades de la red corporativa.
- Abra la terminal de comandos del enrutador MikroTik.
- Ejecute la instrucción de impresión con seguimiento en tiempo real:
/ip firewall mangle print stats interval=1s where connection-mark~"conn_" - Examine las columnas correspondientes a
PACKETSyBYTES. Si los valores permanecen estáticos en cero durante períodos de tráfico activo en la LAN, verifique de inmediato la validez estructural de los criterios de puertos TCP/UDP asignados en el Bloque 1.
Paso 2: Simulación Científica de Falla de Enlace (Failover Test)
Para constatar el funcionamiento del script dinámico de Netwatch sin necesidad de desconectar físicamente el cableado del nodo perimetral, deshabilite por software la interfaz primaria WAN-1.
Ejecute la desactivación imperativa de la interfaz ejecutando la siguiente línea en la consola:
/interface ethernet disable ether1-wan1
Inmediatamente después de aplicar el comando anterior, abra de forma paralela la ventana de logs del sistema para auditar la ejecución de la instrucción de contingencia de colas:
/log print follow-only where message~"Queue Tree"
La salida esperada en consola debe imprimir la siguiente advertencia crítica estructurada, indicando la ejecución exitosa en un tiempo de convergencia inferior a 5 segundos:
syslog,error Mecanismo Netwatch: Alerta Failover detectado. WAN-1 Caida. Queue Tree contraido a 30 Mbps.
Valide la contracción física de los límites estructurales de las colas ejecutando el comando de consulta rápida:
/queue tree print field=max-limit,limit-at
Verifique en la pantalla de salida que el nodo Q_Root_Download y sus dependencias directas reflejen exactamente la cadena de texto de velocidad restringida correspondiente a 30M (30 Megabits por segundo).
Paso 3: Restablecimiento de la Infraestructura
Una vez completado el diagnóstico operacional en modo de contingencia, reactive la interfaz WAN principal para validar el retorno automático del árbol de colas a sus umbrales óptimos de operación:
/interface ethernet enable ether1-wan1
Monitoree nuevamente los registros internos mediante la terminal. El sistema operativo RouterOS debe registrar el siguiente evento de normalización:
syslog,warning Mecanismo Netwatch: Enlace WAN-1 Activo. Queue Tree ajustado a 100 Mbps.
Bloque 5: Buenas Prácticas de Ingeniería y Optimización de Recursos
El uso combinado de filtrado Mangle y Queue Trees demanda recursos computacionales significativos. Considere las siguientes recomendaciones críticas de diseño técnico para prevenir cuellos de botella de hardware a largo plazo:
- Desactivación Forzada de FastTrack: La funcionalidad FastTrack de MikroTik acelera el reenvío de paquetes puenteando el kernel de Netfilter para conexiones establecidas. No obstante, si FastTrack se encuentra activo, los paquetes evadirán las reglas Mangle y el Queue Tree dejará de funcionar por completo. Asegúrese de deshabilitar o agregar una excepción para el tráfico marcado en sus reglas de Firewall Filter.
- Elección Adecuada del Tipo de Cola (Queue Type): Utilice siempre tipos de colas basados en algoritmos de equidad para las subcolas de usuarios, tales como
pcq-download-defaultypcq-upload-default. El algoritmo PCQ (Per Connection Queue) subdivide dinámicamente el ancho de banda total entre la cantidad de hosts que solicitan tráfico simultáneamente, impidiendo que un único usuario consuma la totalidad de la banda disponible en situaciones de contingencia WAN. - Monitoreo de CPU Overhead: Realice mediciones concurrentes del uso de la CPU utilizando la herramienta de perfilado de procesos (Profiler) de RouterOS para identificar si el procesamiento de expresiones regulares en las cadenas de Mangle está impactando negativamente la latencia global del enrutamiento de paquetes. Para ello, ejecute en consola:
/tool profile








