PPoE Mikrotik - QoS Dinâmico e Individual

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, eis que isso tem gerado muitos chamados para os "Provedores". A seguir, veremos como implementar um QoS básico, dinâmico e individual.

[ Hits: 16.190 ]

Por: Andrio Prestes Jasper em 31/05/2017


Introdução



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


   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Instalando o Fedora 10

Integração do Hotspot Mikrotik com AD Windows Server 2012

Servidor Fedora 11 de maneira fácil e funcional

Entendendo redes wireless

Leitura recomendada

Obtendo TimeStamps da Blockchain com OpenTimestamps

Nagios Core 4.0.8 com Debian 7 e Client Windows Server

Testando velocidade entre equipamentos Ubiquiti

Análise de Desempenho: Web API

Montagem de um cluster com o MOSIX

  
Comentários
[1] Comentário enviado por ivss em 01/06/2017 - 16:50h

Muito bom artigo!

[2] Comentário enviado por SamuelBrutus em 07/06/2017 - 11:17h

Bom dia prezado Andriopj! Antes de mais nada eu gostaria de agradecer pelo post. Muito interessante o conteúdo. E gostaria de fazer uma pergunta. Como eu aplicaria essa regra em outros tipos de profile. Por exemplo. em planos de 1 mega, 2 megas, 5 megas e 10 megas? Desde já agradeço pela atenção.

[3] Comentário enviado por blacksky em 08/06/2017 - 00:33h

Parabéns pela publicação, hoje em dia o problema não é banda para o provedor, mas sim o cliente que fica derretendo a rede lacrando sua banda contratada e ficando "indignado" com a "lentidao"

[4] Comentário enviado por jcgvieira em 01/08/2017 - 13:58h

Parabéns pela contribuição!

Tenho uma RB750 na minha rede interna (+ou- 30 pcs) e gostaria de implementar esse script, tem dias que o link não aguenta, muita requisição de maquinas fazendo win update, achei interessante esse qos individual, ele só serve para roteador de borda do provedor? Ou posso adaptar para meu cenário?

Obrigado.

[5] Comentário enviado por davidandrade em 03/12/2018 - 11:41h


Achei muito legal o script... parabéns pela iniciativa.
Fiz um script garantindo uma reserva de 512K para ICMP e arquivos abaixo de 2048k. Aconselho a usar em clientes de no minimo 5Mb.

Caso alguém queira reservar melhor essa banda faça a velocidade do cliente + 512K, ex:
5Mb = 5120k + 512k = 5632k


Concentrador Mikrotik → Firewall → Mangle

/ip firewall mangle
add action=mark-connection chain=forward comment="QoS customers" new-connection-mark=conn out-interfa
passthrough=yes src-address-list=network
add action=mark-packet chain=forward connection-mark=conn new-packet-mark=icmp passthrough=no protoco
add action=mark-packet chain=forward connection-bytes=524288-2097152 connection-mark=conn new-packet-
passthrough=yes
add action=mark-packet chain=forward connection-bytes=2097153-5242880 connection-mark=conn new-packet
passthrough=yes
add action=mark-packet chain=forward connection-bytes=5242881-15728640 connection-mark=conn new-packe
passthrough=yes
add action=mark-packet chain=forward connection-bytes=15728641-52428800 connection-mark=conn new-pack
51200k passthrough=yes
add action=mark-packet chain=forward connection-bytes=52428801-0 connection-mark=conn new-packet-mark
passthrough=yes



Concentrador Mikrotik → PPP → Profile
Abra cada um dos: Profiles → aba Scripts → On Up

:foreach i in=[/queue simple find where name="<pppoe-$user>"] do={
:local qName [/queue simple get $i name];
:local rLimit [/queue simple get $i max-limit];
:local indexExplod [:find $rLimit "/"];
:local lenth [:len $rLimit];
:local rltotal [:pick $rLimit ($indexExplod + 1) ($lenth - 1)];
:local rl [($rltotal - 512)];
:local rlUnity [:pick $rLimit ($lenth - 1) $lenth];
: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 blUnity [:pick $burstl ($lenth - 1) $lenth];
:local burstt [/queue simple get $i burst-time];
:local indexExplod [:find $burstt "/"];
:local lenth [:len $burstt];
:local bt [:pick $burstt ($indexExplod + 1) ($lenth - 1)];
:local indexExplod [:find $bt "m"];
:local lenth [:len $bt];
:local bt0 [:pick $bt 0];
:local bt1 [:pick $bt ($indexExplod + 1) $lenth];
:local burstth [/queue simple get $i burst-threshold];
:local indexExplod [:find $burstth "/"];
:local lenth [:len $burstth];
:local bth [:pick $burstth ($indexExplod + 1) ($lenth - 1)];
:local bthUnity [:pick $burstth ($lenth - 1) $lenth];
:local limite512k [($rltotal * 60 / 100)];
:local limite2048k [($rltotal * 50 / 100)];
:local limite5120k [($rl * 30 / 100)];
:local limite15360k [($rl * 25 / 100)];
:local limite51200k [($rl * 15 / 100)];
:local unlimited [($rl * 10 / 100)];
:local limiteBt [(($bt0 * 60) + $bt1)];
:if ([:len $bl] != 0) do={
:log warning "QoS ADD === $qName";
# :log warning "Com Burst";
# :log warning "Max Limit === $rl $rlUnity";
# :log warning "Burst Limit === $bl $blUnity";
# :log warning "Burst Thr === $bth $bthUnity";
# :log warning "Burst Time=== $lBt";
/queue tree add name="QoS_$qName" parent="$interface" queue="default" max-limit="$($rltotal)$rlUnity" burst-limit="$($bl)$blUnity" burst-time="$limiteBt" burst-threshold="$($bth)$bthUnity" bucket-size=0.20;
/queue tree add name="1-icmp_$qName" parent="QoS_$qName" packet-mark="icmp" queue="default" priority="1" limit-at="$($rltotal)$rlUnity" max-limit="$($rltotal)$rlUnity" burst-limit="$($bl)$blUnity" burst-time="$limiteBt" burst-threshold="$($bth)$bthUnity";
/queue tree add name="2-512k_$qName" parent="QoS_$qName" packet-mark="512k" queue="default" priority="2" limit-at="$($limite512k)$rlUnity" max-limit="$($rl)$rlUnity" burst-limit="$($bl)$blUnity" burst-time="$limiteBt" burst-threshold="$($bth)$bthUnity";
/queue tree add name="3-2048k_$qName" parent="QoS_$qName" packet-mark="2048k" queue="default" priority="3" limit-at="$($limite2048k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="4-5120k_$qName" parent="QoS_$qName" packet-mark="5120k" queue="default" priority="4" limit-at="$($limite5120k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="5-15360k_$qName" parent="QoS_$qName" packet-mark="15360k" queue="default" priority="5" limit-at="$($limite15360k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="6-51200k_$qName" parent="QoS_$qName" packet-mark="51200k" queue="default" priority="6" limit-at="$($limite51200k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="7-unlimited_$qName" parent="QoS_$qName" packet-mark="unlimited" queue="default" priority="7" limit-at="$($unlimited)$rlUnity" max-limit="$($rl)$rlUnity";
} \
else={

:log warning "QoS ADD === $qName";
/queue tree add name="QoS_$qName" parent="$interface" queue="default" max-limit="$($rltotal)$rlUnity" bucket-size=0.20;
/queue tree add name="1-icmp_$qName" parent="QoS_$qName" packet-mark="icmp" queue="default" priority="1" limit-at="$($rltotal)$rlUnity" max-limit="$($rltotal)$rlUnity";
/queue tree add name="2-512k_$qName" parent="QoS_$qName" packet-mark="512k" queue="default" priority="2" limit-at="$($limite512k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="3-2048k_$qName" parent="QoS_$qName" packet-mark="2048k" queue="default" priority="3" limit-at="$($limite2048k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="4-5120k_$qName" parent="QoS_$qName" packet-mark="5120k" queue="default" priority="4" limit-at="$($limite5120k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="5-15360k_$qName" parent="QoS_$qName" packet-mark="15360k" queue="default" priority="5" limit-at="$($limite15360k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="6-51200k_$qName" parent="QoS_$qName" packet-mark="51200k" queue="default" priority="6" limit-at="$($limite51200k)$rlUnity" max-limit="$($rl)$rlUnity";
/queue tree add name="7-unlimited_$qName" parent="QoS_$qName" packet-mark="unlimited" queue="default" priority="7" limit-at="$($unlimited)$rlUnity" max-limit="$($rl)$rlUnity";

}
}


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts