Controle de tráfego utilizando HTB no Debian Sarge

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.

[ Hits: 129.037 ]

Por: Fernando Marques Secco em 29/08/2006


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 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".

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.

Página anterior     Próxima página

Páginas do artigo
   1. Sumário
   2. Ferramentas utilizadas
   3. Conceitos
   4. Configuração do controle de tráfego
   5. Exemplo prático
Outros artigos deste autor

Eclipse no Debian pelo ambiente desktop (duplo-clique)

Instalação do CACTI no Debian Sarge

Instalando automounter e configurando o autofs no Debian Sarge

Leitura recomendada

Compilar e habilitar os módulos ip_table e iptable_nat no kernel 2.6.26 no Debian Linux

Gerência e criação de módulos do kernel

Slackware com kernel 2.6.10 - passo a passo

Compilação do kernel passo-a-passo

Compilando o KERNEL sem medo do "kernel panic"

  
Comentários
[1] Comentário enviado por leoberbert em 29/08/2006 - 13:35h

Excelente artigo... está de parabéns... poucas ferramentas usadas.. mas o conteúdo ficou foda!!!

[2] Comentário enviado por fabiobarby em 29/08/2006 - 13:35h

Gostei do artigo, parabens!

[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!!!

[4] Comentário enviado por pop_lamen em 30/08/2006 - 12:42h

Parabens!!!!

[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...

[6] Comentário enviado por guesser em 08/10/2006 - 16:48h

Olá

Excelente material... Caiu como uma luva para o que preciso, parabéns. É por causa deste tipo de relacionamento que a comunidade linux cresce tanto.

Valeu

[7] Comentário enviado por lavoie em 12/02/2007 - 11:46h

alguem sabe como faço o controle com pppoe-server , utilizando htb ?
ja que quando o cliente conecta abre uma no interface ppp+, ?
valeu

[8] Comentário enviado por R1cardo em 18/04/2007 - 15:59h

Olá estou com problema para controlar por serviço
exemplo

tc qdisc del dev eth0 root #limpa

tc qdisc add dev eth0 root handle 1: htb default 50 #default

tc class add dev eth0 parent 1: classid 1:1 htb rate 512kbit #banda

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 272kbit ceil 512kbit

tc class add dev eth0 parent 1:1 classid 1:50 htb rate 100kbit ceil 100kbit

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

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip src 192.168.0.0/24 match ip sport 80 0xffff flowid 1:10

só que o trafego na porta 80 assume a regra padrão que é "tc class add dev eth0 parent 1:1 classid 1:50 htb rate 100kbit ceil 100kbit"

qual será o problema ? como resolver isso?

[9] Comentário enviado por marceloespindola em 12/07/2007 - 00:33h

Depois de instalar qualquer controlador de banda é bom ter uma ferramenta de teste eu tenho um velocimetro em flash com os arquivos fontes abertos no seguinte endereço: http://marcelolinux.blogspot.com/2007/07/tenha-seu-prprio-velocmetro-em-flash.html

[10] Comentário enviado por agk em 23/07/2007 - 23:55h

http://snafu.freedom.org/linux2.2/iproute-notes.ht...
http://www.policyrouting.org/

[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.

obrigado a todos !

[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.

[13] Comentário enviado por thifachini em 30/04/2008 - 15:14h

Sobre/Para
Comentário enviado por R1cardo em 18/04/2007 - 15:59h:

se vc quer que sua rede local acesse http na web pela classe 1:10 sua regra esta errada, o correto é:

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip src 192.168.0.0/24 match ip dport 80 0xffff flowid 1:10

pois o seu destino (dport) é o 80 e sua origem (sport) são as altas aleatorias (1024-65mil e alguma coisa)

att

[14] Comentário enviado por alyson_fc em 18/06/2008 - 15:42h

em que arquivo eu coloco esses comandos??????

eth1-qos.cfg????

[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.

abraços

[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????


wagner_guitar@hotmail.com

[18] Comentário enviado por wagnerfs em 30/08/2014 - 10:37h

Excelente artigo amigo. Parabéns por compartilhar o conhecimento.

[19] Comentário enviado por removido em 27/06/2018 - 09:05h

Ola Bom dia,
me tira uma duvida por favor,

é possivel dividir uma banda de 10M, sendo 5 para vpn (openvpn ) e 5 mg para todo o resto?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts