Redacto esta guía en favor de aquellos que hayan tenido problemas, como a mi me pasó, con lo poco de información que se tiene en la web y el tacto intermedio del procedimiento.
No hago configuraciones. Simplemente escribí esa guía para entusiastas que deseen entender la idea y aplicarla.
Si bien mi configuración no es la óptima, estoy escribiendo el manual de una forma más generalizada, para aquellos usuarios que tengan necesidades más avanzadas. La guía consta de 2 partes, ésta tratará de explicar el QoS básico que comúnmente se podrá usar. La segunda parte tratará sobre PCQ y un QoS dinámico, para los que manejen grandes cantidades de usuarios.
Comenzaré con unos términos básicos y lo que utilizaremos para este tipo de QoS, debido a que en esta parte expondré los beneficios de cada opción por sobre otras distintas, comúnmente usadas, si es que se da el caso.
Utilizaremos:
Queue Tree: Utilizaremos Queue Tree por sobre Simple Queue debido en gran parte a la organización jerárquica que da el routerOS en este último. El problema más grande de usar Simple Queue es que debido a este tipo de organización, en caso se tenga una gran cantidad de reglas, éstas se irán cumpliendo una por una en el orden que se tiene configurado.
Como se muestra en la siguiente imagen: La jerarquía se va cumpliendo de arriba para abajo en ese orden, en caso tengamos 100 reglas en el Simple Queue, éste utilizará recursos y tiempo para llegar a la centésima regla ya que se hace en ese orden.
En cambio, el uso de Queue Tree todo el control de tráfico es simultáneo y especialmente da la posibilidad de usar los HTB (Heriarchical Token Bucket) que en el caso del routerOS se soportan 3 tipos: global-in, global-out y global-total.
Global-in, todo el tráfico ingresante al router.
Global-out, todo el tráfico saliente del router.
Global-total, todo el tráfico.
FW/Mangle: Aplicaremos reglas por cada tipo de conexión utilizando puertos comunes, marcándolas para poder procesarlas luego en nuestro Queue Tree.
Cadena Prerouting: Utilizaremos Prerouting en este caso, pero también es posible utilizar Forward en el Mangle. Esta vez, utilizaremos prerouting (Rojo) debido a que para la siguiente parte de la guía, ya que según el orden del flujo del QoS, este se aplicará un paso pal de Forward lo cual en la siguiente guía utilizaremos para un QoS basado en PCQ (Verde).
Mark Connection: Utilizaremos mark connection para de esta forma poder monitorear los IPs a los que nos estamos conectando y especialmente para agregar modificadores especiales POR conexión, como el tamaño de la conexión o de paquetes, para luego marcar dichas conexiones con el Mark Packet.
Mark Packet: Utilizaremos mark packet para poder trabajar con las conexiones marcadas en el Queue Tree.
Guía de aplicación
Comenzaremos entonces creando las conecciones y sus respectivos Packet Marks en el Mangle
Dentro del Winbox Ingresamos a IP > Firewall > Pestaña Mangle > [+]
Procedemos con la identificación del puerto (revisar siguiente post) con los puertos comúnmente usados, (en contínua actualización).
Como ejemplo utilizaré el puerto 80 que es el usado para todo el tráfico de la Web y con unos modificadores extras para diferenciar web browsing (500kbytes o menos) de las descargas (500kbytes o más).
En la ventana de New Mangle Rule, pestaña General:
Chain seleccionamos Prerouting Ya explicado arriba
Protocol seleccionamos 6 (TCP). Se puede usar 17 (UDP) también, dependiendo de lo que queramos marcar. En este caso TCP es lo que va al caso
Dst Port seleccionamos el puerto al que la marca apuntara en este caso: 80
En la misma ventana, pero pestaña Advanced
Connection Bytes seleccionaremos el rango del tamaño de archivo: 0-512000 eso quiere decir que como máximo las conexiones con 512kb van a ser marcadas para esta regla. Luego optaremos en marcar las conexiones de más de 512kb pero con otra marca (descarga)
En la misma ventana, pero pestaña ]Action
Action seleccionaremos mark connection
New Connection Mark seleccionaremos un nombre que identifique esta conexión de menos de 512kb por ejemplo: http_conn
Passthrough, Check activado
Para terminar con nuestra primera regla de marca le dejamos un comentario para saber a donde apunta, en este caso un simple HTTP basta.
Luego para finalizar le damos a Apply y luego Ok
Ahora pasaremos a marcar el paquete de la conexión que acabamos de marcar para tener acceso a este a través del Queue Tree.
Empezamos dándole nuevamente a [+]
En la ventana New Mangle Rule, pestaña General:
Chain seleccionamos Prerouting
Connection Mark seleccionamos la conexión antes marcada: http_conn
En la misma ventana, pestaña Action
Action seleccionamos Mark Packet
New Packet Mark seleccionamos un nombre distintivo para este paquete por ejem: http
Passthrough en este caso le quitamos el check porque el trafico ya está siendo redirigido a través de la anterior marca y quitamos el check para evitar redundancias.
La idea es configurar nuestras reglas con los puertos más usados (ver post siguiente)
Para ello, tener en mente:
Se puede escoger el protocolo ICMP (Ping), TCP o UDP, dependiendo de cual es el que está en uso.
Se pueden escoger más que un solo puerto. Revisar la siguiente imagen con todos los datos que he usado yo en mi caso. Soy bastante quisquilloso en lo que refiere a juegos por lo que manualmente he agregado los puertos que estos utilizan para darles una prioridad mayor que a las demás. Definitivamente se puede englobar todo dentro de uno solo, pero para fines educativos los puse separados.
Para finalizar está parte cabe recalcar la última regla Otras Conexiones
Si alguna conexión no llega a marcarse en ninguna de las reglas anteriores creamos como regla FINAL una que englobe lo que queda del tráfico.
Para ello crearemos una nueva regla con Chain: Prerouting y en Action: Mark Connection con passthrough activado.
Como antes, con cualquier otra regla. Creamos una nueva para marcar el paquete: Prerouting, Connection Mark apuntando a la marca de conexión del anterior paso y Mark Packet sin passthrough como en la imagen:
Para los que le gusta todo fácil, acá el código de mi mangle. Solo pegarlo en un Nuevo Terminal
----------------------------------------------------------------------------------------------------------------------------Código:/ip firewall mangle add action=mark-connection chain=prerouting comment="ICMP (Ping)" disabled=no new-connection-mark=icmp_conn passthrough=yes protocol=icmp add action=mark-packet chain=prerouting comment="" connection-mark=icmp_conn disabled=no new-packet-mark=icmp passthrough=no add action=mark-connection chain=prerouting comment=DNS disabled=no dst-port=53 new-connection-mark=dns_conn passthrough=yes protocol=udp add action=mark-packet chain=prerouting comment="" connection-mark=dns_conn disabled=no new-packet-mark=dns passthrough=no add action=mark-connection chain=prerouting comment=Http connection-bytes=0-500000 disabled=no dst-port=80 new-connection-mark=http_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=http_conn disabled=no new-packet-mark=http passthrough=no add action=mark-connection chain=prerouting comment="Http Descarga" connection-bytes=500000-5000000 disabled=no dst-port=80 new-connection-mark=http_conn_descarga passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=http_conn_descarga disabled=no new-packet-mark=http_descarga passthrough=no add action=mark-connection chain=prerouting comment=Https disabled=no dst-port=443 new-connection-mark=https_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=https_conn disabled=no new-packet-mark=https passthrough=no add action=mark-connection chain=prerouting comment=WoW disabled=no dst-port=3724,6112-6114,6881-6999 new-connection-mark=wow_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=wow_conn disabled=no new-packet-mark=wow passthrough=no add action=mark-connection chain=prerouting comment="" disabled=no dst-port=3724 new-connection-mark=wow_udp_conn passthrough=yes protocol=udp add action=mark-packet chain=prerouting comment="" connection-mark=wow_udp_conn disabled=no new-packet-mark=wow_udp passthrough=no add action=mark-connection chain=prerouting comment=LoL disabled=no dst-port=2099,5222,5223,8393-8400 new-connection-mark=lol_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=lol_conn disabled=no new-packet-mark=lol passthrough=no add action=mark-connection chain=prerouting comment="" disabled=no dst-port=5000-5500 new-connection-mark=lol_udp_conn passthrough=yes protocol=udp add action=mark-packet chain=prerouting comment="" connection-mark=lol_udp_conn disabled=no new-packet-mark=lol_udp passthrough=no add action=mark-connection chain=prerouting comment=Ventrilo disabled=no dst-port=30572 new-connection-mark=vent_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=vent_conn disabled=no new-packet-mark=ventrilo passthrough=no add action=mark-connection chain=prerouting comment=MSN disabled=no dst-port=1863 new-connection-mark=msn_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=msn_conn disabled=no new-packet-mark=msn passthrough=no add action=mark-connection chain=prerouting comment=Winbox disabled=no dst-port=8291 new-connection-mark=winbox_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=winbox_conn disabled=no new-packet-mark=winbox passthrough=no add action=mark-connection chain=prerouting comment="Dragon Nest" disabled=no dst-port=14300,14301,14403,7000,14500 new-connection-mark=dragon_nest_conn passthrough=yes protocol=tcp add action=mark-packet chain=prerouting comment="" connection-mark=dragon_nest_conn disabled=no new-packet-mark=dragon_nest passthrough=no add action=mark-connection chain=prerouting comment="" disabled=no dst-port=15100-15110 new-connection-mark=dragon_nest_udp_conn passthrough=yes protocol=udp add action=mark-packet chain=prerouting comment="" connection-mark=dragon_nest_udp_conn disabled=no new-packet-mark=dragon_nest_udp passthrough=no add action=mark-connection chain=prerouting comment=Otros disabled=no new-connection-mark=otras_conn passthrough=yes add action=mark-packet chain=prerouting comment="" connection-mark=otras_conn disabled=no new-packet-mark=other passthrough=no
Ahora lo que queda es ir al Queue Tree para así escoger los límites y prioridades de las distintas conexiones.
Para esto comenzamos por:
Entrar Queues > Queue Tree > [+]
Lo que se hará primero es crear una nueva cola (Queue), como Padre (Parent) de las subsiguientes solamente para tener un orden y se haga más fácil las limitaciones. Utilizaremos 2: una de descarga y una de subida.
La cola padre de descarga la configuraremos de la manera siguiente, donde el Parent de esta cola es el Puerto FÍSICO del que sale toda nuestra información del router (Osea el puerto LAN).
La siguiente cola que crearemos la configuraremos de la misma manera, solo que el Parent nuevo es el creamos en el paso anterior, pero dirigido a la conexión que marcamos en el Mangle. Hacemos uno por cada Conexión marcada en el Mangle inclusive la que engloba todas. En mi caso hice nuevas subdivisiones extra, esto depende del uso de cada persona. Por otro lado, se tiene que ingresar la prioridad que tendrá cada conexión, como en mi caso priorizo juegos por sobre todo lo demás, le he dado más prioridad que http, pero no menos prioridad que los VoIP.
Al finalizar con todas las colas deberían tener algo parecido al mio:
Para copy/paste sobre el terminal OJO modificar "LAN ether5" con el puerto de salida que estén usando y WAN por el de entrada (el puerto conectado a su router con modo bridge).
Nótese que la única limitación que use fue a la web y todo lo restante lo he dejado para juegos.Código:/queue tree add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=QoS_down parent="LAN ether5" priority=1 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=2M max-limit=2350k name=3QoS_down_Web parent=QoS_down priority=5 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=2QoS_down_Games parent=QoS_down priority=2 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=1QoS_down_VoIP parent=QoS_down priority=1 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=QoS_up parent=WAN priority=1 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=1QoS_up_VoIP parent=QoS_up priority=1 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=2QoS_up_Games parent=QoS_up priority=2 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=400k max-limit=512k name=3QoS_up_Web parent=QoS_up priority=5 add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name="ICMP_(Ping)_up" packet-mark=icmp parent=1QoS_up_VoIP priority=1 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=DNS_up packet-mark=dns parent=3QoS_up_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Http_up packet-mark=http parent=3QoS_up_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Https_up packet-mark=https parent=3QoS_up_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Otros_up packet-mark=other parent=3QoS_up_Web priority=6 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=WinBox packet-mark=winbox parent=1QoS_down_VoIP priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=MSN packet-mark=msn parent=3QoS_down_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=LoL_udp packet-mark=lol_udp parent=2QoS_down_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Ventrilo_up packet-mark=ventrilo parent=1QoS_up_VoIP priority=1 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=WinBox_up packet-mark=winbox parent=1QoS_up_VoIP priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name="Dragon Nest" packet-mark=dragon_nest parent=2QoS_down_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=MSN_up packet-mark=msn parent=3QoS_up_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name="Dragon Nest_up" packet-mark=dragon_nest parent=2QoS_up_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name="Dragon Nest_udp" packet-mark=dragon_nest_udp parent=2QoS_down_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name="Dragon Nest_udp_up" packet-mark=dragon_nest_udp parent=2QoS_up_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=LoL_up packet-mark=lol parent=2QoS_up_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=LoL_udp_up packet-mark=lol_udp parent=2QoS_up_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=WoW_up packet-mark=wow parent=2QoS_up_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=WoW_udp_up packet-mark=wow_udp parent=2QoS_up_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Http_Descarga packet-mark=http_descarga parent=3QoS_down_Web priority=6 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name="ICMP_(Ping)" packet-mark=icmp parent=1QoS_down_VoIP priority=1 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=DNS packet-mark=dns parent=3QoS_down_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Http packet-mark=http parent=3QoS_down_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Https packet-mark=https parent=3QoS_down_Web priority=5 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=WoW packet-mark=wow parent=2QoS_down_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=WoW_udp packet-mark=wow_udp parent=2QoS_down_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=LoL packet-mark=lol parent=2QoS_down_Games priority=2 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Ventrilo packet-mark=ventrilo parent=1QoS_down_VoIP priority=1 queue=default add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 max-limit=0 name=Otros packet-mark=other parent=3QoS_down_Web priority=7 queue=default
Nótese que el Parent de QoS_up es WAN en vez de Ether5
Esta última parte la hice más ínfima, la continuaré más tarde que ya estoy de salida.
Está sujeta a modificaciones, en caso me haya equivocado en algo favor de avisar para editarlo.
-- En continua actualización--
Basado en el diseño QoS por Megis en el MUM 09 en EEUU: http://mum.mikrotik.com/presentation.../megis_qos.pdf