Mikrotik QoS plan: queue trees + simple queues + PCQ

Edgar Merino
Apr 22, 2017 · 4 min read

El siguiente método sirve para priorizar paquetes de manera global con queue trees y aplicar límites de ancho de banda por usuario (paquete de datos) con simple queues + PCQ, funciona óptimo sólo en v6.X de RouterOS.

Esta configuración simplifica el doble marcado + doble encolamiento que se realizaba en v5.X de RouterOS. El doble marcado ya no es posible en v6.X, ya que los queue trees se procesan una sola vez (postrouting chain), como se puede apreciar en el diagrama de flujo de paquetes de v6.X.

Priorizar tráfico global

Lo primero que hay que hacer es identificar el tráfico que queremos priorizar, esto se realiza en la tabla MANGLE del firewall de RouterOS. Para optimizar el rendimiento del marcado, es necesario aplicar 2 marcas: 1 por conexión y otra por paquete, utilizando la marca de la conexión. Para este ejemplo, se marcará el tráfico HTTP (por puerto):

/ip firewall mangle# marcar conexión
add action=mark-connection chain=prerouting comment="HTTP CON" connection-state=new new-connection-mark=http-con port=\
80,443,8080,8181 protocol=tcp
# marcar paquete usando marca de conexión
add action=mark-packet chain=forward comment=HTTP connection-mark=http-con new-packet-mark=http passthrough=no
# las conexiones que nosotros no marcamos, tienen una marca
# "no-mark", con la cual podemos marcar estos paquetes para
# darles una prioridad (menor o mayor, según corresponda) que
# a otro tipo de tráfico
add action=mark-packet chain=forward comment="OTHER INTERNET" connection-mark=no-mark new-packet-mark=other-internet passthrough=no

Es importante especificar “passthrough=no” en la regla del marcado de paquete, para evitar gastar recursos del CPU. Como se puede apreciar, no es necesario especificar la interfaz para marcar el tráfico, ya que esto se hará en los queue trees (HTB), con lo que la configuración se simplifica.

La última marca que se agrega es para tener en cuenta el tráfico cuyas conexiones no estamos marcando, con esto podemos asignar una prioridad a este tipo de tráfico y así evitar que pase sin ser gestionado por nuestras colas HTB.

Lo siguiente es especificar las colas HTB para la priorización de tráfico:

/queue tree# una cola para el total del tráfico de bajada, aquí se especifica
# la interfaz desde la que se reparte el tráfico a los clientes,
# generalmente el puente local bridge-local
add limit-at=90M max-limit=90M name="Total download" parent=bridge-local priority=1 queue=default
# una cola para el total del tráfico de subida, aquí se especifica
# la interfaz desde la que se envía el tráfico al gateway
# (internet), generalmente ether1-gateway
add limit-at=20M max-limit=20M name="Total upload" parent=ether1-gateway priority=1 queue=default
# hoja (cola hija) de bajada para el tráfico web (HTTP), utiliza
# la marca establecida en la tabla mangle del firewall
add limit-at=20M max-limit=70M name=HTTP_D packet-mark=http parent="Total download" priority=3 queue=default
# hoja de subida para el tráfico web (HTTP), utiliza la misma marca
# de la cola anterior
add limit-at=1M max-limit=15M name=HTTP_U packet-mark=http parent="Total upload" priority=3 queue=default
# los paquetes con marca "other-internet" tienen una menor prioridad
# que los paquetes web, es necesario especificar estas colas, de lo
# contrario el tráfico no gestionado pasará con la mayor prioridad
add limit-at=10M max-limit=20M name=OTHER_D packet-mark=other-internet parent="Total download" priority=4 queue=default
add limit-at=1M max-limit=5M name=OTHER_U packet-mark=other-internet parent="Total upload" priority=4 queue=default

Algunas notas sobre lo anterior:

  • Se recomienda utilizar un 90% del tráfico total de cada interfaz como límite (en colas padre de subida/bajada), esto para garantizar que nuestras reglas se apliquen, ya que si se especifica un ancho de banda mayor al disponible, nuestras reglas serán ignoradas.
  • El tráfico puede gestionarse únicamente cuando sale del router, por ello es importante elegir las interfaces de subida/bajada adecuadamente.
  • El atributo “limit-at” debe especificarse a la tasa que se quiera garantizar para esta cola, y no debe ser mayor al límite global de la cola padre. La suma de los distintos límites de todas las hojas (colas hijas o leafs) debe ser menor o igual al total especificado para la cola padre.
  • El atributo “max-limit” es el tráfico que tomará prestado de la cola padre cuando se haya alcanzado “limit-at” y aún tenga ancho de banda disponible la cola padre. Es recomendado que la suma de los límites máximos especificados no sea mayor a la establecida para la cola padre.
  • Las últimas dos colas utilizan la marca “other-internet” para asignar una prioridad al tráfico que no estamos gestionando directamente, es muy importante agregarlas (subida/bajada).

Límite de velocidad por usuario

Ya que se tiene la parte global del tráfico (priorización), lo que sigue es establecer límites de velocidad por usuario. Para esto será necesario crear un par de tipos de cola PCQ uno para subida (src-address) y otro para bajada (dst-address) para cada paquete de datos:

/queue type# un queue type de tipo PCQ, con una tasa de 5M para el tráfico
# de bajada, classifier=dst-address
add kind=pcq name=PCQ_download_5mb pcq-classifier=dst-address pcq-rate=5M
# un queue type de tipo PCQ, con una tasa de 1M para el tráfico
# de subida, classifier=src-address
add kind=pcq name=PCQ_upload_1mb pcq-classifier=src-address pcq-rate=1M

Con los tipos de cola nuevos, se creará un Simple Queue (cola simple) para cada paquete de datos que queramos gestionar (en este caso sólo uno, para un paquete de 5M/1M):

/queue simple# límite global (compartido por todos los usuarios):
# 5M subida
# 35M bajada
#
# segmento de red de los clientes con este paquete de datos,
# puede usarse una interfaz de ser necesario:
# 10.10.12.0/24
add limit-at=5M/35M max-limit=5M/35M name=5MB_down_1MB_up queue=PCQ_upload_1mb/PCQ_download_5mb target=\
10.10.12.0/24 total-queue=default

La cola simple anterior permitirá establecer como máximo tasas de 1M/5M por cada usuario (IP), en caso que la suma total del tráfico utilizado por todos los clientes de esta cola exceda el límite global establecido (5M/35M), se ecualizará el tráfico disponible entre el total de clientes actuales.

Conclusión

La optimización de Simple Queues en v6.X permite simplificar las configuraciones de QoS, evitando el doble marcado. Siguiendo las pautas aquí descritas, es posible agregar más servicios para priorización de tráfico, así como distintos paquetes de velocidad de acuerdo a las necesidades de cada usuario.

NOTA: Es importante que no se esté utilizando fasttrack en las conexiones para que QoS funcione correctamente.

Edgar Merino

Written by

Desarrollo de software, redes, hacking.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade