Você está na página 1de 41

Boa tarde!!

Marcus Augustus Pereira Burghardt


LPIC-1, MCLNA, MCLSA e MCTS Security

marcus.apb@gmail.com
Controle de Banda

CBQ x HTB

Nível: - Intermediário.

Assuntos: - Algoritmos existentes.


- Ferramentas usadas.
- Comparação de qdiscs.

Pré-requisitos: - Noções de conexões TCP/IP.


Controle de Banda

Controle de Banda

Controle de Tráfego

Quality Of Service (QoS)


Controle de Banda

O que é?

Por quê usar?


Alguns Cenários

 Limitar a banda total de uma interface baseado na velocidade


do link;
 Limitar a banda de uma estação ou servidor;
 Reservar banda para uma aplicação específica;
 Maximizar a banda de aplicações comprometidas;
 Permitir uma distribuição uniforme de banda;
 E muitas outras necessidades...

IMPORTANTE: Não faz milagre em links mal projetados.


Algumas Vantagens

 Possibilidade de aproveitar ao máximo o link sem prejudicar


aplicações através de uma distribuição justa.

 Permitir que aplicações que exijam mais banda possam


trabalhar sem influencia negativa em outras aplicações.
 Ex.: Servidor de E-mails.

 Diminui consideravelmente a necessidade de adquirir links


maiores. Redução de custos.

 Estabilidade do link.
Algumas Desvantagens

 Complexidade.

 Risco do uso errado. Seja por falha de configuração ou falta de


conhecimento.

 Muitas vezes, devido a complexidade de implementação ou


gerenciamento fica mais viável aumentar o link.

 Inúmeras regras para cada servidor ou aplicação ou custo para


treinamento de equipe.
Conceitos

 Filas
 Incialmente usada apenas a fila do tipo FIFO.

 Fluxos
 Endereço de origem e endereço de destino.
 Porta de origem e porta de destino.

 Tokens

 Buckets (Baldes)
Tokens e Buckets (Baldes)
Elementos Básicos

 Shaping
 Causa delay no tráfego, por exemplo, priorizando pacotes.

 Scheduling (Arranjo)
 Programar e reprogramar filas.

 Classifying (Classificação)
 Categorizar fluxos e marcar pacotes (iptables).
Estrutura de QoS Linux

 Qdisc (Queuing Disciplines – Diciplinas de Enfileiramento)


 Class (Classe)
 Filter (Filtro)
 Handle (Manipulador)
 Iproute2
Qdisc

 Qdisc (Queuing Disciplines – Diciplinas de Enfileiramento)


 Elemento base para todo controle de tráfego.
 Pode ser Classless e Classful.

 Classless
 Não permitem nenhuma classe adicional e nenhum filtro.
 Ex.: FIFO, PFIFO_FAST, TBF, SFQ.

 Classful
 Podemos criar várias classes, subclasses e filtros.
 Ex.: HTB, CBQ, PRIO.
Onde aplicar?

 Ingress, Entrada, Inbound ou INPUT.


 Tudo que está entrando na interface (fora para dentro).
 Não permite a criação de classes filhas.
 Podemos apenas adicionar um filtro de policiamento.
 Muito limitada. Apenas um uso (taxa de pacotes aceitos).

 Egress, Saída, OutBound ou OUTPUT


 Tudo que está saindo da interface (dentro para fora).
 Controle total, poderoso e flexível sobre o tráfego.
 Aceita qualquer qdisc, classe ou filtro.
Topologia Usada
Class e Filter

 Class (Classes)
 Aplicadas apenas em qdisc classful (htb e cqb).
 Podem ter várias ramificações.
 Podem conter outros qdiscs diferentes em cada subclasse.
 O qdisc default para uma classe sem filhas é PFIFO_FAST.

 Filter (Filtro)
 Serve para direcionar tráfego para as classes.
 Precisa de um classificador como o u32 ou semelhante.
 Identifica campos de um pacote de rede.
Handle

 Handle (Manipulador)
 É o responsável pela relação entre qdisc, classes e filtros.
 Formado por um major e um minor. Ex.: 1:10
 Um minor 0 obrigatóriamente identifica um qdisc.
 Ex.: 1:0 ou simplesmente 1:

 Funções
 Podemos direcionar tráfego diretamente para uma classe.
 Podemos criar uma hierarquia entre as classes e qdiscs.
Requisitos

 Kernel
 Praticamente todos as distribuições vêm com kernel pronto
para QoS.

 Pacotes Necessários
 Iproute2 – Possui a ferramenta tc (nosso foco).

 Pacotes Opcionais
 tcng
Ferramenta TC

 Abreviação de Traffic Control (TC).

 Trabalha diretamente com o Kernel.

 Permite manipularmos os 3 componentes básicos do Controle


de Banda.
 Qdisc
 Class
 Filter
Syntax do TC

marcus@krusty:~$ tc
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }
tc [-force] -batch file
where OBJECT := { qdisc | class | filter | action | monitor }
OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [file] }
Exemplo de regra

Criando uma qdisc raiz:


# tc qdisc add dev eth0 root handle 1:0 htb

tc qdisc add = será adicionada uma qdisc.


dev eth0 = atrelada à interface eth0.
root = significa egress ou fluxo de saída.
handle 1:0 = sempre ao adicionar uma qdisc o minor deve ser 0.
htb = qdisc do tipo htb sem parametros adicionais.
Exemplo de regra

Adicionando uma classe na qdisc raiz:


# tc class add dev eth0 parent 1:0 classid 1:1 htb rate 10kbit ceil
50kbit

tc class add = será adicionada uma classe.


parent 1:0 = hieraquicamente abaixo do handle 1:0.
classid 1:1 = major e minor de identificação da classe.
htb = nesta classe serão usados algoritmos htb.
rate 10kbit = o que estrar nesta classe terá 10 kbits garantidos.
ceil 50kbit = e poderá chegar a 50 kbits caso haja sobra.
Exemplo de regra

Adicionando um filtro de tráfego:


# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip
sport 80 0xffff flowid 1:1

tc filter add = será adicionado um filtro.


protocol ip = engloba tanto tcp quando udp.
prio 1 = pode existir prioridades entre os filtros.
u32 = tipo de classificador que permite usar atributos dos
pacotes.
match ip sport 80 0xffff = sempre que a porta de origem for 80.
flowid 1:1 = direcionar esse tráfego para a classe 1:1.
Resumo das regras

# tc qdisc add dev eth0 root handle 1:0 htb


# tc class add dev eth0 parent 1:0 classid 1:1 htb rate 10kbit ceil
50kbit
# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip
sport 80 0xffff flowid 1:1

Representação gráfica:
1:0 __ - Criada qdisc raíz.
|
1:1 - Classe adicionada abaixo da qdisc raíz.
Mas só podemos fazer isso?

NÃO!

Como HTB e CBQ são classful, podemos adicionar qualquer outro


qdisc abaixo deles e em classes diferentes.

Vamos ver alguns qdiscs que podemos usar para dar mais poder
ao nosso controle de banda.
FIFO - Classless

 First-In First-Out
 Possui como parâmetro a tag ”limit”.
 Pode-se limitar o tamanho da fila para evitar overflow quando
os pacotes entram na fila mais rápido do que podem sair dela.
 Esse limite pode ser feito em pacotes (pfifo) ou bytes (bfifo).
Ex:
tc qdisc add dev eth0 handle 1:0 root htb
tc qdisc add dev eth0 handle 2:0 parent 1:0 pfifo limit 30

Mais detalhes: $ man tc-fifo


PFIFO_FAST - Classless

 Semelhante ao FIFO porém mais eficiente usando prioridades.


 Possui 3 filas com prioridades diferentes e divide os pacotes de
acordo com o ToS.
 Possui como parâmetro ”txqueuelen”.
 Pode-se limitar o tamanho da fila para otimizar tráfegos
específicos.
Ex:
tc qdisc add dev eth0 handle 1:0 root htb
tc qdisc add dev eth0 handle 2:0 parent 1:0 pfifo_fast txqueuelen
5000
Mais detalhes: $ man tc-pfifo_fast
SFQ - Classless

 Stochastic Fair Queue


 Possui como parâmetros ”perturb” e ”quantum”.
 Perturb: Tempo em que os fluxos serão recalculados.
 Quantum: Qtd. de bytes que podem ser removidos da fila.
 Permite uma distribuição justa para todas as conexões e evita
que uma conexão monopolize o tráfego disponível.
 Problema com aplicações P2P (eMule, Kazaa, etc).
Ex:
tc qdisc add dev eth0 handle 1:0 root htb
tc qdisc add dev eth0 handle 2:0 parent 1:0 sfq perturb 10
Mais detalhes: $ man tc-sfq
RED - Classless

 Random Early Detection


 Usado para tentar evitar congestionamentos proativamente.
 Faz esse trabalho baseado ná media de tráfego da interface.
 Parâmetros:
 Min: Média mínima da fila.
 Max: Média máxima da fila.
 Probability: valor que indica a probabilidade de gargalo.
 Limit: limite de pacotes que podem ficar na fila.
 Burst: tamanho de rajadas.
 Avpkt: média de pacotes da interface para cálculo da fila.
RED - Classless

 Mais Parâmetros:
 Bandwidth: Banda da interface também usada para cálculo
da média de tamanho da fila.
 Ecn: Marca os pacotes ao invés de dropar. Isso informa os
outros dispositivos que o tráfego está aumentando.

Mais detalhes: $ man tc-red


TBF - Classless

 Token Bucket Filter


 Excelente qdisc para controlar a banda com precisão.
 Lembram-se dos Karts?

 Parâmetros
 Limit ou latency: Tamanho ou tempo que pacotes ficam na
fila esperando por um token.
 Burst: Tamanho do balde. Rajada de tokens.
 Mpu: Unidade mínima de pacote.
 Rate: Banda mínima.
TBF - Classless

Exemplo de regra usando TBF:

# tc qdisc add dev eth0 handle 1:0 root htb


# tc qdisc add dev eth0 handle 2:0 parent 1:0 tbf burst 20480 limit
20480 mtu 1514 mpu 64 rate 256kbit

Mais detalhes: $ man tc-tbf

Detalhes técnicos do algorítmo:


http://en.wikipedia.org/wiki/Token_bucket
Tokens e Buckets (Baldes)
PRIO - Classful

 Priority Scheduler
 Seria uma extensão do pfifo_fast.
 Funciona da mesma forma que o pfifo_fast, ou seja, priorizando
pacotes de acordo com o ToS, porém podem ser adicionados
qdiscs para gerenciar essas filas de prioridades.

Ver exemplo prático: QoS_PRIO.


CBQ - Classful

 Class Based Queuing


 Método mais antigo e complexo de controle de banda.
 Seu algoritmo não é confiável e preciso pois é baseado no
tempo ocioso da interface.
 Por favor, explique-me isso melhor!!! Ok, sem problemas!
 Ex.: Reduzir uma banda de 10Mbps para 1Mbps.
 O link deverá ficar 90% ocioso.
 Caso fique menos de 90% ocioso o atraso de pacotes é
aplicado.
 Como calcular isso?
CBQ - Classful

 Parâmetros
 Avpkt: Média de tamanho dos pacotes. Necessário para
calcular o maxidle.
 Bandwidth: Banda fisica do device.
 Cell: Celulas de pacotes.
 Maxburst: Rajada máxima antes causar latência.
 Minburst: Rajada mínima em caso de sobrecarga.
 Minidle: Em sobrecarga evita rajadas repentinas.
 Mpu: Menor tamanho de pacote a ser considerado.
 Rate: Velocidade desejada para saída de tráfego.
CBQ - Classful

 Mais Parâmetros
 Allot: Quando usa prioridades permite apenas uma
quantidade de pacotes por vez.
 Prio: Define prioridades para as classes.
 Weight: Define pesos para classes durante o rateio.
 isolated/sharing: Compartilha banda ou não.
 Bounded/borrow: Empresta banda ou não.

Ver exemplo prático: QoS_CBQ


HTB - Classful

 Hierarchical Token Bucket


 Permite criar várias classes com links virtuais.
 Muito preciso devido ao uso de tokens e buckets.
 Sucessor do CBQ.

 Parâmetros
 Default: Onde se encaixam os fluxos não definidos.
 Rate: Mínima banda, ou seja, banda garantida.
 Ceil: Banda máxima, porém não garantida.
 Burst: Tamanho do balde para rate.
 Cburst: Tamanho do balde para ceil.
HTB - Classful

 Mais Parâmetros
 Quantum: Usado para controlar o emprestimo de banda.
Normalmente calculado pelo próprio HTB.
 R2q: Trabalha junto com o quantum para divisões. Também
é bem pouco necessário usá-lo.
 Mtu: Normalmente MTU da placa de rede.
 Prio: Quanto menor o número, maior a prioridade.

Ver exemplo prático: QoS_HTB


Árvore Classful
1: root qdisc

1:1 child class

/ | \

/ | \

/ | \

/ | \

1:10 1:11 1:12 child classes

| | |

| 11: | leaf class

| |

10: 12: qdisc

/ \ / \

10:1 10:2 12:1 12:2 leaf classes


Referências

 $ man tc
 http://lartc.org/
 http://www.linux.com/learn/docs/ldp/783-Traffic-Control-HOWTO
 http://luxik.cdi.cz/~devik/qos/htb/htb3perf/cbqhtb3perf.htm
 http://www.numaboa.com/informatica/linux/configuracoes/709-
banda2?start=2
Obrigado!

DÚVIDAS??

Marcus Augustus Pereira Burghardt


LPIC-1, MCLNA, MCLSA e MCTS Security

marcus.apb@gmail.com

Você também pode gostar