Você está na página 1de 7

Controle de tráfego utilizando HTB no Debian Sarge [Artigo] Page 1 of 7

Controle de tráfego utilizando HTB no Debian Sarge

Autor: Fernando Marques Secco <fsecco at gmail.com>


Data: 29/08/2006

Sumário

 Introdução
 Ferramentas utilizadas
 Pacotes utilizados
 Conceitos
 Qdisc
Classless Qdiscs
Classfull Qdiscs
 Class
 Filter

 Configuração do Controle de Tráfego


 Exemplos de comandos
 Exemplo prático

 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

    QoS and/or fair queueing-->


      <*> Hierarchical Token Bucket (HTB) "CONFIG_NET_SCH_HTB"
      <*> Stochastic Fairness Queueing (SFQ) "CONFIG_NET_SCH_SFQ"
      <*> Universal 32bit comparisons w/ hashing (U32) "CONFIG_NET_CLS_U32" 

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:

HTB - Módulo HTB do Kernel:

# modprobe sch_htb

SFQ - Módulo SFQ do Kernel:

# modprobe sch_sfq

U32 - Módulo U32 do Kernel:

# 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

Seus conceitos encontram-se detalhados logo abaixo.

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

quantidades de banda diferentes para cada tipo de fluxo definido.

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:

O pfifo_fast é o qdisc padrão do Linux e é baseado no FIFO (First-in First-out).

SFQ (Stochastic Fairness Queueing):

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.

Como escalonador o HTB possui, dentre outros, os seguintes parâmetros :

 rate - velocidade de transmissão dos pacotes.


 burst - tamanho máximo em bytes que pode ser acumulado para rajada.
 ceil - velocidade total da classe superior. Utilizado para fazer o "borrowing", ou seja,
empréstimo de banda excedente de uma classe para outra.

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:

 ip src IP/MASK - classifica pacotes com origem em IP/MASK.


 ip dst IP/MASK - classifica pacotes com destino em IP/MASK.
 ip sport NN 0xffff - classifica pacotes com porta de origem NN. O parâmetro 0xffff é uma
máscara de 32 bits.
 ip dport NN 0xffff - classifica pacotes com porta de destino NN. O parâmetro 0xfff é uma
máscara de 32 bits.
 ip protocol NN 0xff - classifica pacotes de acordo com o protocolo especificado. No Debian
Sarge dar uma olhada em /etc/protocols.
 flowid X:Y - classifica que pacotes que tiverem este identificador devem ser colocado na
class X:Y.

Configuração do controle de tráfego

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

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

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:

# qdisc add dev eth0 root handle 1: htb default 10

Adicionando qdisc a uma classe:

# tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10

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

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

# tc filter show dev eth0

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:

tc qdisc add dev eth0 root handle 1: htb default 40


tc class add dev eth0 root classid 1:0 htb rate 10mbit
tc class add dev eth0 parent 1:0 classid 1:10 htb rate 4mbit ceil 6mbit
tc class add dev eth0 parent 1:0 classid 1:20 htb rate 3mbit ceil 5mbit
tc class add dev eth0 parent 1:0 classid 1:30 htb rate 2mbit ceil 4mbit
tc class add dev eth0 parent 1:0 classid 1:40 htb rate 1mbit

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

Voltar para o site

http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5344 12/2/2011