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.

Fasttrack + Queue Tree = QoS roto

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ísticaSimple QueueQueue Tree
Complejidad configBaja — GUI directaMedia — requiere mangle
EscalabilidadO(n) — lento con >50 colasHTB — eficiente con 1000+
JerarquíaSolo padre-hijo simpleÁrbol multinivel
Mangle marksOpcionalObligatorio
Priorización de tráficoBásicaCompleta (8 prioridades)
PCQ integradoNo nativoSí, como queue-type
Fasttrack compatibleParcialmenteNo — debe deshabilitarse
Uso CPUMayor con muchos clientesMenor por HTB
Recomendado para<50 clientes, config simpleISP/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:

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)

RouterOS — Deshabilitar Fasttrack en interfaces con QoS
# 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):

RouterOS 6/7 — /queue type PCQ
# 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:

RouterOS 6/7 — /ip firewall mangle
# 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:

RouterOS 6/7 — /queue tree estructura básica
# 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):

RouterOS 6/7 — Mangle para clasificación de tráfico
# 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
RouterOS 6/7 — Queue Tree multi-nivel
# 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
Prioridades en RouterOS

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:

RouterOS 6/7 — QoS por plan PPPoE
# 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

RouterOS — Monitoreo de Queue Tree
# 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
Si los contadores no suben

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 →