Cuando un WISP crece más allá de 50 clientes activos, las Simple Queues empiezan a ser un problema: se procesan en orden secuencial, consumen CPU de forma lineal con cada cliente nuevo, y no permiten estructuras jerárquicas que prioricen tráfico crítico. La solución es Queue Tree con HTB y PCQ — el sistema de QoS serio de RouterOS, el mismo que usan los operadores con cientos o miles de clientes.
Esta guía cubre los conceptos fundamentales de Queue Tree, la diferencia crítica con Simple Queues, la configuración con mangle marks, PCQ para distribución justa, y un esquema práctico de QoS multi-nivel para ISP. Comandos listos para ROS 6.49 y ROS 7.x.
Si tienes reglas de Fasttrack activas en las interfaces donde aplicas Queue Tree, las conexiones aceleradas ignoran completamente las colas y van a velocidad de línea. Debes deshabilitar Fasttrack en las interfaces con QoS activo. Esto es el error más común al migrar de Simple Queues a Queue Tree.
1. Queue Tree vs Simple Queue: cuándo usar cada uno
| Característica | Simple Queue | Queue Tree |
|---|---|---|
| Complejidad config | Baja — GUI directa | Media — requiere mangle |
| Escalabilidad | O(n) — lento con >50 colas | HTB — eficiente con 1000+ |
| Jerarquía | Solo padre-hijo simple | Árbol multinivel |
| Mangle marks | Opcional | Obligatorio |
| Priorización de tráfico | Básica | Completa (8 prioridades) |
| PCQ integrado | No nativo | Sí, como queue-type |
| Fasttrack compatible | Parcialmente | No — debe deshabilitarse |
| Uso CPU | Mayor con muchos clientes | Menor por HTB |
| Recomendado para | <50 clientes, config simple | ISP/WISP producción |
2. Conceptos clave antes de configurar
HTB — Hierarchical Token Bucket
HTB organiza el tráfico en un árbol donde cada nodo tiene dos parámetros fundamentales:
- limit-at: ancho de banda garantizado — el nodo siempre recibe esto si lo necesita
- max-limit: techo máximo — puede usar más si el ancho de banda padre está disponible
La magia de HTB es que el ancho de banda no utilizado por un hijo se redistribuye automáticamente entre los demás hijos. Un cliente que está durmiendo a las 3am "presta" su ancho de banda a quien lo está usando.
PCQ — Per Connection Queue
PCQ es un queue-type que subdivide automáticamente el ancho de banda disponible entre todos los flujos activos que comparten esa cola. No configuras límites individuales — PCQ los calcula dinámicamente. Ideal para sectores wireless donde 30 clientes comparten un canal y quieres distribución equitativa sin configurar 30 colas individuales.
Packet Marks con Mangle
Queue Tree no puede aplicar colas a IPs directamente como Simple Queue. Necesitas marcar paquetes con /ip firewall mangle y luego Queue Tree filtra por esas marcas. Un flujo típico es: Mangle marca el paquete → Queue Tree aplica la cola correspondiente a esa marca.
3. Deshabilitar Fasttrack (obligatorio)
# Ver reglas de Fasttrack activas /ip firewall filter print where action=fasttrack-connection # Deshabilitar las reglas de Fasttrack que afecten las interfaces con Queue Tree /ip firewall filter disable [find action=fasttrack-connection] # Alternativa: eliminarlas si no las necesitas /ip firewall filter remove [find action=fasttrack-connection] # Verificar que connection tracking está activo (necesario para Queue Tree) /ip firewall connection tracking print # enabled=yes es obligatorio
4. Configurar PCQ types para upload y download
Primero definimos los tipos de cola PCQ. Necesitamos dos: uno para download (clasificado por IP destino — el cliente) y uno para upload (clasificado por IP origen — el cliente):
# PCQ para download: clasifica por IP destino (el cliente recibe datos) /queue type add name=pcq-download kind=pcq pcq-classifier=dst-address \ pcq-rate=0 pcq-limit=50KiB pcq-total-limit=2000KiB # PCQ para upload: clasifica por IP origen (el cliente envía datos) /queue type add name=pcq-upload kind=pcq pcq-classifier=src-address \ pcq-rate=0 pcq-limit=50KiB pcq-total-limit=2000KiB # pcq-rate=0 significa "divide el ancho de banda equitativamente" sin límite fijo por cliente # Si quieres limitar a X Mbps máximo por cliente: pcq-rate=10M # Verificar /queue type print
5. Mangle: marcar tráfico por dirección
Queue Tree necesita marcas de paquete para saber qué tráfico va a qué cola. Para una estructura básica de ISP, marcamos todo el tráfico que entra y sale del enlace WAN:
# Marcar conexiones y paquetes para download (tráfico entrando desde WAN hacia clientes) /ip firewall mangle add chain=forward action=mark-connection \ new-connection-mark=download-con in-interface=ether1-wan \ connection-state=new comment="QoS: marcar conexiones download" /ip firewall mangle add chain=forward action=mark-packet \ new-packet-mark=download-pkt connection-mark=download-con \ passthrough=no comment="QoS: marcar paquetes download" # Marcar conexiones y paquetes para upload (tráfico saliendo de clientes hacia WAN) /ip firewall mangle add chain=forward action=mark-connection \ new-connection-mark=upload-con out-interface=ether1-wan \ connection-state=new comment="QoS: marcar conexiones upload" /ip firewall mangle add chain=forward action=mark-packet \ new-packet-mark=upload-pkt connection-mark=upload-con \ passthrough=no comment="QoS: marcar paquetes upload" # Ajusta ether1-wan al nombre real de tu interfaz WAN
6. Queue Tree básico: limitar el enlace total
Con los PCQ types y las marks listas, creamos el árbol de colas. Estructura: un nodo padre por dirección (limita el enlace total) y nodos hijo que aplican el PCQ a los paquetes marcados:
# Nodo padre DOWNLOAD: limita el enlace de bajada total (ajusta max-limit a tu uplink) /queue tree add name=download parent=global max-limit=100M \ comment="QoS: enlace download total 100Mbps" # Nodo hijo download: aplica PCQ a paquetes marcados como download /queue tree add name=download-pcq parent=download \ packet-mark=download-pkt queue=pcq-download max-limit=100M \ comment="QoS: PCQ download por cliente" # Nodo padre UPLOAD: limita el enlace de subida total /queue tree add name=upload parent=global max-limit=20M \ comment="QoS: enlace upload total 20Mbps" # Nodo hijo upload: aplica PCQ a paquetes marcados como upload /queue tree add name=upload-pcq parent=upload \ packet-mark=upload-pkt queue=pcq-upload max-limit=20M \ comment="QoS: PCQ upload por cliente" # Verificar árbol /queue tree print
7. QoS multi-nivel: priorizar VoIP y limitar P2P
La ventaja real de Queue Tree es la jerarquía. Podemos crear clases de tráfico con diferentes prioridades dentro del mismo enlace. Estructura: padre (límite total) → hijos por clase (VoIP alta prioridad, navegación normal, P2P baja prioridad):
# Marcar tráfico VoIP (SIP/RTP): puertos 5060 UDP y rango RTP 10000-20000 /ip firewall mangle add chain=prerouting action=mark-packet \ new-packet-mark=voip-pkt protocol=udp dst-port=5060 \ passthrough=no comment="QoS: VoIP SIP" /ip firewall mangle add chain=prerouting action=mark-packet \ new-packet-mark=voip-pkt protocol=udp dst-port=10000-20000 \ passthrough=no comment="QoS: VoIP RTP" # Marcar tráfico P2P/BitTorrent (puertos típicos) /ip firewall mangle add chain=prerouting action=mark-packet \ new-packet-mark=p2p-pkt protocol=tcp dst-port=6881-6889 \ passthrough=no comment="QoS: P2P BitTorrent" # El resto es tráfico normal (HTTP, HTTPS, DNS, etc.) # No necesita mark específica — usamos cola default del padre
# Padre: límite total del enlace download /queue tree add name=dl parent=global max-limit=100M # Clase VoIP: prioridad 1 (más alta), garantía mínima de 5Mbps /queue tree add name=dl-voip parent=dl packet-mark=voip-pkt \ priority=1 limit-at=5M max-limit=100M \ comment="QoS: VoIP alta prioridad" # Clase P2P: prioridad 8 (más baja), máximo 20% del enlace /queue tree add name=dl-p2p parent=dl packet-mark=p2p-pkt \ priority=8 max-limit=20M \ comment="QoS: P2P limitado" # Clase default (todo lo demás): prioridad media, usa lo que quede /queue tree add name=dl-default parent=dl \ priority=4 limit-at=10M max-limit=100M queue=pcq-download \ comment="QoS: tráfico normal" # Repetir estructura para upload /queue tree add name=ul parent=global max-limit=20M /queue tree add name=ul-voip parent=ul packet-mark=voip-pkt \ priority=1 limit-at=2M max-limit=20M /queue tree add name=ul-p2p parent=ul packet-mark=p2p-pkt \ priority=8 max-limit=5M /queue tree add name=ul-default parent=ul \ priority=4 limit-at=2M max-limit=20M queue=pcq-upload
Priority 1 = más alta, Priority 8 = más baja. La prioridad solo determina qué cola se sirve primero cuando hay congestión — no limita el ancho de banda por sí sola. Combina priority con limit-at (garantía) y max-limit (techo) para control preciso.
8. Queue Tree por cliente PPPoE con mangle
Para ISPs con PPPoE, lo más limpio es marcar tráfico por IP de cliente (asignada por el pool PPPoE) y crear una cola por plan. Combinado con User Manager, cada profile puede tener su propio nodo en el árbol:
# Marcar clientes del plan 20Mbps (rango IP del pool de ese plan) /ip firewall mangle add chain=forward action=mark-packet \ new-packet-mark=plan-20mb-dl dst-address=10.10.1.0/24 \ in-interface=ether1-wan passthrough=no \ comment="QoS: plan 20Mbps download" /ip firewall mangle add chain=forward action=mark-packet \ new-packet-mark=plan-20mb-ul src-address=10.10.1.0/24 \ out-interface=ether1-wan passthrough=no \ comment="QoS: plan 20Mbps upload" # Marcar clientes del plan 50Mbps /ip firewall mangle add chain=forward action=mark-packet \ new-packet-mark=plan-50mb-dl dst-address=10.10.2.0/24 \ in-interface=ether1-wan passthrough=no \ comment="QoS: plan 50Mbps download" /ip firewall mangle add chain=forward action=mark-packet \ new-packet-mark=plan-50mb-ul src-address=10.10.2.0/24 \ out-interface=ether1-wan passthrough=no \ comment="QoS: plan 50Mbps upload" # Colas por plan con PCQ interno /queue tree add name=dl parent=global max-limit=200M /queue tree add name=dl-plan20 parent=dl packet-mark=plan-20mb-dl \ max-limit=20M queue=pcq-download \ comment="QoS: clientes plan 20Mbps" /queue tree add name=dl-plan50 parent=dl packet-mark=plan-50mb-dl \ max-limit=50M queue=pcq-download \ comment="QoS: clientes plan 50Mbps"
9. Verificar que el QoS está funcionando
# Ver estadísticas de las colas en tiempo real /queue tree print stats # Ver bytes y paquetes procesados por cada nodo /queue tree print detail # Monitorear en tiempo real (actualiza cada 1 segundo) /queue tree monitor # Ver si hay dropped packets (indica congestión) /queue tree print stats where dropped>0 # Ver marcas activas en mangle (paquetes procesados) /ip firewall mangle print stats
Contadores en 0 después de tráfico activo indican que los paquetes no están llegando al Queue Tree. Causas comunes: Fasttrack sigue activo, la interface parent está mal configurada (parent=global vs nombre de interfaz), o las packet-marks del mangle no coinciden con las del Queue Tree. Verifica con /ip firewall mangle print stats — si los contadores del mangle también están en 0, el problema está antes.
Conclusión
Queue Tree con HTB y PCQ es la forma correcta de implementar QoS en un ISP/WISP MikroTik a escala. La curva de aprendizaje existe — requiere entender mangle marks y la jerarquía de nodos — pero el resultado es un sistema de colas eficiente que escala a cientos de clientes sin degradar el CPU y permite priorización granular del tráfico.
Los puntos críticos: deshabilitar Fasttrack antes de empezar, usar parent=global solo cuando realmente quieres que la cola opere sobre todo el tráfico del router, y verificar siempre con los contadores del mangle que las marcas se están aplicando correctamente.
En MikroHelp implementamos Queue Tree en ISPs con 200 a 2000 clientes activos. Si tu WISP tiene problemas de QoS o tus clientes se quejan de congestión en horas pico, contáctanos para evaluar tu configuración actual.
¿QoS inconsistente en tu WISP?
Revisamos tu Queue Tree, mangle y configuración de Fasttrack. Diagnóstico gratuito.
Conocer el soporte MikroTik remoto o solicita una evaluación gratuita →