Languages

User login


QoS (gestió de prioritats) en APs amb RouterOS


He estat provant durant un parell de setmanes d'aplicar QoS en alguns APs del Penedès. Els usuaris fan servir sovint el FTP dels servidors, els APs quedaven saturats de trànsit, i aplicant QoS ho he solucionat.

Primer explicaré de forma molt didàctica com funciona el trànsit de dades entre un AP i els clients, i que fa el QoS. Els que vulguin saber més, que llegeixin alguns dels enllaços de la wikipedia. Despres explicaré com he dissenyat el meu QoS pels APs, i explicaré com funciona un petit script que genera les comandes a posar en un RouterOS per a configurar el QoS d'una interfície.

L'autopista per on circulen les dades

Faré servir diversos simils per mirar d'explicar com es transemeten les dades entre un AP i diversos clients que hi son conectats. Hem pendré moltes llicencies, l'objectiu és que algú que no en sàpiga res pugui tenir una idea general de com funciona tot plegat.

Imagineu una autopista, en un extrem hi l'AP i en l'altre tots els clients que hi estan connectats. Aquesta autopista no te carrils ni mitjana, es un tram ample de carretera asfaltada. Les dades entre els clients i l'AP transiten en forma de paquets. Quan el vostre navegador descarrega una plana web del proxy, aquest divideix les dades en paquets i les envia al navegador. Imaginem que els paquets son vehicles.

La capacitat d'aquesta autopista es defineix per el numero de vehicles que poden passar per segon. Suposem que cada vehicle pot carregar 1024 bits (1Kbit), i la capcaitat de l'autopista és de 4Mbps, això vol dir que hi poden passar 4 * 1024 Kbits cada segon, 4096 vehicles cada segon. Aquesta capacitat és la total, tant de vehicles que van des de l'AP cap als clients com els que fan el cami invers.

Recordem que aquesta autopista no te cap carril ni regla establerta, els vehicles passen per on volen. Si no s'arriba al màxim de capacitat de l'autopista, els vehicles circulen sense problemes i arriben rapidament d'un extrem a un altre.


Ping

Si des d'un client fem un ping a un AP, el que estem fent es enviar un vehicle per aquesta autopista des del client a l'AP i aquest el retorna al client. El temps que tarda son els milisegons que surten en el ping. Mentre l'autopista no arribi al limit de la seva capacitat, el temps serà baix i estable, de 2-4ms.


L'embús aka congestió

Suposem ara que un client comença una descàrrega FTP d'un servidor de guifi. Els supernodes estan enllaçats amb autopistes mes grans que la que hi ha entre els APs i els clients. Per tant l'AP reb molts més vehicles que els que poden passar per l'autopista entre l'AP i el client.

Per a fer-ho més visual, imaginem que una descarrega FTP es una quantitat enorme de camions. L'AP reb 10.000 camions per segon des del servidor FTP i els envia per una autopista on nomes hi pasen 4.000 vehicles per segon. Es produeix un embús.

Mentres hi ha aquest embús, un altre client d'aquest AP prova de fer un ping, com que hi ha un embús, el vehicle que envia a l'AP i despres li retorna, tarda molt més. Per això el temps del ping es dispara a 150-300 ms. EL mateix li passa a un altre usuari d'aquell AP que estigui navegant per internet, els vehicles de dades que provenen del proxy, quan arriben a l'AP es troben amb una congestió i arriben més tard i amb dificultat al client.


Carrils i regles

El QoS es basa en un conjunt de tecniques per ordenar els vehicles que passen per aquesta autopista. Es tracta de marcar-hi carrils per on han de circular els vehicles i de posar un seguit de regles d'us. Cadascú pot marcar els carrils i posar les regles que vulgui en el seu AP.

Un exemple seria marcar 3 carrils, un per als camions, un per als vehicles que transporten dades del proxy i un altre per als vehicles del ping. I posar un seguit de regles que diguin a cada vehicle per on ha de passar. Cada vehicle pel seu carril, però en cas de que algun carril vagi buit, que el puguin fer servir els altres vehicles.

En l'exemple del FTP i ping que feia servir, els camions podrien passar per els 3 carrils, però a la que hi hagi un vehicle de ping, els camions surten del seu carril i li deixen pas lliure. El vehicle del ping te més prioritat, te un carril exclusiu, però aquest carril el poden fer servir altres vehicles en cas de que estigui lliure.


Som-hi

El QoS es pot dissenyar de moltes maneres, és practicament impossible fer-ne un de genèric. N'he fet un que he estat provant en alguns APs de 2.4Ghz. El que he fet son proves, no hi ha res que vagi a missa, i tot és discutible ;-)

Ordenarem el transit en 5 categories, cada una tindrà una prioritat, cada categoria és una cua (carril):

interactiu. El de mes prioritat, aqui hi poso el trafic ICMP (ping), DNS, i el TCP handshake (ACK, SYN, etc.)
fast. Prioritat 2, de moment nomes hi calssifico el ssh.
internet. Prioritat 3, els accesos a proxy i els tunels OpenVPN.
guifi. Prioritat 4, default, és la resta de transit que no va a cap altre de les cues.
bulk. El de menys priotitat, hi poso el transit FTP i el Direct Connect.

Suposem que l'AP està a la wlan2 d'un supernode, i que estimem que l'ample de banda màxim és de 4Mbps, definim les cues:

/ queue tree
add name="wlan2-qdisc" parent=wlan2 packet-mark="" limit-at=0 \
    queue=wireless-default priority=8 max-limit=4000000 \
    burst-limit=0 burst-threshold=0 burst-time=0s disabled=no
add name="wlan2-interactive" parent=wlan2-qdisc packet-mark=wlan2-interactive \
    limit-at=125000 queue=wireless-default priority=1 max-limit=4000000 \
    burst-limit=0 burst-threshold=0 burst-time=0s disabled=no
add name="wlan2-fast" parent=wlan2-qdisc packet-mark=wlan2-fast limit-at=125000 \
    queue=wireless-default priority=2 max-limit=4000000 burst-limit=0 \
    burst-threshold=0 burst-time=0s disabled=no
add name="wlan2-internet" parent=wlan2-qdisc packet-mark=wlan2-internet \
    limit-at=1000000 queue=default priority=3 max-limit=4000000 burst-limit=0 \
    burst-threshold=0 burst-time=0s disabled=no
add name="wlan2-guifi" parent=wlan2-qdisc packet-mark=wlan2-guifi limit-at=500000 \
    queue=wireless-default priority=4 max-limit=4000000 burst-limit=0 \
    burst-threshold=0 burst-time=0s disabled=no
add name="wlan2-bulk" parent=wlan2-qdisc packet-mark=wlan2-bulk limit-at=250000 \
    queue=synchronous-default priority=7 max-limit=4000000 burst-limit=0 \
    burst-threshold=0 burst-time=0s disabled=no


Ara cal marcar els paquets que surten per aquella interfície per a que despres es classifiquin i vagin a parar a la cua corresponent:

/ ip firewall mangle
add chain=postrouting action=mark-packet new-packet-mark=wlan2-bulk passthrough=no \
    out-interface=wlan2 protocol=tcp connection-type=ftp comment="wlan2 - FTP" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan2-bulk passthrough=no \
    p2p=direct-connect out-interface=wlan2 comment="wlan2 - Direct Connect" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan2-internet passthrough=no \
    out-interface=wlan2 src-port=3128 protocol=tcp comment="wlan2 - Proxy" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan2-internet passthrough=no \
    out-interface=wlan2 src-port=1194-1196 protocol=tcp comment="wlan2 - OpenVPN" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan2-interactive passthrough=no \
    out-interface=wlan2 protocol=icmp comment="wlan2 - ping" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan2-fast passthrough=no \
    out-interface=wlan2 dst-port=22 protocol=tcp comment="wlan2 - SSH \(in\)" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan2-fast passthrough=no \
    out-interface=wlan2 src-port=22 protocol=tcp comment="wlan2 - SSH \(out\)" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan2-interactive passthrough=no \
    tcp-flags=ack out-interface=wlan2 protocol=tcp comment="wlan2 - TCP ACK" disabled=yes
add chain=postrouting action=mark-packet new-packet-mark=wlan2-interactive passthrough=no \
    tcp-flags=syn out-interface=wlan2 protocol=tcp comment="wlan2 - TCP SYN" disabled=yes
add chain=postrouting action=mark-packet new-packet-mark=wlan2-interactive passthrough=no \
    out-interface=wlan2 src-port=53 protocol=udp comment="wlan2 - DNS" disabled=no
add action=mark-packet chain=postrouting comment="wlan2 - SSH (out)" disabled=no \
    new-packet-mark=wlan2-fast out-interface=wlan2 passthrough=no protocol=tcp src-port=22
add action=mark-packet chain=postrouting comment="wlan2 - SSH (in)" disabled=no dst-port=22 \
    new-packet-mark=wlan2-fast out-interface=wlan2 passthrough=no protocol=tcp
add chain=postrouting action=mark-packet new-packet-mark=wlan2-guifi passthrough=no \
    out-interface=wlan2 comment="wlan2 - Other" disabled=no


Amb el winbox, aneu a Queue->Queue Tree per a veure les cues, i a IP->Firewall->Mangle per a veure les regles que marquen els paquets. Des d'allà ho podeu modificar/desactivar/borrar.

He fet un script que crea les comandes. Li cal donar el nom de l'Interficie i l'ample de banda, l'exemple anterior l'he fet amb:

./qos-guifi.sh wlan2 4000000


Coses a tenir en compte

La documentació del RouterOS diu que les cues només es poden posar sobre interfícies físiques, però veig que no és ben be així. També he estat fent proves de QoS en els enllaços troncals, i allà s'ha de fer sobre la interfície WDS, que no és fisica.

En les wlan1 no funciona si hi ha un enllaç de cable a, per exemple, un servidor. Crec que s'hauria de fer sobre la Wlan/Lan, però no ho he provat. I no és bona idea fer-ho, perque limitarem l'acces al servidor als 4Mbps que definim per a l'AP. Com que tenim diferent ssupernodes amb diferents versions del RouterOS, no he pogut comprovar si això és culpa de la versió del RouterOS.

He creat les cues que m'ha semblat, i he repartit l'ample de banda de la manera que m'ha semblat més eficient.


No he tocat res dels "Burst" de les cues.

Les regles al mangle s'han de posar en un cert ordre. L'ultima regla marca els paquets que no han estat marcats per cap de les regles anteriors amb la marca "guifi". AIxí que si afegiu/treieu regles, comproveu que funcionin com voleu.

Alguna cosa falla al Mangle del RouterOS i no soc capaç de marcar el TCP handshake (ACK, SYN, etc.)

En les proves que he fet, funciona bé. No va fi quan hi ha un usuari amb mala conectivitat que genera molt de trànsit. Que no vagi fi no vol dir que vagi pitjor que sense QoS, sinó que el QoS no pot fer miracles, i si un usuari te mala conectivitat en un AP, continuarà donant problemes a la resta d'usuaris. El QoS mitigarà els efectes.

S'ha de provar, provar, provar i ajustar a les vostres necesitats. Però els resultats son molt bons.

 

Actualització 1

  • Afegit el marcatge de trànsit BGP i OSPF com a interactiu (Aleix)
  • Arreglat marcatge de trànsit DirectConnect com a bulk

Comentaris

Opcions de visualització de comentaris

Selecciona la vostra manera preferida de visualitzar els comentaris i feu clic en "Desa la configuració" per activar els canvis.

Molt bo

Molt bo Joan.

Per aquí ho aplico, afegint també el trànsit OSPF i BGP dins la categoria del trànsit interactiu amb màxima prioritat:

add chain=postrouting action=mark-packet new-packet-mark=$IFACE-interactive passthrough=no \\
out-interface=$IFACE protocol=ospf comment=\"$IFACE - ospf\" disabled=no

add chain=postrouting action=mark-packet new-packet-mark=$IFACE-interactive passthrough=no \\
out-interface=$IFACE protocol=bgp comment=\"$IFACE - bgp\" disabled=no

Només em fa por que hi hagi problemes amb els paquets de descripció de BD que siguin massa grossos i que el remei sigui pitjor que la malaltia, però ja donaré feedback si puc...

Pel tema d'usuaris amb mal senyal, la idea que tenim és restringir a nivell d'AP, fent que els usuaris amb menys de -85 no es puguin connectar. Amb aquestes dues coses la xarxa hauria d'anar de fàbula.

Verifica que les regles del

Verifica que les regles del iptables funcionin. Ahir, per exemple, vaig estar fent proves i veig que per alguna rao la regla que marca els paquets de transit Direct Connect no funciona.

I compte amb els amples de banda que defineixes si ho poses a troncals, ja que has de pensar en que quan fem un test d'ample de banda, ho fem en un sol sentit.

També s'ha de jugar amb els bursts, i segurament es pot millorar molt tot plegat.

Espero feedback .. ;-)

com pujar el arxiu al mikrotik?

Hola com pujo el arxiu al mikrotik?

Gracies en Joan ja se com fero ho he posat al mikrotik de Montolivet de probes

he fet

 sh qos-guifi.sh wlan1 4000000

el que vomita Xd es copia al terminal del mikrotik ; nomes 4mb que es el que dona la conecsio

wlan1 que conecta amb mont

 sh qos-guifi.sh wlan3 14000000

wlan3 que es on es conectan els clients de Olot a 14mb

 

 

Hola he encontrado esto por internet, extraido de una tesis

Primero marcamos los paquetes que vienen desde 192.168.0.0/24 (nuestra red local)

/ip firewall mangle add chain=forward src-address=192.168.0.0/24 action=mark-connection new-connection-mark=users-con
/ip firewall mangle add connection-mark=users-con action=mark-packet new-packet-mark=users chain=forward

Luego creamos las 2 nuevas PCQ (per connection Queue). El primero, llamado pcq-download agrupa a todo el trafico por direccion de destino. esta cola se le asigna a la interfaz Local, esta debe cread una cola dinamica para cada direccion de destino (usuario) que este bajando desde la red local . La segunda, llamada pcq-upload agrupa el trafico desde las direcciones de partida. Esta interfaz se debe asignar a la interfaz Public (internet) esta debe generar una cola dinamica por cada usuario que este subiendo algo a la internet desde la red local.

/queue type add name=pcq-download kind=pcq pcq-classifier=dst-address
/queue type add name=pcq-upload kind=pcq pcq-classifier=src-address

Finalmente hacemos el arbol de colas para el trafico de “Download”

/queue tree add name=Download parent=Local max-limit=1024000 priority=1
/queue tree add parent=Download queue=pcq-download packet-mark=users

y tambien para el trafico de “upload”

/queue tree add name=Upload parent=Public max-limit=256000 priority=1
/queue tree add parent=Upload queue=pcq-upload packet-mark=users

bueno y lo otro que tambien se puede hacer es marcar el trafico P2P (kazza, bittorrent, emule, etc) para que tenga una menor prioridad y tambien asignarle un ancho de banda menor, esto lo hacemos de la siguiente manera

primero marcando el trafico de los p2p

/ip firewall mangle add chain=forward p2p=all-p2p action=mark-connection new-connection-mark=p2p_conn
/ip firewall mangle add chain=forward connection-mark=p2p_conn action=mark-packet new-packet-mark=p2p

luego asignandole un prioridad baja y ademas asigandole muy poco ancho de banda (64kbps) de nuestro total de 1 mega

/queue tree add parent=Public packet-mark=p2p limit-at=3000 max-limit=64000 priority=8
/queue tree add parent=Local packet-mark=p2p limit-at=3000 max-limit=64000 priority=8

Bueno este ejemplo lo probe en el mikrotik de mi casa y funciona de maravilla … supongo ke se puede hacer de otra forma y mejor, si alguien sabe como digamelo =) gracias

Hola he generado el script en

Hola he generado el script en una ubuntu, y lo he pegado con el openoffice a un .doc para desde hay con el xp en el pc pegarlo en el systemscrypt del winbox.

Hay varias lineas que no funcionan, ñas he marcado con "#" al principio, la primera de todas porque en mi version de routeros 3.20 no esta el protocolo BGP, si desplegais la lista de protocolos, vereis que el BGP no esta. hay 2 lineas mas a parte de esta que no funcionan.

/ queue tree
add name="wlan1-qdisc" parent=wlan1 packet-mark="" limit-at=0 queue=wireless-default priority=8 max-limit=4000000 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no
add name="wlan1-interactive" parent=wlan1-qdisc packet-mark=wlan1-interactive limit-at=125000 queue=wireless-default priority=1 max-limit=4000000 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no
add name="wlan1-fast" parent=wlan1-qdisc packet-mark=wlan1-fast limit-at=125000 queue=wireless-default priority=2 max-limit=4000000 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no
add name="wlan1-internet" parent=wlan1-qdisc packet-mark=wlan1-internet limit-at=1000000 queue=default priority=3 max-limit=4000000 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no
add name="wlan1-guifi" parent=wlan1-qdisc packet-mark=wlan1-guifi limit-at=500000 queue=wireless-default priority=4 max-limit=4000000 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no
add name="wlan1-bulk" parent=wlan1-qdisc packet-mark=wlan1-bulk limit-at=250000 queue=synchronous-default priority=7 max-limit=4000000 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no

/ ip firewall mangle
add chain=postrouting action=mark-packet new-packet-mark=wlan1-bulk passthrough=no out-interface=wlan1 protocol=tcp connection-type=ftp comment="wlan1 - FTP" disabled=no
add chain=forward action=mark-packet new-packet-mark=wlan1-bulk passthrough=no p2p=direct-connect out-interface=wlan1 comment="wlan1 - Direct Connect" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan1-interactive passthrough=no out-interface=wlan1 protocol=ospf comment="wlan1 - ospf" disabled=no
#add chain=postrouting action=mark-packet new-packet-mark=wlan1-interactive passthrough=no out-interface=wlan1 protocol=bgp comment="wlan1 - bgp" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan1-internet passthrough=no out-interface=wlan1 src-port=3128 protocol=tcp comment="wlan1 - Proxy" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan1-internet passthrough=no out-interface=wlan1 src-port=1194-1196 protocol=tcp comment="wlan1 - OpenVPN" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan1-interactive passthrough=no out-interface=wlan1 protocol=icmp comment="wlan1 - ping" disabled=no
#add chain=postrouting action=mark-packet new-packet-mark=wlan1-fast passthrough=no out-interface=wlan1 dst-port=22 protocol=tcp comment="wlan1 - SSH \(in\)" disabled=no
#add chain=postrouting action=mark-packet new-packet-mark=wlan1-fast passthrough=no out-interface=wlan1 src-port=22 protocol=tcp comment="wlan1 - SSH \(out\)" disabled=no
add chain=postrouting action=mark-packet new-packet-mark=wlan1-interactive passthrough=no tcp-flags=ack out-interface=wlan1 protocol=tcp comment="wlan1 - TCP ACK" disabled=yes
add chain=postrouting action=mark-packet new-packet-mark=wlan1-interactive passthrough=no tcp-flags=syn out-interface=wlan1 protocol=tcp comment="wlan1 - TCP SYN" disabled=yes
add chain=postrouting action=mark-packet new-packet-mark=wlan1-interactive passthrough=no out-interface=wlan1 src-port=53 protocol=udp comment="wlan1 - DNS" disabled=no
add action=mark-packet chain=postrouting comment="wlan1 - SSH (out)" disabled=no new-packet-mark=wlan1-fast out-interface=wlan1 passthrough=no protocol=tcp src-port=22
add action=mark-packet chain=postrouting comment="wlan1 - SSH (in)" disabled=no dst-port=22 new-packet-mark=wlan1-fast out-interface=wlan1 passthrough=no protocol=tcp
add chain=postrouting action=mark-packet new-packet-mark=wlan1-guifi passthrough=no out-interface=wlan1 comment="wlan1 - Other" disabled=no  packet-mark=!wlan1-bulk

 

 

imatge de maus

Muchas gracias por el

Muchas gracias por el artículo y el script, me han sido muy útiles para empezar con el QOS en mi nodo de Castellón.

Un saludo

imatge de eloi.rebes

un parell d coses...

Hola,

  primer de tot dir que està molt ben pensat. Fent un script facilita molt més el codi a fer.

 Volia comentar que el fet d'afectar directament la xarxa afecti o no també a la llicència XOLN, on primcipalment es considera com a oberta, lliura i neutral. Doncs llegint sobre aquest tema està ben especificat ( a: http://guifi.net/ComunsXOLN#Sobre_la_gestio_de_la_xarxa ), que si definim en dos blocs, interactiu i bulk(=no tan prioritari), no cal que indiquem res. En cas contrari, si es creessin altres modificacions de les prioritats o variar el lliure accés per la xarxa, CAL indicar com es fa a la web del propi node.

 L'altre punt que volia comentar, només afecta aquest post, i és que des d'alguna vegada que s'ha fet canvis del servidor, l'archiu .sh on es fa referencia  s'han vist afectats els permisos (potser) i denega l'accés a ell, pel que no es pot descarregar. El que he fet és comprimir-lo en .zip i en .7z i tornar-lo a pujar i afegir l'enllaç per poder tenir-hi accés.

 Per últim, comentar que millor deixar neutra la xarxa, tot i tenir la voluntat de mirar pel bé del rendiment de la comunitat. Així mantingui l'esperit de transparent o totalment neutral. També és cert, que hi han zones on només es disposa d'1mbps d'ampla de banda a internet i potser el Qos millorarà el funcionament.

 sAx!

 

jo crec que en el cas d'aplicar

Qos preval el fet de que la xarxa funcioni be que en difinitiva es el que vol tothom i si posant Qos millores la xarxa no esta pas incomplint res no? i la gent contenta.