Este artigo tem como objetivo demonstrar o uso do HTB (Hierarquical Token Bucket), um recurso do kernel do Linux que permite o controle de banda de maneira simples e inteligente.
A configuração do controle de tráfego é feita toda através do comando tc, que tem a forma geral mostrada abaixo:
tc [opções] OBJETOS PARÂMETROS
Os OBJETOS do tc, como já foram conceituados acima, são: qdisc, class, filters.
Exemplos de comandos:
# tc qdisc
Utilizamos o objeto qdisc para adicionar, remover ou listar qdiscs.
Adicionando e removendo qdiscs
Para adicionar um qdisc precisamos indicar a interface, qual é o "handle" ou "identificador" do qdisc, quem é o "pai" do qdisc e por final o tipo de qdisc e suas opções. Se estivermos adicionando um "qdisc root", seu pai será o root, já para uma classe X:Y, devemos usar o "parent X:Y".
Adicionando um qdisc classfull e definindo a classe padrão:
Para remover qdiscs basta substituir a opção "add" por "del".
Listar qdiscs
Para listar qdiscs basta utilizar a opção "show" seguida claro da interface de rede, por exemplo:
# tc qdisc show dev eth0
tc class
As "class" funcionam como uma subdivisão de classes dentro do qdisc classfull, permitindo desta forma a separação do tráfego entre outras calss/qdiscs.
Adicionando e removendo classes
Para adicionar uma classe necessitamos informar a interface de rede, o qdisc/classe pai dessa classe, seu identificador, o tipo da classe e suas opções.
Adicionando uma classe a um qdisc root:
# tc class add dev eth0 root classid 1:0 htb rate 1Mbit
Adicionando uma classe como filha de outra classe:
# tc class add dev eth0 parent 1:0 class id 1:1 htb rate 100kbit
Para remover classes basta substituir a opção "add" por "del".
Listando classes
Para listar classes basta utilizar a opção "show". Temos ainda como parâmetro a opção -s, que mostra a quantidade de bytes enviados e pacotes e a opção -d, que mostra a descrição da classe, com seu tipo e opções adicionadas, como exemplo abaixo.
# tc -s -d class dev eth0 root
tc filter
Os filtros tem que ser anexados às classes, para que dessa forma elas possam efetuar a separação do tráfego.
Adicionando e removendo filtros
Para adicionarmos um filtro é necessário informar a interface de rede, a classe em que vamos inserir o filtro, o protocolo, o classificador que deseja utilizar (no nosso caso somente u32) e suas opções, conforme exemplo abaixo:
Inseri um filtro na classe "raiz" para pacotes que tenham como destino a rede 10.13.0.0/16 e os pacotes que se identificarem com esta regra devem ir para classe "1:40".
# tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dst 10.13.0.0/16 flowid 1:40
Inseri um filtro na classe "1:10" para pacotes que tenham como origem a rede 10.10.7.0/24, porta de origem 80 e os pacotes que se identificarem com esta regra devem ir para a classe "1:130".
# tc filter add dev eth0 parent 1:10 protocol ip prio 2 u32 match ip src 10.10.7.0/24 match ip sport 80 0xffff flowid 1:130
Os filtros aceitam ainda o parâmetro "prio N", onde se define a prioridade que terão os pacotes. Este parâmetro varia de 0 a 15, sendo que quanto maior o valor de "prio N" menor sua prioridade.
Inseri um filtro na classe "1:20" com prioridade 1 para tudo que tiver como origem a rede 10.1.1.0/24 e destino a rede 10.10.2.0/24 e porta de origem 80 deve ser encaminhado para classe "1:60".
# tc filter add dev eth0 parent 1:20 protocol ip prio 1 u32 match ip src 10.1.1.0/24 match ip dst 10.10.2.0/24 match ip sport 80 0xffff flowid 1:60
Para remover filtros basta substituir a opção "add" por "del".
Listar filtros
Para listar filtros basta utilizar a opção "show" seguida claro da interface de rede, por exemplo:
[3] Comentário enviado por nixius em 29/08/2006 - 17:59h
Excelente artigo...
Agora... como eu faria se quisesse fazer controle de banda por usuário (endereço de ip)?
É possível? Ou é melhor usar cbq? Hoje eu utilizo bandlimit pra controle de banda por usuario... Alguem poderia me dar uma dica?
Obrigado!!!
[5] Comentário enviado por ecbr em 12/09/2006 - 14:18h
vc so se esqueceu de mencionar uma coisa importante, o HTB so trabalha no trafego de saida, entao se quise contralar os dois trafego numa mesma maquina, vai ter que configurar um htb para cada interface que tiver na maquina. mas o artigo esta excelente...
[11] Comentário enviado por humanitas em 03/10/2007 - 08:33h
Pessoal li varias matérias do htb em varios sites e fiz alguns testes e consegui fazer ele funcionar mais o ambiente que fiz possuia apenas 1 placa de rede e foi feito com duas maquinas so!! agora que resolvi passar pra rede do meu servico nao obtive sucesso pois o ambiente e controlado por uma CPU com duas placas de rede sendo que uma delas esta fora da nossa rede. Tentarei mostar:
servidor linux com squid possui duas placas a eth1 de entrada de dados da net possui um endereco 192.168.0.3 eth0 que manda os dados pra nossa rede 192.168.1.8 e o modem roteado possui 192.168.0.1.
as regras de classes eu sei que estao corretas agora estou em duvida quanto tc filter que esta da seguinte forma
U32= "tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32"
U32= $U32" match ip src 192.168.1.8 match ip dst 192.168.1.0/24"
estou com duvida ai nao sei como seria para fazer as regras valerem para filtrar tudo que vier da eth1 para nossa rede.
obs: a rede que esta fora so pode possui 6 host pois a mascara dela e 255.255.255.248.
[12] Comentário enviado por demattos em 28/10/2007 - 11:39h
legal o artigo, era o que estava procurando, sobre o cbq ja conhecia, mas queria algo com as caracteristica do HTB. entao encotrei algo bem explicado no seu artigo.
[15] Comentário enviado por downloadd em 10/06/2009 - 15:09h
alysin_fc
os comandos tc ........ você pode colocar em qualquer arquivo, você quem decidirá o nome.
por exemplo /etc/tc_file
não esqueça de setar permissão de execução
chmod +x /etc/tc_file
para executar
/./etc/tc_file
Já o arquivo "eth1-qos.cfg" é de configuração do htb-tools, no qual a configuração é bem mais simples que essa; existem artigos para instalar e configurar o htb-tools aqui no vol.
[16] Comentário enviado por tasilva em 25/06/2009 - 15:46h
Ótimo post, parabéns. Mas eu estou tendo problemas com o seu exemplo prático, eu o apliquei em um server de testes e percebi que nao importa o tipo de protocolo que use para fazer download (http, ftp), ele sempre cai na classe tc class add dev eth0 parent 1:0 classid 1:40 htb rate 1mbit, sabe como eu posso resolver isso. Obrigado.
[17] Comentário enviado por wagner_guitar em 24/09/2010 - 12:19h
tou precisando fazer um controle de trafego que diferencie de quem quer por exemplo apenas acessar a web para ver emails e pesquisa (e esse teria prioridade) e de quem quer fazer um download.
alguem pode me ajudar????