Originalmente publicado em http://wasare.net em 12/08/2006 e na SlackwareZine Nº 9
1. Introdução
O HTB (Hierarchical Token Bucket) é uma boa alternativa em substituição ao CBQ (Class Based Queueing) pois este é mais preciso e fácil de utilizar (será? Para mim foi). A diferença para o CBQ é que ele aloca banda para uma ou mais classes ("links virtuais") e toma emprestada temporariamente a banda de outra classe que não esteja sendo utilizada completamente. Ainda diferentemente do CBQ você pode alocar diversos clientes em uma mesma classe. Para utilizar o HTB você precisa de um kernel maior ou igual 2.4.20 e da ferramenta tc (Traffic Control) incluída no pacote iproute2 sendo requerido o pacote iproute2 >= 2.6.10-ss050124. Eu utilizei apenas o Slackware 10.2 (kernel 2.4.31 ou kernel 2.6.13) com o pacote iproute2-2.6.11_050330 (série n do slackware) instalado. Para configurarmos o HTB temos basicamente três alternativas:- Criar um script com todos os comandos (se você souber quais é claro);
- Utilizar o utilitário htb.init script semelhante ao cbq.init e que demanda uma série de configurações, bem familiar para quem já utiliza o CBQ; ou
- Utilizar a ferramenta HTB Tools. Como eu quero simplificar e não tenho experiência com o CBQ optei pelo HTB Tools criada dentro da filosofia do Slackware.
Para completar a instalação, execute os seguintes comandos:root@ice:~# cd HTB-tools-0.2.7 ; make ; make install
Acima copiamos os arquivos de configuração de exemplo para as interfaces eth0 e eth1 e o script de inicialização rc.htb. Para o formato .tgz , execute apenas:root@ice:~/HTB-tools-0.2.7# mkdir -p /etc/htbroot@ice:~/HTB-tools-0.2.7# cp sys/scripts/rc.htb /etc/rc.d/rc.htbroot@ice:~/HTB-tools-0.2.7# cp sys/cfg/eth0-qos.cfg /etc/htb/eth0-qos.cfgroot@ice:~/HTB-tools-0.2.7# cp sys/cfg/eth1-qos.cfg /etc/htb/eth1-qos.cfg
root@ice:~# installpkg HTB-tools-0.2.7-i486-1wsa.tgz
3. Configuração
Instalado o HTB Tools seu Slackware terá os executáveis:- q_parser - lê o arquivo de configuração onde os clientes, as classes, e a banda alocada é definida e gera um script conforme as configurações estabelecidas;
- q_show - exibe em tempo real a banda usada/alocada para cada classe/cliente de acordo com a configuração;
- q_checkcfg - verifica a sintaxe do arquivo de configuração;
- htb - script que executa rotinas com os binários q_show, q_parser, q_checkcfg;
- htbgen - utilitário para gerar arquivos de configuração para redes classes C.
class Wireless {
bandwidth 480;
limit 512;
burst 2;
priority 1;
client cliente_1 {
bandwidth 192;
limit 256;
burst 2;
priority 1;
src { 192.168.1.2/24; };
dst { 192.168.1.2/24; };
};
client cliente_2 {
bandwidth 192;
limit 256;
burst 2;
priority 1;
src { 192.168.2.2/24; };
dst { 192.168.2.2/24; };
};
};
class default { bandwidth 8; };
Como podemos observar a configuração é auto explicativa. Mas para não deixar dúvidas podemos observar que o src, como devemos suspeitar, é o source ou seja a origem do tráfego, por tando estamos limitando a saída (upload). No caso da diretiva dst controlamos o destino ou seja a entrada (download). A estrutura básica pode ser resumida em uma classe principal que é subdividida dentro de outras classes secundárias. Quando existe mais de uma classe principal estas não compartilham banda entre elas. As classes secundárias (clientes) podem compartilhar banda entre elas de acordo com a configuração (limit maior). Cada classe principal possue uma ou mais classes secundárias (clientes). A classe especial default especifica uma banda para os outros clientes/tráfegos que não estejam contemplados na configuração. A taxa de transferência e dada em kbit por segundo(kpbs).
Para controlar o download/upload na eth1 basta criar um arquivo semelhante ao /etc/htb/eth0-qos.cfg em /etc/htb/eth1-qos.cfg supondo que a sua interface eth1 seja da outra LAN ou a própria WAN. Em /etc/htb/eth1-qos.cfg crie a classe principal e as classes clientes conforme as necessidades.
Em configurações mais complexas você pode especificar diversos IP's ou redes (rede/máscara) dentro de uma mesma classe secundária entre as chaves do src ou dst, sempre um(a) por linha e finalizado por um ponto-e-vírgula. Agora caso você queira limitar a banda para um serviço específico por exemplo ftp ou http dê um espaço e coloque a porta do serviço (em src ou dst), assim :
...
dst {
192.168.3.0/24 21;
192.168.4.0/24 80;
};
...
Atenção: cuidado ao criar as classes pois estará limitando todo o tráfego para aquele cliente/ip para todos os protocolos. Combine várias classes e configurações até chegar ao controle ideal.
Antes de ativar o controle de banda é recomendável verificar a sintaxe da configuração:
root@ice:~# q_checkcfg /etc/htb/eth0-qos.cfgroot@ice:~# q_checkcfg /etc/htb/eth1-qos.cfg
4. Ativando o HTB
Para facilitar as coisas tornamos o rc.htb executável:Com este script não precisamos executar diretamente os binários do HTB Tools. Para ativarmos o htb para a eth0 executarmos dentro de /etc/rc.d:root@ice:~# chmod +x /etc/rc.d/rc.htb
Faça o mesmo para eth1 obviamente fazendo a substituição necessária de eth0 por eth1. Caso possua mais de duas interfaces altere o rc.htb de acordo com suas necessidades. Estando tudo correto vamos cuidar para que o HTB seja ativado a cada boot, acrescentando os comandos acima no rc.local ou em outro script de inicialização de sua preferência. Exemplo:root@ice:/etc/rc.d# ./rc.htb start_eth0
root@ice:/etc/rc.d# echo "/etc/rc.d/rc.htb start_eth0" >> /etc/rc.d/rc.local root@ice:/etc/rc.d# echo "/etc/rc.d/rc.htb start_eth1" >> /etc/rc.d/rc.local
5. Monitorando o Controle de Banda
Iniciado o HTB, você pode monitorar o uso do link em tempo real, para monitorar individualmente cada cliente fazendo upload ou download, respectivamente, execute:Dê uma olha no pacote HTB Tools e você ainda poderá lançar mão do utilitário htbgen para gerar o arquivo de configuração via assistente e terá uma forma de monitorar a utilização da banda pela web (q_show.php). É mole ou que mais! Espero que consigam descomplicar o controle de banda com HTB Tools assim como eu consegui.root@ice:/etc/rc.d# ./rc.htb show_eth0root@ice:/etc/rc.d# ./rc.htb show_eth1
Undefined
