A Internet tem avançado muito rápido e isso tem mudado a forma como as pessoas, empresas e instituições trabalham ou se relacionam umas com as outras. Atualmente, não é possível pensar em vida sem Internet, porém, esse avanço sem controle tem provocado todo tipo de percepções utópicas e distópicas, muitos nem sequer sabem como funcionam a internet, compartilham com seus vizinhos ou usam em muitos equipamentos, fazem downloads/atualizações, assistem vídeos e querem navegar na internet simultaneamente. E eis que isso tem gerado muitos chamados para os "Provedores".
Desde o lançamento do Windows 10, os Provedores têm visto o aumento absurdo desse tipo de chamado. Diante de tal problema, resolvi ir atrás de alguma solução de
QoS básica individual e automático. Consegui achar alguns exemplos de scripts na internet, fiz algumas modificações para poder gerar QoS automático para clientes com ou sem Burst.
A principio tem funcionado bem. A seguir, veremos como implementar um QoS básico, dinâmico e individual.
Configuração
Antes de começar, vamos entender o que esse script faz?
A cada nova conexão, ele analisa os dados da "Simple Queue" desse cliente que acabou de conectar e cria algumas regras no Queue Tree para ele, com 5 tipos de priorização, conforme o tamanho do pacote (independente de site, protocolo ou serviço).
Apenas como exemplo, caso o cliente esteja fazendo um download/atualização (que consome muita Banda/Internet) e ele decida navegar na internet, o QoS irá dar prioridade à navegação.
Agora que entendemos o básico sobre o script, segue abaixo o código.
As regras abaixo você deve adicionar em:
Concentrador Mikrotik → Firewall → Mangle
/ip firewall mangle
add action=mark-connection chain=forward comment=QoS-Andriopj_Client_PPPoE new-connection-mark=QoS_conn_Down out-interface=all-ppp passthrough=yes
add action=mark-packet chain=forward connection-bytes=0-524288 connection-mark=QoS_conn_Down new-packet-mark=QoS-Andriopj_512K passthrough=yes
add action=mark-packet chain=forward connection-bytes=524289-5242880 connection-mark=QoS_conn_Down new-packet-mark=QoS-Andriopj_5M passthrough=yes
add action=mark-packet chain=forward connection-bytes=5242881-20971520 connection-mark=QoS_conn_Down new-packet-mark=QoS-Andriopj_20M passthrough=yes
add action=mark-packet chain=forward connection-bytes=20971521-52428800 connection-mark=QoS_conn_Down new-packet-mark=QoS-Andriopj_50M passthrough=yes
add action=mark-packet chain=forward connection-bytes=52428801-0 connection-mark=QoS_conn_Down new-packet-mark=QoS-Andriopj_Infinity passthrough=yes
Esse, você adiciona no:
Concentrador Mikrotik → PPP → Profile
Abra cada um dos: Profiles → aba Scripts → On Up
:foreach i in=[/queue simple find where name=""] do={
:local qName [/queue simple get $i name];
:local rLimit [/queue simple get $i max-limit];
:local burstl [/queue simple get $i burst-limit];
:local indexExplod [:find $burstl "/"];
:local lenth [:len $burstl];
:local bl [:pick $burstl ($indexExplod + 1) ($lenth - 1)];
:local burstt [/queue simple get $i burst-time];
:local burstth [/queue simple get $i burst-threshold];
:local indexExplod [:find $burstt "/"];
:local lenth [:len $burstt];
:local bt [:pick $burstt ($indexExplod + 1) ($lenth - 1)];
:local btUnity [:pick $burstt ($lenth - 1) $lenth];
:local indexExplod [:find $burstth "/"];
:local lenth [:len $burstth];
:local bth [:pick $burstth ($indexExplod + 1) ($lenth - 1)];
:local indexExplod [:find $rLimit "/"];
:local lenth [:len $rLimit];
:local rl [:pick $rLimit ($indexExplod + 1) ($lenth - 1)];
:local rlUnity [:pick $rLimit ($lenth - 1) $lenth];
:local c512k [($rl * 55 / 100)];
:local c5M [($rl * 25 / 100)];
:local c20M [($rl * 20 / 100)];
:local c50M [($rl * 15 / 100)];
:local cInf [($rl * 10 / 100)];
:if ([:len $bl] != 0) do={
/queue tree add name="QoS_$qName" parent="$interface" queue="default" max-limit="$($rl)$rlUnity" burst-limit="$($bl)$rlUnity" burst-time="$($bt)$btUnity" burst-threshold="$($bth)$rlUnity" bucket-size=0.20;
/queue tree add name="2-512k_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_512K" queue="default" priority="4" limit-at="$($c512k)$rlUnity" max-limit="$($rl)$rlUnity" burst-limit="$($bl)$rlUnity" burst-time="$($bt)$btUnity" burst-threshold="$($bth)$rlUnity";
/queue tree add name="4-5M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_5M" queue="default" priority="5" limit-at="$($c5M)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="6-20M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_20M" queue="default" priority="6" limit-at="$($c20M)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="7-50M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_50M" queue="default" priority="7" limit-at="$($c50M)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="8-Inf_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_Infinity" queue="default" priority="8" limit-at="$($cInf)$rlUnity" max-limit="$($rl)$rlUnity";
:log warning "QUEUE add === $qName";
}
else={
/queue tree add name="QoS_$qName" parent="$interface" queue="default" max-limit="$($rl)$rlUnity" bucket-size=0.20;
/queue tree add name="2-512k_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_512K" queue="default" priority="2" limit-at="$($c512k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="4-5M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_5M" queue="default" priority="4" limit-at="$($c5M)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="6-20M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_20M" queue="default" priority="6" limit-at="$($c20M)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="7-50M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_50M" queue="default" priority="7" limit-at="$($c50M)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="8-Inf_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_Infinity" queue="default" priority="8" limit-at="$($cInf)$rlUnity" max-limit="$($rl)$rlUnity";
:log warning "QUEUE add === $qName"; }
}
Esse, você adiciona no:
Concentrador Mikrotik → PPP → Profile
Abra cada um dos: Profiles → aba Scripts → On Down
/queue tree remove [find where parent="QoS_"]
/queue tree remove [find where name="QoS_"]
:foreach a in=[/queue tree find where invalid] do={ /queue tree remove $a };
Pronto, nesse momento seu QoS já deve estar implantado e funcionando.
Você irá notar que a cada cliente que se conectar/reconectar, serão criadas algumas regras de QoS para ele no Queue Tree.
Caso tenham alguma sugestão de correção ou melhoria, avisem nos comentários abaixo.
Fontes