Ir para o conteúdo
ou

Software livre Brasil

0 integrantes

Nenhum(a)

Red Hat Magazine

redirection forbidden: http://www.redhat.com/magazine/rss20.xml -> https://www.redhat.com/magazine/rss20.xml

 Voltar a torontux
Tela cheia Sugerir um artigo

QoS com HTB

27 de Abril de 2010, 0:00 , por Software Livre Brasil - 0sem comentários ainda | Ninguém está seguindo este artigo ainda.
Visualizado 639 vezes
    Essa semana estive procurando um tema para escrever baseado nas necessidades mais comuns de uma empresa, e por coincidência, precisei rever alguns scripts de controle de banda que havia criado. Como esse tema parece ser um pouco "misterioso" para alguns, decidi colocar algo aqui da maneira mais simples possível.
    Fiz uma síntese de alguns sites (colocarei os links no final) visando criar uma documentação menos formal e mais compreensível do assunto. Não abordaremos assuntos, tais como módulos de kernel e instalação pacotes tendo em vista que as distro atuais já vem com tudo habilitado nesse aspecto.
 
Em primeiro lugar, vamos a alguns conceitos básicos:

1 - Para funcionar o QoS tanto para download quanto para upload precisamos configurar as 2 placas de rede do servidor, pois só temos como tratar a entrega dos pacotes.
                      
         
2 - Basicamente, para criar o QoS você vai precisar mapear alguns pontos relacionados ao tráfego que será tratado:
  • Origem
  • Destino
  • Porta
  • Protocolo
    É possível criar regras através de TOS (Type Of Service, marcação de pacotes) para protocolos VoIP por exemplo, tendo em vista a utilização de milhares de portas aleatórias e a impossibilidade de mapeamento, contudo não vamos abordar neste post.

3 - O binário que executamos é o tc, ele vem dentro do pacote iproute2 (geralmente instalado por default)

Segue abaixo um exemplo de script todo comentado.


#!/bin/bash
 
# Primeiro apagamos qualquer regra de QoS das interfaces
# OBS: Se eh a primeira vez que vc executa vai aparecer um erro
#      mas eh normal, ele simplesmente diz que n existia regras.
  
/sbin/tc qdisc del dev eth0 root
/sbin/tc qdisc del dev eth1 root 
 
# Associa uma regra de enfileiramento (qdisc) HTB a interface eth0 (upload)
# e vincula a esta o manipulador "1:". Tal manipulador será usado em comandos
# abaixo para ajudar a criar a estrutura hierarquica. O "default 10" diz que
# todo trafego que nao estiver associado a uma classe especifica sera feito
# pela classe 10. 
     
tc qdisc add dev eth0 root handle 1: htb default 10

# Criando as classes com seus respectivos limites de banda...
# Essa é a classe mãe da interface, ou seja, é a classe com o
# total de banda, o total do seu link ou da sua placa de rede, da
# interface...
# aqui estou dizendo que o nosso link é de 2000kbps (2Mb)

tc class add dev eth0 parent 1: classid 1:1 htb rate 2000kbps

# Essas são as classes filhas, ou seja, onde você vai pre-definir varios 
# tipos de trafego. Vc vai segmentar seu link completo em pequenas fatias
# 
# rate = Velocidade da "fatia" ou seja, a banda garantida
# ceil = Transbordo, ateh onde vai caso tenhamos banda ociosa de outras classes
# prio = Prioridade de 1 a 7 , 1 mais alta e 7 a mais baixa
#
# OBS: A soma dos rates nao pode ultrapassar o link total 
 
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500kbps ceil 800kbps prio 7

tc class add dev eth0 parent 1:1 classid 1:20 htb rate 500kbps ceil 1000kbps prio 6
 
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 500kbps ceil 1500kbps prio 2 
 
tc class add dev eth0 parent 1:1 classid 1:40 htb rate 500kbps ceil 2000kbps prio 1  
 
# Definimos em nossas classes filhas que caso exista banda disponivel em 
# outras classes concorrentes, existira o transbordo. Então é interessante
# que digamos ao SO o tempo para calculo de banda disponivel como segue abaixo
 
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 5 # Colocamos 5 segundos
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 5 # em todas as classes
tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 5
tc qdisc add dev eth0 parent 1:40 handle 40: sfq perturb 5 
 
# Vamos agora definir qual tipo de trafego vai por onde, vamos dizer quem
# usa quanto entende? ;)
# Criei essa variavel pra facilitar nossa vida tendo em vista que esse comando 
# vai se repetir todas as vezes
 
FILTER="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
 
# Exemplo de regra por origem onde definimos que a maquina de ip 192.168.1.50
# vai fazer upload de 500kbps e caso exista banda disponível, vai fazer a 800kbps
 
$FILTER match ip src 192.168.1.50 flowid 1:10 (colocamos na classe 1:10)

# Exemplo de regra por porta de origem e destino onde o upload para essa 
# porta eh de 500kbps e caso exista banda disponivel 1Mb(colocamos na classe 1:20)  
 
$FILTER match ip sport 80 0xffff flowid 1:20  
$FILTER match ip dport 80 0xffff flowid 1:20
 
# Exemplo de regra por protocolo, nesse caso estamos enfileirando o protocolo GRE
# usado em VPNs pptp(colocamos na classe 1:30).
 
$FILTER match ip protocolo 47 0xff flowid 1:30

####################################################################
# Para realizar o QoS para os downloads vamos fazer as regras para 
# a outra interface eth1, vou apenas copiar as regras de cima alterando 
# a interface de rede. 
####################################################################
tc qdisc add dev eth1 root handle 1: htb default 10  

tc class add dev eth0 parent 1: classid 1:1 htb rate 2000kbps

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500kbps ceil 800kbps prio 7

tc class add dev eth0 parent 1:1 classid 1:20 htb rate 500kbps ceil 1000kbps prio 6
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 500kbps ceil 1500kbps prio 2
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 500kbps ceil 2000kbps prio 1

tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 5
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 5
tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 5
tc qdisc add dev eth0 parent 1:40 handle 40: sfq perturb 5

FILTER="tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32"

$FILTER match ip src 192.168.1.50 flowid 1:10 (colocamos na classe 1:10)

$FILTER match ip sport 80 0xffff flowid 1:20

$FILTER match ip dport 80 0xffff flowid 1:20

$FILTER match ip protocolo 47 0xff flowid 1:30

# End
Pronto!! É isso...
Existe uma infinidade de documentações mais profundas sobre o assunto, contudo, este blog destina-se a facilitar as coisas. ;)

Seguem abaixo alguns links que usei como referência:

http://br-linux.org/tutoriais/001648.html
http://luxik.cdi.cz/~devik/qos/htb/
http://www.dicas-l.com.br/dicas-l/20050114.php
Fonte: http://torontux.blogspot.com/2010/04/qos-com-htb.html

0sem comentários ainda

Enviar um comentário

Os campos são obrigatórios.

Se você é um usuário registrado, pode se identificar e ser reconhecido automaticamente.