quarta-feira, 16 de janeiro de 2013

Controle de Banda com HTB-Tools


Pessoal hoje iremos ver uma ferramenta para controle de banda muito interessante chamada HTB-Tools, ela auxilia na configuração de um  algoritmo chamado HTB que significa Hierarchical Token Bucket, este algoritmo possui algumas vantagens em relação ao CBQ, como, velocidade, mais opções e ser mais robusto. Ele foi criado por Martin Devera e passou a ser incluído no kernel do Linux a partir do 2.4.20.
O HTB-Tools é uma ferramenta para controle e administração de banda, um software com vários recursos para auxiliar e simplificar o processo de alocação de banda, tráfego, download, upload, gerando e checando configurações para cada cliente isoladamente.
Bem vamos para a instalação:

Estamos utilizando o Debian Squeeze como lab, a interface eth0 é WAN (internet) e a eth1 é a LAN (rede local).

Iremos começar instalando as dependências necessárias:

# aptitude update
# aptitude install make flex-old dialog libncurses5-dev kernel-package gcc

Depois das dependências vamos levantar alguns módulos necessários:

# modprobe sch_htb
# modprobe sch_sfq
# modprobe cls_u32

Crie o diretório onde será copiado o manual:

# mkdir /usr/local/man/man8

Agora faça o download do HTB-tools para sua máquina.

# cd /opt


Após o download extraia os arquivos:

# tar –xvzf HTB-tools-0.3.0a.tar.gz -C /usr/local

# cd /usr/local/HTB-tools-0.3.0a

# mkdir include/asm

# cd include/asm

Agora baixe a biblioteca bitops.h para o diretorio criado:


Volte para a raiz do HTB-Tools:

# cd /usr/local/HTB-Tools-0.3.0a

Agora podemos instalar a ferramenta sem nenhum problema:

# make
# make full

Nesse momento você sera questionado onde será o diretório de execução do serviço, responda:

/etc/init.d/

Depois você será questionado sobre o diretório onde as paginas web serão armazenadas, responda:

/var/www/  ou outro diretório a sua escolha.

Pronto o HTB-Tools já esta instalado e pronto para ser utilizado.

Agora vá para os arquivos de configuração do htb-tools:

# cd /etc/htb

Aqui você vai encontrar os arquivos eth0-qos.cfg e eth1-qos.cfg, eles correspondem respectivamente as interfaces de rede eth0 e eth1. Os arquivos de configuração são organizados em classes, cada classe pode ter uma sub-classe que são os clientes, a classe principal é referente a banda total, todas as sub-classes podem compartilhar banda entre elas, mas se existir mais de uma classe principal elas não poderão compartilhar a banda.

Neste artigo iremos realizar a demonstração das regras comas classes abaixo:

Zezinho – Terá o limite de banda de 256 kbps – 10.0.0.10
Ana – Terá o limite de banda de  512 kbps – 10.0.0.11
João – Terá o limite de banda de 1024 kbps – 10.0.0.12
Marina – Terá o limite de banda de 1024 kbps – 10.0.0.13
O restante do trafego da Rede que não se enquadrar nas regras acima irão ter uma banda de 2048 kbps (2 Mb) lembrando que a banda total é de 5120 kbps (5 Mb).

Iremos configurar o arquivo contido em /etc/htb, como a interface eth1 é a nossa conexão com a rede local iremos alterar o arquivo eth1-qos.cfg para configurar o controle de download. Iremos criar uma copia do arquivo original e começar um novo.

# mv eth1-qos.cfg   eth1-qos.cfg.old

# pico eth1-qos.cfg

################
# eth1-qos.cfg #
################
# for how to configure and use see docs/HowTo/

class guia_do_ti {            # Nome da classe principal
      bandwidth 5120;       # Largura da banda garantida, nesse caso a total
      limit 5120;                     # O máximo de banda que a classe podera utilizar
      burst 2;                          # Numer máximo em Kbit que uma classe pode enviar por vez
      priority 1;                      # Nivel de prioridade, são elas de 0 a 7, onde 0 é a maior

               client zezinho {                 # Nome da Sub-Classe
                  bandwidth 256;             # Largura da banda garantida (banda mínima)
                  limit 300;                           # O máximo de banda que a classe poderá utilizar
                  burst 2;
                  priority 1;
                     dst {                 # Destino do tráfego  (Download)
                        10.0.0.10/32;             # endereço ip do cliente e mascara
                           };
                 };

               client ana {
                  bandwidth 480;
                  limit 512;
                  burst 2;
                  priority 1;
                     dst {
                        10.0.0.11/32;
                           };

               client joao {
                  bandwidth 480;
                  limit 512;
                  burst 2;
                  priority 1;
                     dst {
                        10.0.0.12/32;
                           };
                 };

               client marina {
                  bandwidth 1024;
                  limit 1024;
                  burst 2;
                  priority 1;
                     dst {
                        10.0.0.13/32;
                           };
                 };

               client rede_local {
                  bandwidth 2048;
                  limit 4096;
                  burst 2;
                  priority 1;
                     dst {
                        10.0.0.0/24;               # Faixa de endereços da rede (254 ips)
                           };
                 };


      };

class default { bandwidth 8; };   # Classe padrão para o trafego que não se encaixar nas classes acima.

Obs: Respeitem a indentação

Depois execute o comando abaixo para testar o arquivo:

# q_checkcfg /etc/htb/eth1-qos.cfg

Se ocorrer tudo bem ate aqui rode o comando abaixo para iniciar o HTB-Tools:

# htb eth1 start

Ou

# /etc/init.d/rc.htb start_eth1

Existem outros parâmetros que podem ser usados no HTB-TOOLS. No nosso exemplo, fizemos o controle do download (dst = destination). Para controlar o upload utiliza-se src (source) no lugar do dst. Se quiser controlar uma porta específica, basta incluir o número da porta logo após o IP da rede/host. (Ex.:para a porta 80 ==> 10.0.0.0/24 80).

Agora é só testar o controle em algum cliente da rede, vocês podem fazer os testes usando o http://speedtest.copel.net/ e baixando arquivos da internet e acompanhar a taxa de transferência, lembrando que a taxa de transferência é 10% do limite que você declarar.

Para acompanhar o consumo de trafego em tempo real utilize:

# /etc/init.d/rc.htb show_eth1

Para mais informações:

# /etc/init.d/rc.htb --help

Ou leia o manual:

# pico /usr/local/HTB-tools-0.3.0a/docs/HowTo/HTB-tools-howto.txt

Pessoal é isso ai, espero que tenham gostado, até a próxima.

13 comentários:

  1. Olá amigo, muito bom o seu tutorial, segui mas não consegui fazer o controle do upload. Teria como me dar uma ajuda. Coloquei aqui neste site mais detalhes, mas sem resposta por eqto.
    http://www.vivaolinux.com.br/topico/provedores/HTB-Nao-controla-UPLOAD

    ResponderExcluir
  2. Amigo posta ai seu qos.cfg das placas de rede pra gente dar uma olhada.

    ResponderExcluir
  3. Opa, desculpe a demora,

    INICIO ETH1
    # Beginning of the script
    class Intranet { bandwidth 100000; limit 100000; burst 0; priority 0; que sfq;
    client redeinterna-src { bandwidth 100000; limit 100000; burst 0; upload 100000; priority 1; dst { 10.0.0.0/24 20 21 22 138 139; }; };
    client redeinterna-dst { bandwidth 100000; limit 100000; burst 0; upload 100000; priority 1; dst { 10.0.0.0/24 20 21 22 138 139; }; };
    };

    class RedeGERAL {
    bandwidth 10204;
    limit 111000;
    burst 2;
    priority 2;

    client IP1-Bandeira-NOT {bandwidth 3000;limit 5000;burst 1;priority 1;dst {10.0.0.1/32;};};
    client IP2 {bandwidth 300;limit 500;burst 1;priority 2;dst {10.0.0.2/32;};};
    client IP3 {bandwidth 300;limit 500;burst 1;priority 2;dst {10.0.0.3/32;};};
    client IP4 {bandwidth 300;limit 500;burst 1;priority 2;dst {10.0.0.4/32;};};
    client IP5-IASD-Comunicacao {bandwidth 500;limit 8500;burst 1;priority 5;dst {10.0.0.5/32;};};
    client IP6 {bandwidth 55500;limit 55500;burst 1;priority 2;dst {10.0.0.6/32;};};
    client IP7-iDeo {bandwidth 300;limit 500;burst 1;priority 2;dst {10.0.0.7/32;};};
    client IP8-IASD-Secretaria {bandwidth 3000;limit 8500;burst 1;priority 1;dst {10.0.0.8/32;};};
    client IP9 {bandwidth 300;limit 500;burst 1;priority 2;dst {10.0.0.9/32;};};
    client IP10-Colibri-PC {bandwidth 1000;limit 5500;burst 1;priority 2;dst {10.0.0.10/32;};};
    [...]
    client IP50 {bandwidth 300;limit 500;burst 1;priority 2;dst {10.0.0.50/32;};};
    };

    class default { bandwidth 111; };

    # Thank you for using this script
    # End of the script
    FIM ETH1
    ---------------

    INICIO ETH2

    # Beginning of the script
    class Intranet { bandwidth 100000; limit 100000; burst 0; priority 0; que sfq;
    client redeinterna-dst { bandwidth 100000; limit 100000; burst 0; upload 100000; priority 1; dst { 10.10.10.0/24 20 21 22 138 139; }; };
    client redeinterna-dst { bandwidth 100000; limit 100000; burst 0; upload 100000; priority 1; dst { 10.10.10.0/24 20 21 22 138 139; }; };
    };


    # Beginning of the script
    class Rede_SOM {
    bandwidth 10204;
    limit 50000;
    burst 1;
    priority 1;

    client IP51-iDeo {bandwidth 100;limit 500;burst 1;priority 1;dst {10.10.10.51/32;};};
    client IP52-Bandeira-WiFi {bandwidth 1000;limit 8500;burst 1;priority 1;dst {10.10.10.52/32;};};
    client IP53 {bandwidth 100;limit 500;burst 1;priority 1;dst {10.10.10.53/32;};};
    client IP54 {bandwidth 100;limit 500;burst 1;priority 1;dst {10.10.10.54/32;};};
    client IP55 {bandwidth 100;limit 500;burst 1;priority 1;dst {10.10.10.55/32;};};
    client IP56 {bandwidth 100;limit 500;burst 1;priority 1;dst {10.10.10.56/32;};};
    [...]
    client IP99 {bandwidth 100;limit 500;burst 1;priority 1;dst {10.10.10.99/32;};};
    };

    class default { bandwidth 300; };

    # Thank you for using this script
    # End of the scripT
    FIM ETH2;


    No eth0 não escrevi nem ativei nada, seria esse o problema?
    ----

    Mais uma vez obrigado!

    ResponderExcluir
  4. Amigo me desculpe a demora, estou com o tempo meio curto esse mes, mas vamos lá, confesso que só hoje consegui parar para ver com calma seu problema, eu fiquei com uma dúvida, voce disse la no vol que precisaria fazer transmissão ao vivo para a internet e por isso iria precisar limitar o up, até ai tudo bem, o que não entendi direito foi a sua eth1 (rede de transmissão), se voce vai fazer up pra internet porque esta utilizando essa interface? não era melhor voce utilizar sua eth0 que é sua interface WAN? o que voce precisa upar esta em uma faixa de rede diferente, por isso voceesta utilizando outra interface é isso? me explica melhor o porque dessa eth1 pra eu tentar te ajudar. Mais uma vez desculpa pela demora.

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Sem problemas, eu tb, to quebrando cabeça com esse trem. Sobre a identação ocorre algo estranho eu tabulei os campos bem direitinho, mas na hora q colava no VOL ficava tudo alinha a esquerda, ae eu entrava para fazer a edição e aparecia a identação normalzinha, que coisa....

      Respondendo a sua pergunta, nao criei regra nenhuma no eth0, por imaginar (de forma errada provalvemente) que não funcionaria configurar a faixa 10.10.10.X da eth1 na eth0 (sendo que esta usa o ip 192.168.0.254, no forum la consta 8.0.0.254, mas vi esta faixa não era recomendada para rede local).

      O servidor tem 3 placas ao todo,
      eth0 - wan
      eth1 - rede para um segundo prédio, que funcionam departamentos com tudo diferentes do meu.
      eth2 - rede que transmitirá


      eth0 - 192.168.0.254
      eth1 - 10.0.0.254
      eth2 - 10.10.10.254

      O que eu gostaria na realidade era de criar uma regra específica que liberasse a velocidade de upload para 3 maquinas na rede da placa eth2, e limitasse todo o restante para 25kbps.

      Obs: não sei se é importante mencionar mas a rede eth1 e eth2 praticamente não usarão a banda ao mesmo tempo.

      Se eu criar o eth0-qos.cfg com o o src 10.10.10.51 por exemplo vai limitar o upload?

      Mais uma vez obrigado.

      Excluir
    3. relendo a sua pergunta do pq limitar na eth1, na verdade o computador em questão é um servidor squid, e vou utilizar um outro computador, 10.10.10.51 (por exemplo) para transmitir. E a rede continuará recebendo acessos de outras máquinas, smartphones,

      Excluir
  5. Haaaa outra coisa tenta organizar um pouco seu arquivo, ele ta meio bagunçado, tenta identar ele como fiz no exemplo do post. Assim fica melhor quando outras pessoas precisam ver seu conf.

    ResponderExcluir
  6. Amigo o que vc precisa fazer para limitar o upload é fazer as regras no seu gateway, ou seja na saida da sua rede, e nele vc vai fazer a configuração na interface que tem a conexão com a internet, no seu caso a eth0, dai vc vai configurar para dar prioridade para as maquinas da rede que vc quer e deixar uma taxa para o restante desse rede e para a outra rede, mas acho que deixar só 25 kbps para o resto todo vai ficar meio complicado, mas é melhor vc fazer os testes e ver como a conexão vai ser comportar, qqr coisa me adiciona no gtalk que a gente bate um papo.

    ResponderExcluir
    Respostas
    1. Blz, já me deu uma luz, mas confesso que não sei como fazer, pois já tentei escrever a configuração similar a da eth2, só modificando de dst para src, mas não funciona. Ativo o eth0 e todo o trafego é direcionado pra o default, já adicionei no gtalk, qdo der a gente conversa e faz o teste do upload. Eu falei de 25kbps, mas como tem 1mbps posso colocar mais, de repente uns 200kbps, pra o default e os 800k, pros pcs que fazem a transmissão...

      Excluir
  7. Na eth0(192.168.0.254), como limitar a faixa de ip da rede eth1 (10.0.0.x) e eth2(10.10.10.x)? Tenho visto http://tutolivre.net/br/htb-tools-exemplos-pr%C3%A1ticos-de-configura%C3%A7%C3%A3o este tutorial, mas nao serviu muito... sinceramente não sei por que não funciona adicionando a linha upload no eth2-qos.cfg! Mais uma vez obrigado pela ajuda.

    ResponderExcluir
  8. Bom dia! teria como mostrar como dou prioridade para o protocolo SIP na rede.

    ResponderExcluir
  9. Tem como configurar para usar o Mac Address ?

    ResponderExcluir