Este artigo visa visa informar sobre os aspectos e implementação de qualidade de serviço para roteadores Linux através da classificação e policiamento de diferentes tipos de tráfego Internet. Trata-se de uma forma de otimizar o uso de banda disponível para acesso externo.
O meu ambiente de testes é formado por um gateway Mandrake Linux 10.1.
Iremos neste momento dar início ao script. Comentários e observações serão presentes antes e depois dos comandos.
tc qdisc add dev ppp0 root handle 1: htb default 30
tc class add dev ppp0 parent 1: classid 1:1 htb rate 128kbit ceil 128kbit
tc class add dev ppp0 parent 1:1 classid 1:10 htb rate 28kbit ceil 128kbit prio 1
tc class add dev ppp0 parent 1:1 classid 1:20 htb rate 50kbit ceil 128kbit prio 2
tc class add dev ppp0 parent 1:1 classid 1:30 htb rate 50kbit ceil 110kbit prio 3
As linhas acima dizem que para a interface ppp0, teremos uma hierarquia de 3 classes de serviço pertencentes a uma dada raiz:
Determinamos que a classe default, ou seja, os pacotes que não forem classificados, obrigatoriamente utilizarão a classe 3 (default 30). Os valores de rate devem ser ajustados a gosto, sendo que o somatório dos rates deve ser igual ao valor total da banda disponível. Os valores de ceil, representam a taxa máxima que cada classe pode alcançar. Os valores de prioridade (prio) devem ser informados para cada classe. Quanto menor este valor, mais prioritária será a classe.
Estas linhas representam apenas uma otimização do algoritmo, fazendo-se uso do SFQ, uma maneira de melhorar a disputa de banda dentro de uma mesma fila. É muito importante utilizarmos estes comandos!
tc filter add dev ppp0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev ppp0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:20
tc filter add dev ppp0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:30
Neste momento estamos dizendo como fazer uma correlação entre os valores de prioridades com os valores que utilizaremos posteriormente, utilizando IPTABLES, para marcação dos pacotes.
Ou seja, para prio 1, deveremos utilizar MARK 0x1 no IPTABLES (será visto mais tarde...) e assim por diante.
O valor de MARK é o número entre hangle e fw. (Ex: hangle x fw ).
De forma análoga, devemos criar as filas para a interface da rede interna.
tc qdisc add dev eth1 root handle 1: htb default 30
tc class add dev eth1 parent 1: classid 1:1 htb rate 10000kbit ceil 10000kbit
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 4700kbit ceil 10000kbit prio 1
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 5000kbit ceil 10000kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:30 htb rate 128kbit ceil 200kbit prio 3
tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:20
tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:30
Pode-se claramente observar que a taxa padrão (rate) e a taxa máxima (ceil)
da classe 3 está entre 128 e 200Kbps. Tal valor é justamente pelo fato de que estamos policiando tráfego de grande demanda, como por exemplo, transferência de arquivos vindo da internet , passando pela interface ppp0 e posteriormente pela eth1.
Estamos justamente adequando aqui o tráfego entrante vindo da internet para a rede interna a uma taxa máxima de 200kbit.
Se não fizermos isto e colocarmos esta classe baseada na conexão máxima do barramento interno, ou seja, 10Mbps, estaremos tornando o policiamento entrante não funcional. Estaríamos demandando uma quantidade de tráfego extremamente superior à capacidade de download do acesso ADSL (256Kbps) e com isso não sobraria banda alguma para as classes prioritárias.
Concluindo a etapa da criação das filas, devemos partir para a classificação dos tráfegos.
[2] Comentário enviado por fabianotecnico em 28/07/2006 - 11:03h
cara
se eu te contar tu não acredita..to sofrendo pra fazer o htb funcionar...já estou bem no processo...mas faltam alguns detalhes..por exemplo
eu tenho
eth0 - rede interna
e a
eth1 - speedy ip fixo.
só que quando levanto o htb com a configuração de 128 kbits a rede fica lenta e o SSH fica lento todas as portas ficam lentas..só que coloquei para funcionar a regra só na porta 80, o MSN caiu e as outras portas ficaram lentas.
vc já colocou o HTB pra funcionar?
essas regras TC o que faço com elas
coloco em algum arquivo...como que funciona..faltou só explicar isso.
[4] Comentário enviado por thelinux em 28/07/2006 - 14:18h
Cara, não posso deixar de dá parabéns não só pelo excelente artigo, mas pelo assunto abordado. Existe muito pouca documentação em português do mesmo.
Sucesso.
[5] Comentário enviado por gustavo.carvalho em 29/07/2006 - 23:44h
Pessoal. Primeiramente agradeço os comentários!
Fabiano, conforme vc havia perguntado, eu já tenho um ambiente funcionando perfeitamente com o o HTB. Mas para que eu possa te ajudar melhor vc vai precisar me passar melhores detalhes do seu problema.
Com relação às regras TC, elas servem para criar filas com diferentes bandas disponíveis. Ex: vc pode criar uma fila para o seu tráfego prioritário (ssh, telnet, snmp), uma segunda para msn, yahoo messenger, icq e uma terceira para o resto (Best Effort). Isto é apenas um exemplo, pois o HTB é capaz de trabalhar de forma hierárquica como seu próprio nome já diz. Ou seja, posso montar uma árvore composta de diferentes filas...
[8] Comentário enviado por guesser em 05/10/2006 - 21:33h
Cara realmente isto é show de bola,
Só me tira umas dúvidas, estou tentando fazer isto na minha rede para priorizar o tráfego de voz e vídeo e não esta dando muito certo quais são as regras que devo utilizar?
[10] Comentário enviado por gustavo.carvalho em 20/10/2006 - 13:24h
Olá pessoal! Primeiramente agradeçco os comentários! Valeu mesmo!
Agora, respondendo ao guesser...
Para que você possa priorizar tráfegos de voz e vídeo basta que você saiba quais portas UDP os mesmos trabalham OU você pode também utilizar o iptables para classificar os tráfegos pelos IPs de origem das estações que envolvidas. Se você tem um servidor de vídeo por exemplo, poderá utilizar a classificação puramente por IP.
Abs
tc qdisc add dev eth0 root handle 1: htb default 12
tc class add dev eth0 parent 1: classid 1:1 htb rate 100000kbit ceil 100000kbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 80000kbit ceil 100000kbps
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 10.0.0.0 match ip dport 80 0xffff flowid 1:10
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 10.0.0.0 match ip dport 22 0xffff flowid 1:10
Assim todo mundo da rede 10.0.0.0 vai compartilhar de 80mb a 100mb quando forem acessar a porta 80 e 22
[13] Comentário enviado por lduarte10 em 31/10/2006 - 14:50h
Alguem tem alguma dica para controle de upload para programas como kazaa, e-mule, bittorrent ??? quero limitar o upload destes programas na rede, pois quando o upload esta alto a NAVEGAÇÃO web fica muito lenta. o upload alto nao influencia na taxa de download (ou influencia pouco), as é notavel quando vai navegar em painas web, jah fiz o teste, a tulização da banda (download) nao esta nem 10% mas o upload estava em 95%-100% e a navegação ficou super lenta, mas quando coloquei para fazer download a taxa estava alta. é meio estranho, ate se alguem tiver uma explicação logica pra isso poderia postar né?
[14] Comentário enviado por ecbr em 06/11/2006 - 07:30h
se nao me engando o htb so controla o trafego de saida, entao eu me pergunto, como as suas regras pode ta funcinando sendo que na maioria vc usou o PREROUTING que trabalha no trafego de entrada, se nao me engano o certo seria o POSTROUTING ou OUTPUT ou ate mesmo FORWARD.
[15] Comentário enviado por gustavo.carvalho em 07/11/2006 - 12:56h
ola amigo. Primeiramente agradeço o comentário. No entanto, o material apresentado é realmente funcional. O htb realmente apenas trabalha com tráfego de saída, ou seja, para que se possa influenciar o tráfego de entrada de uma interface de uplink (internet) é necessário OBRIGATORIAMENTE trabalhar com a saída do tráfego na interface de downlink (rede interna) e vice-versa. Aí está a mágica ...
Abs
[16] Comentário enviado por fernandosilva em 22/11/2006 - 07:56h
Eu trabalho com servidores linux e acho muito bom, pois ñ tenho um software que me de maior segurança como o linux... E ainda mais com o controle pelo nagios, fica td mais fácil...
[17] Comentário enviado por mredd em 04/12/2006 - 08:45h
Olá.
Achei excelente este artigo... mas estou apanhando para fazer QoS entre várias interfaces de rede. Eu tenho um gateway com 4 interfaces de rede, onde a eth0 está um velox de 1Mbps e as outras 3 interfaces estao conectadas a 3 redes distintas. Nao consigo fazer QoS para as 3 redes.
[18] Comentário enviado por hilmilho em 06/01/2007 - 20:33h
Alguém realizou os mesmos testes em máquinas diferentes? Tipo um fazer download, outra fazer ping? Aqui não tá fazendo efeito em máquinas diferentes...
Será que é o HUB? Tipo o download "engarrafa" o hub, fazendo as outras máquinas mais lentas... Alguma solução pra isso?
[19] Comentário enviado por gustavo.carvalho em 07/01/2007 - 13:29h
Deve existir algum ponto que não está legal nas suas configurações.
Mesmo considerando-se que HUBs realmente prejudicam o desempenho de redes internas pela quantidade de broadcasts, as configurações de QoS descritas no artigo resolvem em parte este problema. Na realidade o que você deve estar deixando ocorrer é a utilização de 100% da banda para downloads... Você deve ajustar a taxa de utilizacao CEIL para classe Best Effort em um valor um pouco abaixo do total disponível. Isso deve ajudar...
[21] Comentário enviado por cytron em 08/01/2007 - 10:35h
Estive pensando em implantar essa técnica em um provedor, mas fica meio complicado, pois eu precisaria saber o real tráfego de um tal serviço para poder especificar a largura nas regras, mas os clientes nunca vão usar o serviço ao mesmo tempo para eu poder chegar a um valor real, e o pior ainda, a medida que novos clientes vão chegando é preciso refazer os valores novamente.
Existe uma outra maneira que poderia resolver essa questão?
O ideal seria por porcentagem, mas aí já é querer demais. hehe.
Atualmente estou usando apenas priorização de protocolos através do iptables.
[22] Comentário enviado por hilmilho em 08/01/2007 - 16:19h
Valeu Gustavo, realmente tá funcionando mesmo pelo hub... Foi algum erro nas velocidades... Eu fiz um teste e minha conexão que é de 128 dá uns 102 kbit... então eu mudei ligeiramente as taxas ceil pra 100 e a ceil :30 pra 80... No meu caso nem me preocupo com largura de banda pq não tenho muita mesmo, mas o que quero é latência boa e com esse exemplo funcionando devo me aventurar mais nessa área...
Agora mesmo vou tentar acrescentar outra interface da rede interna ao script... flw!
[24] Comentário enviado por cbpower2000 em 28/02/2007 - 22:44h
ola amigo, busco um profissional capaz de resolver um problemao de p2p aqui na rede da empresa, percebi que voce pode nos ajudar, se puder por favor entre em contato em willians@rededisquenet.com que lhe passo maiores detalhes, obrigado!
[28] Comentário enviado por guttoballa em 20/05/2007 - 14:00h
Gostei do seu artigo... Parabéns, já usei o HTB configurando mais ou menos igual ao seu. Depois fui usar o HTB Tools, achei fácil usar ele, pq ele ta liberando o q vem da cache do squid a full... para meus clientes, desta forma é interessante ter cache. Vc sabe como incluir a cache a full neste script seu?
[29] Comentário enviado por els2net em 29/05/2007 - 14:42h
Gustavo, primeiramente parabéns, a matéria é excelente e extremamente necessária para todos do ramo.
Féra, não sei onde errei, mas após, implantar o QoS, seguindo seu exemplo, meu upload não esta passando de 128K mesmo para os serviço que estão com prio 1, que nesse caso deveria atingir 512K.
Outro detalhe, como eu faço para tirar o QoS da memória para que eu possa ir isolando as regras?
Agradeço qualquer ajuda bem como seus comentários.
Edson
[31] Comentário enviado por tuxSoares em 03/08/2007 - 00:20h
Essa questão da marcação de pacotes é bem sinistra, irei me aperfeiçoar mais no assunto, mas seu artigo ja deu uma boa ideia de como funciona.
voce esta de parabens, continue contribuindo com a comunidade
[36] Comentário enviado por fnpaulinos em 15/10/2007 - 12:32h
Olá Gustavo. Muito bom seu artigo.
Tenho um Debian como roteador da minha rede interna e já reparei que quando utilizo Emule, Torrent e afins em uma outra máquina (XP), ou seja, quando o número de conexões tcp é maior, a navegação fica lenta, quase impossível. Será que consigo um melhor desempenho aplicando as regras de QoS aqui descritas? Não tenho esses problemas quando utilizo um Router Linksys com firmware alterado, mas também não consegui saber o que o permite trabalhar sem problemas.
Atenciosamente,
Fábio Nunes.
[37] Comentário enviado por gtcesar em 07/02/2008 - 13:51h
sistema
completo de Ordem de Serviço,
Peço apenas que me deixe os creditos na pagina do menu, e use avontade.
Instalação
execute o data.sql que esta destro do diretorio sql
depois altere a conexão data.php que esta dentro do diretorio connections
depois é só usar o sistema a vontade, só peço que deixem os creditos
na pagina menu.php,
já que estou disponibilizando este sistema de graça e gostaria de ser
lembrado por isso,
qualquer alteração que de melhorias ao sistema, postem novamente aqui
no site e coloquem,
no campo versão do menu.php, a devida numeração e acrescente junto ao
meu nome o credito referente a pessoa que adcionou,
se quem usar o sistema for honesto nestes quesitos, eu prometo colocar
o sistema de estoque todo em ajax que estou desenvlvendo.
mande a solicitação ao costamarques@gmail.com que eu mando o sistema, se quiser pode pegar em plugmasters.com.br,codigolivre.com.br
[40] Comentário enviado por paulopmt1 em 07/03/2008 - 17:45h
Excelente artigo! show de bola cara. era bem isso que eu estava precisando. Bom segui suas regras e criei um arquivo chamado script.sh e as coloquei dentro. quando rodo o arquivo tenho o retorno:
debian:/home/paulo/qos# ./script.sh
What is "rete"?
Usage: ... qdisc add ... htb [default N] [r2q N]
default minor id of class to which unclassified packets are sent {0}
r2q DRR quantums are computed as rate in Bps/r2q {10}
debug string of 16 numbers each 0-3 {0}
... class add ... htb rate R1 [burst B1] [mpu B] [overhead O]
[prio P] [slot S] [pslot PS]
[ceil R2] [cburst B2] [mtu MTU] [quantum Q]
rate rate allocated to this class (class can still borrow)
burst max bytes burst which can be accumulated during idle period {computed}
mpu minimum packet size used in rate computations
overhead per-packet size overhead used in rate computations
ceil definite upper class rate (no borrows) {rate}
cburst burst but for ceil {computed}
mtu max packet size we create rate map for {1600}
prio priority of leaf; lower are served first {0}
quantum how much bytes to serve from leaf at once {use r2q}
TC HTB version 3.3
RTNETLINK answers: Invalid argument
o que será que está errado? uso debian sarge e tenho o iproute instalado. Agradeço qualquer ajuda...
Abraço galera do VOL
[41] Comentário enviado por llordvic em 03/06/2009 - 21:45h
Boa noite turma
cara, grande tutorial, parabéns, consegui entender os parametros do tc, mas gostraria de saber se é possivel
ajustar taxas para ips individualmente, tipo, o modelo a baixo q encontrei noutro tuto
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000000kbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit # ceil 512kbit
[42] Comentário enviado por gustavo.carvalho em 13/06/2009 - 15:25h
Amigo, você pode seguir a mesma linha de raciocínio utilizada para construção do script postado aqui, criando as classes, definindo suas bandas e transbordos, e no iptables classificar o tráfego baseando-se apenas nas subredes IP e não por portas TCP ou UDP. Desta forma você poderia utilizar o mesmo esqueleto já descrito aqui com pequenas modificações...
[43] Comentário enviado por refinski em 24/03/2014 - 07:09h
Bom dia Gustavo, tudo bem?
Estou fazendo o TCC da faculdade e preciso criar uma topologia de uma rede voip entre uma matriz e uma filial, so que nao tenho ideia como fazer, acredito que eu tenha que usar dois roteadores, um servidor voip(asterisk) na matriz, vou usar dois micros para comunicação voip, e minha duvida e se tenho que criar dois servidores um de cada lado para usar iptables com HTB para tratar o QoS, queria saber onde ficaria nesta topologia os servidores, usaria como gateway? visto que meu tcc sera uma comparacao de QoS entre CISCO e LINUX, se puder me dar uma luz te agradeco, grande abraco.
[44] Comentário enviado por Aleciano em 25/04/2016 - 01:09h
Ótimo artigo! Funcionou perfeito!!
Um detalhe é que hoje em dia (2016), com conexõe de internet que atingem facilmente de 1--5 Mbps, algumas das regras ficam difíceis de serem testadas pois a conexão já comporta suficientemente tudo que você for fazer. Por exemplo, sem Qos Algum, testando ping + download, não há taaaanta diferença pra o QoS ativo para pacotes ICMP e tcp porta 80. Se vocÊ excluir a regra do ICMP, até que nota um certo jitter, mas não é lá estas coisas.
Então é importante ter isso em mente para entender o funcionamento durante os testes das regras.
o/