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