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: 2.289 ]

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

Entendendo redes wireless

Servidor Fedora 11 de maneira fácil e funcional

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

Instalando o Fedora 10

Leitura recomendada

VLAN Tagging nos sistemas GNU/Linux derivados do Red Hat

Zabbix Server 2.0 no Ubuntu Server 12.04 - Instalação e configuração

Nagios Core 4.0.8 com Debian 7 e Client Windows Server

Configuração de serviço do Nagios para monitorar o APT do Ubuntu

Tutorial de instalação e configuração do CACIC 3.1.15

  
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.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor HostGator.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Viva o Android

Tópicos

Top 10 do mês

Scripts