Bom tarde a todos!
Dando continuidade ao assunto "Garantia de Banda" HTB.
Hoje vou compartilhar passo a passo a forma que eu faço aqui para garantir a banda do cliente.
Antes de tudo quero alertar que esse procedimento faz algumas alterações no banco de dados do mk-auth nas tabelas sis_plano, radgroupreply e radreply
(não é uma alteração drástica, mais por questões de segurança melhor fazer um backup antes)
então quem for fazer, aconselho fazer uma backup do mk-auth antes de tudo.
explicando o funcionamento: no mk-auth cada plano terá uma address-list com o mesmo nome do plano,
cada plano pertencerá a um grupo, são 2 grupos empresa e residencia, cada plano terá sua garantia de banda, para isso o script é baseado no nome do plano,
tipo de plano ou velocidade
ex: o plano tipo dedicado fará parte do grupo empresa, se o nome do plano contem empresa, empresarial, corporativo, comercial etc
o script faz uma verificação usando algumas chaves para identificar cada plano e colocá-lo no seu devido grupo, com sua garantia.
A garantia é feita em porcentagem baseada na velocidade de up e down de cada plano, já configurada no arquivo update_planos.php
e pode ser ajustadas nas linhas
$garantia_residencia = 70;
$garantia_empresa = 80;
residencia tem garantia de 70% da velocidade up e down
empresa tem garantia de 80% da velocidade up e down
os planos dedicados tem garantia de 100% por padrão
Assim também as prioridades dos planos podem serem ajustadas nas linhas
$prioridade_empresa = 4;
$prioridade_dedicado = 1;
$prioridade_residencia = 8;
Isso fará o mikrotik identificar qual a velocidade de cada cliente no address-list, o mikrotik não vai trabalhar com filas simples (simple queues) as simple queues dinamicas serão apagadas
o controle será feito na queue tree, o mikrotik usando tool fetch, faz consultas
no mk-auth e importa o script para toda configuração do controle de banda.
Para que tudo funcione corretamente é preciso verificar antes os seguintes pré-requisitos:
- A comunicação SMNP entre mk-auth e mikrotik tem que esta configurada e funcionando.
- Os Clientes tem que estarem com o ramal definido no mk-auth (não funciona com clientes em ramal "todos").
- O mk-auth tem que ter acesso a internet para fazer algumas consultas externas.
1º passo
Vamos prosseguir, configuração básica do SMNP no mikrotik
exemplo ip do mk-auth: 172.31.255.2 (troque pelo o ip do seu mk-auth)
/snmp community
set [ find default=yes ] addresses=172.31.255.2
/snmp
set contact=seuemail@gmail.com enabled=yes location=Brasil trap-target=0.0.0.0
e no mk-auth em controle de servidores as opções:
Megas instalados: (tem que esta preechido com a quantidade de mega disponível para cada ramal)
#ID PLACA: (o id da interface do link no mikrotik)
para descobrir qual é id segue o comando:
/interface print oid
Flags: D - dynamic, X - disabled, R - running, S - slave
0 R ;;; LINK
name=.1.3.6.1.2.1.2.2.1.2.5 actual-mtu=.1.3.6.1.2.1.2.2.1.4.5 mac-address=.1.3.6.1.2.1.2.2.1.6.5 admin-status=.1.3.6.1.2.1.2.2.1.7.5
oper-status=.1.3.6.1.2.1.2.2.1.8.5 bytes-in=.1.3.6.1.2.1.31.1.1.1.6.5 packets-in=.1.3.6.1.2.1.31.1.1.1.7.5 discards-in=.1.3.6.1.2.1.2.2.1.13.5
errors-in=.1.3.6.1.2.1.2.2.1.14.5 bytes-out=.1.3.6.1.2.1.31.1.1.1.10.5 packets-out=.1.3.6.1.2.1.31.1.1.1.11.5 discards-out=.1.3.6.1.2.1.2.2.1.19.5
errors-out=.1.3.6.1.2.1.2.2.1.20.5
o ultimo numero em name=.1.3.6.1.2.1.2.2.1.2.5 nesse exemplo aqui o número 5 é o id da placa
Ainda no mikrotik, vá em ip address comente o ip que esta configurado no mk-auth em controle de servidores (IP do MK)
coloque o comment "LINK" (sem aspas "").
Agora no mk-auth
2º passo: baixe o arquivo qos.zip e descompacte
3º passo: com o winscp abra a pasta qos e copie a pasta local e qos.sh para /tmp
4º passo: com o putty execute os comandos abaixo no terminal do linux
chmod 777 /tmp/qos.sh
/tmp/qos.sh
o script qos.sh vai fazer todo o trabalho colocando cada arquivo em seu diretório e dando inicio a configuração dos planos.
Vamos para o próximo passo com os scripts mikrotik
5º passo: abra o arquivo mikrotik.txt
6º passo: edite em cada linha do script a KEY onde tive key_api (verifique sua KEY API no menu provedor / dados da empresa)
\n#===============================\r\
\n:global KEY \"key_api\"; \r\
\n#===============================\r\
7º passo: copie e cole no terminal mikrotik e depois execute no terminal do mikrotik o comando
/system script run ler_start_qos
verifique os logs no mikrotik se dá algum erro.
veja no mikrotik em /ip firewall mangle
se foi adicionado as regras de cada plano, e tambem verifique a arvore em /queue tree.
essa é a estrutura qos pode usar a mesma estrutura para fazer um qos de outros serviços agora de acordo com cada plano.
Para ver o real funcionamento é preciso derrubar todas as conexões de clientes no mikrotik,
ou apenas um reboot para o mikrotik pegar a nova address-list de cada cliente, então deixe para fazer esse procedimento no horário mais conveniente.
Testem e postem os resultados, espero que ajude a muitos que procuram algo do tipo.
Não esta 100% porque não é nativo do sistema mk-auth, é apenas uma adaptação com alguns ajustes para diminuir o trabalho manual no mikrotik.
tentei deixar o mais simples possível para implantação.
versão
mikrotik: 6.35
mk-auth: 4.99 64bits
Um Abraço a Todos!
Respostas
Boa tarde amigos, rodando QoS do amigo Jonas à uns 45 dias, até agora 100% com relação ao trafego, porém como não temos regras no simple queues não gera gráfico dos clientes no MK-AUTH, se alguém ai tiver uma solução, se o amigo Jonas tiver alguma ideia....
Boa noite
O teste só durou até agora a noite, os cliente tudo ligando aqui reclamando que a net ta lenta, tirei voltou ao normal.
não sei se é porq uso vdsl pode ser que com dedicado fique bom, irei esperar butar aqui o dedicado e refaço os testes
Ibrahim Raphael disse:
olá amigo,
boa tarde!
Funciona com o radius normalmente ou tem alguma adaptação?
Grato.
Pitet disse:
A iniciativa do amigo foi muito boa, nao é desvalorizando nao longe de mim.
Mas... o do video coloquei em pratica aqui, achei muito boa mesmo, e poucas regras e funcional, a do amigo ai tem muito regra que fica na queue tree muita coisa mesmo sem conta que usa o mk-auth e não vou mentir meu mk-auth é sagrado! nao mexo assim nao.
A do video pouca coisa e ja faz efeito.
To usando e 100% aprovado aqui.
Pedro Filho disse:
o vídeo é muito bom mesmo...
Pitet disse:
Esse que vc citou nao é bom nao/? olhando o video achei muito bom e mais pratico.
douglas merquides contardi disse:
nada haver id da porta com a porta propriamente dita,
nas minhas rbs deram desde a 1 ate a 3, em sua maioria a 2, procure a id da interface do link
Ibrahim Raphael disse:
Bom dia amigos!!!
Observando o script list notei algumas coisas que não sei se estão prejudicando o tools fetch:
;(eval / (eval /globalname=$addConfLine) (eval /globalname=$addDescLine) (<%% $addDescLine (> $addDescLine);#| DNS: enabled;) (<%% $addConfLine (> $addConfLine); /ip dns {) (<%% $addConfLine (> $addConfLine); set allow-remote-requests=yes) (<%% $addConfLine (> $addConfLine); static add name=router address=192.168.88.1) (<%% $addConfLine (> $addConfLine); }) (<%% $addConfLine (> $addConfLine);))
;(eval / (eval /globalname=$addConfLine) (eval /globalname=$addDescLine) (eval /globalname=$dhcpEnabled) (<%% $addDescLine (> $addDescLine);#| LAN Configuration:) (eval /ifcondition=(!= $switchPorts );do=;(eval / (eval /localname=$tmpSwitchPorts;value=) (<%% $addConfLine (> $addConfLine); /interface ethernet {) (eval /ifcondition=(> $switchPortGroups 1);do=;(eval / (eval /foreachcounter=$i;do=;(eval / (eval /setname=$tmpSwitchPorts;value=( . (eval (eval /pickbegin=0;counter=$i)) (master))) (eval /localname=$tmpMasterName;value=( . (eval (eval /pickbegin=0;counter=$i)) -master)) (<%% $addConfLine (> $addConfLine);( . set (eval (eval /pickbegin=0;counter=$i)) name= $tmpMasterName ;)) (eval /forcounter=$j;do=;(eval / (eval /setname=$tmpSwitchPorts;value=( . $tmpSwitchPorts , (eval (eval /pickbegin=$j;counter=$i)))));from=1;to=(- (eval (eval /lenvalue=$i)) 1)) (<%% $addDescLine (> $addDescLine);( . #| switch group: $tmpSwitchPorts)) (eval /forcounter=$j;do=;(eval / (<%% $addConfLine (> $addConfLine);( . set (eval (eval /pickbegin=$j;counter=$i)) master-port= $tmpMasterName ;)));from=1;to=(- (eval (eval /lenvalue=$i)) 1)));in=$switchPorts));else=;(eval / (eval /setname=$tmpSwitchPorts;value=( . (eval (eval /pickbegin=0;counter=$switchPorts)) (master))) (eval /localname=$tmpMasterName;value=( . (eval (eval /pickbegin=0;counter=$switchPorts)) -master)) (<%% $addConfLine (> $addConfLine);( . set (eval (eval /pickbegin=0;counter=$switchPorts)) name= $tmpMasterName ;)) (eval /forcounter=$i;do=;(eval / (eval /setname=$tmpSwitchPorts;value=( . $tmpSwitchPorts , (eval (eval /pickbegin=$i;counter=$switchPorts)))));from=1;to=(- (eval (eval /lenvalue=$switchPorts)) 1)) (<%% $addDescLine (> $addDescLine);( . #| switch group: $tmpSwitchPorts)) (eval /forcounter=$i;do=;(eval / (<%% $addConfLine (> $addConfLine);( . set (eval (eval /pickbegin=$i;counter=$switchPorts)) master-port= $tmpMasterName ;)));from=1;to=(- (eval (eval /lenvalue=$switchPorts)) 1)))) (<%% $addConfLine (> $addConfLine);( . } $NL)))) (eval /ifcondition=(= $lanPort bridge);do=;(eval / (<%% $addConfLine (> $addConfLine); /interface bridge) (<%% $addConfLine (> $addConfLine);( . add name= $lanPort disabled=no auto-mac=yes protocol-mode=rstp comment=defconf;)) (<%% $addConfLine (> $addConfLine); :local bMACIsSet 0;) (eval /ifcondition=(!= $wanPorts );do=;(eval / (eval /localname=$tmpWanPorts;value=) (eval /foreachcounter=$i;do=;(eval / (eval /setname=$tmpWanPorts;value=( . $tmpWanPorts || name~ " $i ")));in=$wanPorts) (<%% $addConfLine (> $addConfLine);( . :foreach k in=[/interface find where !(slave=yes $tmpWanPorts || name~ " $lanPort " )] do={)));else=;(eval / (<%% $addConfLine (> $addConfLine); :foreach k in=[/interface find where !(slave=yes)] do={))) (<%% $addConfLine (> $addConfLine);( . :log info " k: $ k ")) (<%% $addConfLine (> $addConfLine);( . :local tmpPortName [/interface get $ k name];)) (<%% $addConfLine (> $addConfLine);( . :log info " port: $ tmpPortName ")) (<%% $addConfLine (> $addConfLine);( . :if ( $ bMACIsSet = 0) do={)) (<%% $addConfLine (> $addConfLine);( . :if ([/interface get $ k type] = " ether " ) do={)) (<%% $addConfLine (> $addConfLine);( . /interface bridge set " $lanPort " auto-mac=no admin-mac=[/interface ethernet get $ tmpPortName mac-address];)) (<%% $addConfLine (> $addConfLine); :set bMACIsSet 1;) (<%% $addConfLine (> $addConfLine); }) (<%% $addConfLine (> $addConfLine); }) (<%% $addConfLine (> $addConfLine); /interface bridge port) (<%% $addConfLine (> $addConfLine);( . add bridge= $lanPort interface= $ tmpPortName comment=defconf;)) (<%% $addConfLine (> $addConfLine); }))) (<%% $addConfLine (> $addConfLine);( . /ip address add address=192.168.88.1/24 interface= $lanPort comment= " defconf " ;)) (eval /ifcondition=(&& (= $dhcpServer 1) (= $dhcpEnabled 1));do=;(eval / (<%% $addDescLine (> $addDescLine);#| DHCP Server: enabled;) (<%% $addConfLine (> $addConfLine);( . /ip pool add name= " default-dhcp " ranges=192.168.88.10-192.168.88.254;)) (<%% $addConfLine (> $addConfLine); /ip dhcp-server) (<%% $addConfLine (> $addConfLine);( . add name=defconf address-pool= " default-dhcp " interface= $lanPort lease-time=10m disabled=no;)) (<%% $addConfLine (> $addConfLine); /ip dhcp-server network) (<%% $addConfLine (> $addConfLine);( . add address=192.168.88.0/24 gateway=192.168.88.1 comment= " defconf " ;)))))
;(eval / (eval /globalname=$addConfLine) (eval /globalname=$addDescLine) (eval /globalname=$dhcpEnabled) (eval /ifcondition=(!= $wanPorts );do=;(eval / (eval /localname=$tmpWanPorts;value=) (<%% $addDescLine (> $addDescLine);#| WAN (gateway) Configuration:) (eval /foreachcounter=$i;do=;(eval / (eval /setname=$tmpWanPorts;value=( . $tmpWanPorts $i )));in=$wanPorts) (eval /ifcondition=(= $isLte 1);do=;(eval / (<%% $addConfLine (> $addConfLine); /interface lte set add-default-route=yes;));else=;(eval / (eval /ifcondition=(= $dhcpEnabled 1);do=;(eval / (eval /foreachcounter=$i;do=;(eval / (<%% $addConfLine (> $addConfLine);( . /ip dhcp-client add interface= $i disabled=no comment= " defconf " ;)));in=$wanPorts))))) (<%% $addDescLine (> $addDescLine);( . #| gateway: $tmpWanPorts ;)) (<%% $addDescLine (> $addDescLine);#| firewall: enabled;) (<%% $addDescLine (> $addDescLine);#| NAT: enabled;) (eval /ifcondition=(&& (= $isLte 0) (= $dhcpEnabled 1));do=;(eval / (<%% $addDescLine (> $addDescLine);#| DHCP Client: enabled;))) (eval /foreachcounter=$i;do=;(eval / (<%% $addConfLine (> $addConfLine);( . /ip firewall nat add chain=srcnat out-interface= $i action=masquerade comment= " defconf: masquerade ")));in=$wanPorts) (<%% $addConfLine (> $addConfLine); /ip firewall {) (<%% $addConfLine (> $addConfLine);( . filter add chain=input action=accept protocol=icmp comment= " defconf: accept ICMP ")) (<%% $addConfLine (> $addConfLine);( . filter add chain=input action=accept connection-state=established,related comment= " defconf: accept establieshed,related ")) (eval /foreachcounter=$i;do=;(eval / (<%% $addConfLine (> $addConfLine);( . filter add chain=input action=drop in-interface= $i comment= " defconf: drop all from WAN ")));in=$wanPorts) (<%% $addConfLine (> $addConfLine);( . filter add chain=forward action=fasttrack-connection connection-state=established,related comment= " defconf: fasttrack ")) (<%% $addConfLine (> $addConfLine);( . filter add chain=forward action=accept connection-state=established,related comment= " defconf: accept established,related ")) (<%% $addConfLine (> $addConfLine);( . filter add chain=forward action=drop connection-state=invalid comment= " defconf: drop invalid ")) (eval /foreachcounter=$i;do=;(eval / (<%% $addConfLine (> $addConfLine);( . filter add chain=forward action=drop connection-state=new connection-nat-state=!dstnat in-interface= $i comment= " defconf: drop all from WAN not DSTNATed ")));in=$wanPorts) (<%% $addConfLine (> $addConfLine); }) (eval /foreachcounter=$i;do=;(eval / (<%% $addConfLine (> $addConfLine);( . /ip neighbor discovery set [find name= " $i " ] discover=no)));in=$wanPorts) (<%% $addConfLine (> $addConfLine); /tool mac-server disable [find];) (<%% $addConfLine (> $addConfLine); /tool mac-server mac-winbox disable [find];) (eval /ifcondition=(!= $wanPorts );do=;(eval / (eval /localname=$tmpWanPorts;value=) (eval /foreachcounter=$i;do=;(eval / (eval /setname=$tmpWanPorts;value=( . $tmpWanPorts || name~ " $i ")));in=$wanPorts) (<%% $addConfLine (> $addConfLine);( . :foreach k in=[/interface find where !(slave=yes $tmpWanPorts )] do={)));else=;(eval / (<%% $addConfLine (> $addConfLine); :foreach k in=[/interface find where !(slave=yes)] do={))) (<%% $addConfLine (> $addConfLine);( . :local tmpName [/interface get $ k name];)) (<%% $addConfLine (> $addConfLine);( . /tool mac-server add interface= $ tmpName disabled=no;)) (<%% $addConfLine (> $addConfLine);( . /tool mac-server mac-winbox add interface= $ tmpName disabled=no;)) (<%% $addConfLine (> $addConfLine); }))))
Sendo que nunca utilizei o ip padrão do mikrotik e porque está aparecendo?
Obrigado a todos!
olá ... boa noite a todos!
Percebi que ele gera um arquivo em files que fica em 0B, porém derrubei alguns clientes e quando observei no adress list havia o IP e a velocidade do cliente. No entanto, nada aconteceu no mangle e na queue tree.
OBS.: Comando manual no script
Alguém pode me orientar?
Agradeço a todos,
Fiquem com Deus!
Achei interessante e muito útil, para quem sabe realmente é uma mão na roda. para quem não sabe fica somente o sabor da vontade.
Meu tool fetch não funciona e mikrotik mesmo manualmente não faz a mágica. :(