QOS com TC ( Traffic-Control )
Introdução
Utilizado para gerenciamento de filas do buffer com isso realizando QOS e compatÃvel com diversos
algoritmos como RED, WRED, SQF, CBMARK, HTB e entre outros. O
próposito do post é utilizar o algoritmo HTB onde trabalha com a fila de disciplina class full onde podemos
delimitar tamanho da banda utilizada.
Classes são responsáveis por classificar os dados de forma a controlar o tráfego.
Existe dois tipos de filas de diciplinas ( Qdisc -- Queuing Disciplines ) onde que os algoritimos trabalha, classfull e classless, classfull é possivel definir e adicionar classes de forma dinâmica pelo usuário e classless já existe classes definidas onde que podemos indicar determinado tráfego a elas.
O tc controla essas filas de disciplinas esse buffer ( armazenamento esperando para ser descarregado ) é
enfileiramento dos pacotes que espera ser descartados da interface de
rede isso significa que o controle é aplicado apenas para o tráfego que sai da interface.
Então tenho duas placas de rede onde que preciso controlar o download da rede, eu aplicaria na interface ligada diretamente a ela controlando o tráfego que está saindo do firewall para a rede interna. Agora se eu quiser controlar o upload, bastaria aplicar na interface de internet onde controlaria tudo que está saindo pela interface.
Identificando tráfego
Para que possamos aplicar QOS em
nossa rede precisamos saber o que realmente é tráfegado, no
firewall iremos instalar uma aplicação que irá analisar:
# yum install iptraf |
E iremos monitorar a interface LAN e
olha o que iremos vizualizar:
# iptraf |
Pronto o tráfego da rede analisada na imagem é muito extenso, mas iremos pegar os protocolos mais comum que exige mais atenção e aplicar QOS sobre eles e deixando todos em uma classe padrão.
Iremos verificar a banda que
está disponÃvel em nossa interface de rede
para que possamos colocar métricas de utilização:
Então seguindo esse gráfico iremos delimitar o download em nossa rede da seguinte forma:
Serviços | Porta | Minimo (Mb/s) | Maximo (Mb/s) |
HTTP/HTTPS | 80/443/TCP | 4Mbit | 5Mbit |
FTP | 21/TCP | 1Mbit | 1,5Mbit |
POP | 110/TCP | 1Mbit | 1,2Mbit |
SMTP | 25/TCP | 1Mit | 1,2Mbit |
SSH | 22/TCP | 1,5Mbit | 2Mbit |
DNS | 53/UDP | 0,5Mbit | 0,7Mbit |
Default | – | 5Mbit | 7Mbit |
Temos aqui uma tabela simples de valor
minimo e valor máximo oque seria isso? Basicamente se um serviço
esta precisando de mais banda ele pega emprestado da politica que
estiver mais disponivel.
Quando realizamos um download é medido
em Byte por segundo e iremos aplicar essas regras em bit por segundo
para ser claro:
1 Byte = 8 bits
Então em um download em torno de
350KByte/s temos uma tranferencia em 2,800Kbit ( 350*8 = 2800
). Então podemos continuar.
Aplicando
O tc trabalha com disciplinas de filas
( Queuing Disciplines ) que na linha de comando será “qdisc”,
essa qdisc sempre será presente por se tratar de uma raiz da regra.
Dentro dessa raiz chamada root criamos
ramificações que declaramos como classe, nessas classe podemos
estipular tamanho do tráfego total que essa classe irá adquirir e
dentro dela criar mais classes filhas onde podemos estipular uma
banda minima e maxima.
Essas classes filhas já criadas iremos
adicionar filtro de tráfego através do firewall para que entre
nessas filas ( classes ) e obdecendo a politica de descarte de acordo
com a classe.
Pronto já que entendemos a teoria
iremos partir para prática, iremos basear em script de configuração
para que torne futuras modificações mais flexÃvel.
Nosso script chamará “QOS.sh” e
configuramos para que sejá inicializado junto com o sistema:
# vi /etc/rc.local /bin/bash /root/QOS.sh |
Iremos criar nosso script dando
permissão de execução:
# touch /root/QOS.sh # chmod +x /root/QOS.sh |
Logo após vamos começar a editar
nosso script para que seja aplicado nosso QOS, lembrando que será
todo documentado:
# vi /root/QOS.sh # Scritpt de QOS – Projeto Uninove # by: Rafael G. de Matos ################################################################ # Controle de DOWNLOAD ################################################################ # Variavel export DOWN=eth0 # Apagando configuracao existentes tc qdisc del dev $DOWN root # Criando diciplina de filas raiz ( root ), especificando o default 1:10 tc qdisc add dev $DOWN root handle 1:0 htb default 10 # Adicionando classes pai, especificando a velocidade da placa 10/100/1000M tc class add dev $DOWN parent 1:0 classid 1:1 htb rate 1000mbit # Criando classes filhas tc class add dev $DOWN parent 1:1 classid 1:10 htb rate 5mbit ceil 7mbit tc class add dev $DOWN parent 1:1 classid 1:20 htb rate 4mbit ceil 5mbit tc class add dev $DOWN parent 1:1 classid 1:30 htb rate 1mbit ceil 1500kbit tc class add dev $DOWN parent 1:1 classid 1:40 htb rate 1mbit ceil 1200kbit tc class add dev $DOWN parent 1:1 classid 1:50 htb rate 1mbit ceil 1200kbit tc class add dev $DOWN parent 1:1 classid 1:60 htb rate 1500kbit ceil 2mbit tc class add dev $DOWN parent 1:1 classid 1:70 htb rate 500kbit ceil 700kbit # Pronto nosso script já está pronto, agora só precisamos aplicar os filtros com o “iptables” # Limpando cadeia de regras iptables -t mangle -F FORWARD # Adiconando marcação de pacote para suas respectivas classes, lembrando que default nao precisa iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 80 -j CLASSIFY --set-class 01:20 iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 443 -j CLASSIFY --set-class 01:20 iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 21 -j CLASSIFY --set-class 01:30 iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 110 -j CLASSIFY --set-class 01:40 iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 25 -j CLASSIFY --set-class 01:50 iptables -t mangle -A FORWARD -o eth0 -p tcp --sport 22 -j CLASSIFY --set-class 01:60 iptables -t mangle -A FORWARD -o eth0 -p udp --sport 53 -j CLASSIFY --set-class 01:70 # Pronto |
Agora devemos executar o script:
# /root/QOS.sh |
Testando QOS
Agora veremos o que esta sendo
utilizado em cada classe conforme o comando:
# tc -s -d class show dev eth0 |
Na imagem podemos com mais detalhe cada classe criada e suas respectiva informações referente a banda minima e maxima, pacotes enviados, taxa de rate ( quanto esta sendo utilizado atualmente ) e outras informações adicionais
Para que nosso teste seja mais dinâmico
iremos fazer um download de uma imagem do Debian antes e depois da
aplicação do QOS:
Na imagem conseguimos ver que o link bateu 1,318KB/s, após a ativação do QOS no momento do download olha o que podemos ver:
O Download diminui e bateu 336KB/s multiplicando esse valor conseguimos 2688kbit, lembrando que no momento do teste estáva com contante tráfego em rede, mas o mesmo ficou abaixo do limite estipulado.
Conclusão
O TC é uma boa ferramenta para
delimitar banda para os usuários em nossa rede, muito utilizado para
empedir mal uso do link evitando que seja mal utilizado por programas
de P2P e entre outros.
Bibliografia
Guia do Hardware - http://www.hardware.com.br/
Funtoo - http://www.funtoo.org/Traffic_Control
Linux Controle de Redes - André Stato Filho
Linux Controle de Redes - André Stato Filho
Legal, é justamente isso que estou procurando para implementar em minha rede, obrigado por compartilhar seu conhecimento, será de grande valor!
ResponderExcluirAguarde que terá muito mais, muito obrigado.
ResponderExcluirRafael, aguardo ansioso então, muito obrigado!
Excluir