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
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 10Pronto!! É isso...
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
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
0sem comentários ainda