Академический Документы
Профессиональный Документы
Культура Документы
Sumário
Introdução
Ferramentas utilizadas
Pacotes utilizados
Conceitos
Qdisc
Classless Qdiscs
Classfull Qdiscs
Class
Filter
Conclusão
Introdução
Este artigo tem como objetivo explicar como configurar em uma máquina Linux o controle de
tráfego utilizando HTB (Hierarquical Token Bucket). Para se utilizar deste recurso do kernel é
necessário que você tenha o módulo HTB carregado nele.
A partir do kernel 2.4.20 o suporte ao HTB foi incluído nele, para versões anteriores é necessário
a aplicação de um patch. Porém antes de entrarmos diretamente na parte prática sobre controle de
tráfego utilizando HTB, é necessário alguns conceitos sobre o que é qdisc, class, filters, conceitos
estes que veremos mais adiante.
Ferramentas utilizadas
Na construção deste artigo me utilizei da distribuição Debian Sarge, kernel 2.6.16 e os drivers
HTB, SFQ, U32. Seus caminhos dentro do kernel citado acima estão listados abaixo e suas
funções serão detalhadas mais a frente.
Networking-->
Networking options-->
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011
Controle de tráfego utilizando HTB no Debian Sarge [Artigo] Page 2 of 7
Caso esteja utilizando um kernel da própria distribuição, estes módulos já estão disponíveis e para
utilizá-los basta carregá-los, conforme comandos abaixo:
# modprobe sch_htb
# modprobe sch_sfq
# modprobe cls_u32
Pacotes utilizados
O único pacote necessário para ser instalado no Debian Sarge para o controle de tráfego com HTB
é o de nome iproute, que contém o comando "tc", que significa traffic control.
Este comando sozinho é responsável não só no Debian, mas no Linux, pelo controle de tráfego.
Mais detalhes sobre a utilização do comando "tc" será detalhado mais à frente.
Conceitos
Para utilizarmos o controle de tráfego com HTB temos que saber que o Linux possui os seguintes
componentes para o controle de tráfego, são eles:
qdisc
class
filters
Qdisc
Os qdiscs (qdisc é abreviação de Queueing Discipline - algo como Disciplina de Enfileiramento)
nada mais são do que as filas de saída dos pacotes. O Linux possui dois tipos de qdisc: classless e
classfull.
Os qdiscs classless não podem conter classes definidas pelo usuário, porém os qdiscs classfull
podem conter subclasses definidas pelo usuário, podendo desta forma separar e atribuir
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011
Controle de tráfego utilizando HTB no Debian Sarge [Artigo] Page 3 of 7
O qdisc chamado de "root" só pode ser atribuído para cada interface de rede. Por padrão o Linux
atribui o qdisc "pfifo_fast" para todas as interfaces de rede de sua máquina, porém isso pode ser
mudado, como veremos mais adiante.
Claro que existem mais qdiscs classless e classfull do que os que vou conceituar aqui, no entanto
vou citar apenas os utilizados por mim para implementar o controle de tráfego com HTB.
Classless Qdiscs
PFIFO_FAST:
Este qdisc é utilizado para que se possa distribuir de maneira igualitária a oportunidade de cada
flow ser servido. E para que isso possa acontecer ele se utiliza do algoritmo de escalonamento
"round-robin" para servir as filas. Ele possui um parâmetro "perturb", que verifica em segundos a
solicitação de banda por conexão.
Classfull Qdiscs
HTB:
O HTB é um qdisc com suporte a classes, por isso ele pode ser usado como um qdisc
(escalonador) ou apenas uma classe. Quando utilizado com uma classe, ele possui o parâmetro
opcional "default", que indica a subclasse por onde o pacote deve ir quando não for classificado
por nenhum filtro definido pelo usuário.
Class
As classes só existem em qdiscs classfull, elas são utilizadas para dividir o tráfego, para assim se
necessário dar um tratamento diferenciado. Existem dois tipos de classes, as "leafs" (ou "folhas"),
que são classes que não possuem "filhos" e as "inner" (ou "internas"), que são classes que
possuem "filhos".
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011
Controle de tráfego utilizando HTB no Debian Sarge [Artigo] Page 4 of 7
Filter
Os filtros tem a função de separar o tráfego entre as diversas classes de um qdisc classfull. Esta
função é feita através de classificadores.
Classificadores
Os classificadores no Linux são utilizados para identificar certas características e/ou padrões dos
pacotes e fluxo, permitindo assim a separação em classes. Falarei apenas do classificador U32, no
qual utilizei em meus estudos.
U32:
O u32 é um classificador muito bom e que possui uns parâmetros interessantes, no qual é possível
identificar IP de origem/destino, porta de origem/destino e até mesmo o protocolo, abaixo listo os
parâmetros que utilizei:
A configuração do controle de tráfego é feita toda através do comando tc, que tem a forma geral
mostrada abaixo:
Os OBJETOS do tc, como já foram conceituados acima, são: qdisc, class, filters.
Exemplos de comandos:
# tc qdisc
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011
Controle de tráfego utilizando HTB no Debian Sarge [Artigo] Page 5 of 7
# tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
Listar qdiscs
Para listar qdiscs basta utilizar a opção "show" seguida claro da interface de rede, por exemplo:
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.
# tc class add dev eth0 root classid 1:0 htb rate 1Mbit
# tc class add dev eth0 parent 1:0 class id 1:1 htb rate 100kbit
Listando classes
Para listar classes basta utilizar a opção "show". Temos ainda como parâmetro a opção -s, que
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011
Controle de tráfego utilizando HTB no Debian Sarge [Artigo] Page 6 of 7
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 filter
Os filtros tem que ser anexados às classes, para que dessa forma elas possam efetuar a separação
do tráfego.
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
Listar filtros
Para listar filtros basta utilizar a opção "show" seguida claro da interface de rede, por exemplo:
Exemplo prático
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011
Controle de tráfego utilizando HTB no Debian Sarge [Artigo] Page 7 of 7
Vamos agora elaborar um exemplo prático para podermos praticar nosso aprendizado.
Suponhamos que você tenha um link de 10mbit e queria destinar 4mbit para tráfego web, 3mbit
para tráfego FTP, 2mbit para tráfego SSH e 1mbit para o restante do tráfego, contudo quero que,
se houver banda disponível, meu tráfego web chegue a 6mbit, o FTP a 5mbit e o SSH a 4mbit.
Vejamos como ficaria nosso exemplo abaixo:
Com os comandos acima foram definidas as classes e suas velocidades, só nos falta agora separar
o tráfego web do FTP e do ssh, para isso precisamos criar três filtros, os pacotes que não
pertencem a estas classes serão destinados a classe default, que no nosso caso é "1:40" de
velocidade de 1mbit.
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dport 80 0xffff flowid 1:10
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dport 20 0xffff flowid 1:20
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dport 21 0xffff flowid 1:20
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip dport 22 0xffff flowid 1:30
Se por acaso não houver tráfego para a classe 40, esses 1mbit podem ser divididos pelas classes
1:10, 1:20, 1:30.
Conclusão
Espero que com este artigo possa ter contribuído para um melhor entendimento sobre controle de
tráfego utilizando HTB e todos os outros conceitos que considerei importante citar para
engrandecer o artigo e seu entendimento.
http://www.vivaolinux.com.br/artigo/Controle-de-trafego-utilizando-HTB-no-Debian-Sarge
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011