Controle sua banda de maneira simples e inteligente com CBQ

Autor: Lacier Dias <lacier at renpac.com.br>
Data: 16/05/2004 

INTRODUÇÃo

Depois de ler vários artigos sobre como administrar bem sua banda de acesso à internet, resolvi escrever um artigo sobre este assunto pelos seguintes motivos:
  1. devido à importância do assunto, pois, o acesso ainda não é tão barato assim.
  2. pela dificuldade de achar informação na internet sobre este assunto.
  3. é um argumento a mais na hora de implementar o Linux em pequenas e médias empresas, que não tem setor de informática e toda economia é bem vinda.

Vamos ao que interessa. 

Imagine esta cena: você tem um ADSL e compartilha com seus vizinhos, mas um deles usa o Kazaa o dia todo deixando todo mundo lento ou pior, você tem um acesso coletivo em sua empresa, onde na sua maioria, os usuários apenas usam a conexão de maneira "superficial" (e-mail, icq, Kazaa, MSN, bate-papo, etc), ocupando assim toda a banda com coisas inúteis e você precisa fazer uma alteração urgente no servidor remoto, tendo que concorrer com todos usuários, ou pior, a diretoria de sua empresa está achando que a conexão está lenta (embora seu link seja de bom tamanho) e te pede uma solução barata para que eles possam navegar mais rapidamente. Esta cena não é muito difícil de acontecer, contudo ambas as situações podem ser elegantemente contornadas. 

A solução: Qualidade de Serviço (QoS) 

Qualidade de serviço é um conceito relativamente antigo, que se preocupa em garantir que a rede estará disponível para aplicações críticas quando necessário. Com isto seria possível tirar a prioridade de uma estação, priorizando outra, ou qualquer outra aplicação interativa que não pode ter latência, como o tráfego de voz sobre IP, uma vídeo conferência, telnet ou ssh. 

QoS é um assunto muito extenso e abrangente, dessa forma tentaremos aqui trazer apenas o conteúdo para a sua utilização em Linux de maneira clara e objetiva. 

Grandes empresas se interessaram por está tecnologia e foram criados protocolos para que os roteadores conversem entre si e estabeleçam um canal especial entre duas máquinas. A Cisco por exemplo, implementou em seus roteadores o RSVP (ReSerVation Protocol), onde, quando duas máquinas tentam trocar dados com QoS, primeiro, o computador que faz o pedido constata o primeiro roteador e pergunta se ele pode oferecer uma quantia x de banda por um certo tempo. Este roteador irá perguntar para o próximo, e este ciclo se repetirá até chegar na máquina de destino. Se todos roteadores no caminho responderem que é possível estabelecer QoS, o canal especial será estabelecido. 

O conceito é extremamente interessante, mas imagine o custo que seria trocar os roteadores por equipamentos compatíveis com este protocolo. Valeria a pena?!? 

O Linux, entretanto, a partir do kernel 2.2, com adição do pacote iproute2, que integra os comandos tc (Traffic Control) e ip, pode fazer um interessante controle de QoS sem o menor custo. O uso deste recurso sempre foi restrito, pois estes comandos têm a sintaxe razoavelmente complicada e não há boa documentação deste pacote. 

Entretanto tudo se tornou muito fácil quando em 1999, Pavel Golubev criou o script cbq.init. Feito em bash, este script acompanha diversas distribuições, como o Red Hat, Mandrake e o Conectiva e é simplesmente um front-end para os comandos do pacote iproute2. Para rodar, precisamos ter instalados os seguintes pacotes, que normalmente vem no cd da sua distribuição e já são em RPM:
  • iproute2
  • shapercfg

Instalados estes pacotes, temos que criar os parâmetros para poder limitar a banda e começarmos a usar o cbq. 

ENTENDENDO E CONFIGURANDO O CBQ



cbq se baseia em uma regra de classificação e priorização de pacotes chamada Class Based Queue (CBQ), onde podemos criar várias classes, cada uma com um limite de banda. Também podemos criar classes "pais e filhas", formando uma árvore. Com isto é possível reservar, por exemplo, 512Kb/s para uma classe e ligar a ela uma de 256Kb/s para ftp com a opção de emprestar banda. Isto fará com que os downloads não ultrapassem 256Kb/s e tenham sua velocidade forçada a ser diminuída se a classe pai precisar de mais de 256Kb/s. 

Basicamente o que o cbq faz é controlar a entrada e a saída das placas de rede de uma máquina. Dessa forma podemos até colocar máquinas intermediárias em uma rede fazendo forward de pacotes com prioridades distintas. Como por exemplo, definir velocidades máximas para cada cliente ligado a um roteador (Linux é claro). 

No cbq, cada classe é configurada através de um arquivo.
  • Os arquivos contendo as classes ficam em /etc/sysconfig/cbq/.
  • Os nomes dos arquivos devem seguir o modelo cbq-0002.descricao_da_classe.
  • A contagem deve começar em 2 e a numeração deve ser crescente e em hexadecimal, portanto, depois do nove ao invés de 10 temos A, B, C, D, E, F, e só depois o 10.

Exemplo: 
Queremos limitar a velocidade que a estação com IP 192.168.1.9 navega para apenas 32Kbit/s. Dessa forma, o usuário poderá fazer downloads e navegar sem comprometer o link. 

Vá para o diretório /etc/sysconfig/cbq, que é onde ficam as regras de limitação (classes). As distribuições mais recentes já vêm com estes pacotes em seus CDs. 

Crie o arquivo com o nome cbq-0002.estacao9-in e o seguinte conteúdo: 

DEVICE=eth1,100Mbit,10Mbit 
RATE=32Kbit 
WEIGHT=3Kbit 
PRIO=5 
RULE=192.168.1.9/32 
BOUNDED=yes
ISOLATED=yes

Crie o arquivo com o nome cbq-0002.estacao9-out e o seguinte conteúdo: 

DEVICE=eth0,100Mbit,10Mbit 
RATE=32Kbit 
WEIGHT=3Kbit 
PRIO=5 
RULE=192.168.1.9/32, 
BOUNDED=yes
ISOLATED=yes

Feito isso, é só ativar as regras: 

# cbq start 

Para desativar: 

# cbq stop 

Neste caso estas regras de cbq devem ser aplicadas à máquina que está entre a internet e a rede interna, provavelmente onde é feito o nat (compartilhamento). Sua interface de rede interna é a eth1, e a externa é a eth0 (altere de acordo com as suas necessidades). 

Tivemos que criar duas classes para controlarmos tanto os pacotes saindo da máquina em questão quanto os que estão indo para ela.
  • DEVICE: é a interface a que esta classe é ligada. Repare que cada classe está ligada a uma interface, assim controlamos a entrada e a saída. Os números 100Mbit e 10Mbit são respectivamente a velocidade física da placa de rede (10 ou 100Mbit) e a velocidade física dividida por 10. 

    Exemplo: (DEVICE=eth??,100Mbit,10Mbit ou DEVICE=eth??,10Mbit,1Mbit) 

  • RATE: é a velocidade máxima que esta classe atinge, em bits. 

  • WEIGHT: valor colocado em RATE dividido por 10. 

  • PRIO: varia de 1 a 8, definindo a prioridade dada ao tráfego desta classe em relação às outras. Quanto maior o número, menor a prioridade. A documentação no script recomenda usar 5. 

  • RULE: indica para que classe IP a regra se aplica. Podemos especificar um único IP ou uma subrede. Cada classe pode ter várias RULES, dessa forma você pode colocar mais de uma estação para concorrer com os 32Kbit/s. 

    Na RULE também pode ser especificada a porta, usando dois pontos (para ssh por exemplo, basta colocar :22) depois do numero ip. (Ex.: 192.168.1.9/32:22). 

  • BOUNDED=yes/no: se setado para yes o usuário estará limitado mesmo que o link esteja com folga. 

  • ISOLATED=yes/no: se setado para yes indica que o cliente não poderá emprestar banda pra ninguém.

Outra coisa interessante que deve ser dada atenção é a vírgula depois do número IP na segunda classe (cbq-0002.estacao9-out). Isto significa que o shapper (limitador) é de saída. 

Maiores informações poderão ser encontradas no próprio script /sbin/cbq, que possui dicas e exemplos de configuração. Não deixe de conferir. 

OBS: Quando adicionar novas regras, execute o comando abaixo para ativá-las: 

# cbq compile 

Espero ter sido útil e gostaria de deixar meus agradecimentos a todas as matérias sobre controle de banda nos sites abaixo, que foram fonte de inspiração da maior parte do conteúdo deste artigo:


Lacier Dias - MT
ICQ: 78954474 

 

Fonte: http://www.vivaolinux.com.br/artigo/Controle-sua-banda-de-maneira-simples-e-inteligente-com-CBQ

.