Controle de banda individual com shaper

Publicado por Denilson Martins (última atualização em 24/10/2014)

[ Hits: 4.707 ]

Homepage: www.compels.net

Download controleBanda.sh




Script para implementação de controle de banda utilizando o programa shaper, para derivados Debian.

  



Esconder código-fonte

#!/bin/bash

dir_controle=/etc/shaper
arq_dhcp=dhcpd.conf

faixa=192.168.50

menu() {
    clear
    echo "#########################################"
    echo "#         CONTROLE DE BANDA:            #"
    echo "# ------------------------------------- #"
    echo "#  1-> ADICIONAR CONTROLE A UM IP:      #"
    echo "#  2-> REMOVER CONTROLE DE UM IP:       #"
    echo "#  3-> LISTAR IPS CONTROLADOS:          #"
    echo "#  0-> APLICAR CONFIGURACOES:           #"
    echo "#  QUALQUER TECLA DIFERENTE PARA SAIR:  #"
    echo "# ------------------------------------- #"
    echo "#  DIGITE UMA OPCAO:                    #"
    echo "#########################################"
    read op
    case $op in
        1) adicionar ;;
        2) remover ;;
        3) listar ;;
        0) aplicar ;;
        *) exit ;;
    esac
}

#---------------------------CRIACAO DE ARQUIVOS---------------------------------
adicionar()
{
    clear
    echo "DIGITE O IP PARA SER ADICIONADO AO CONTROLE (Final do IP)."
    read ip
    echo "DIGITE A BANDA EM [kbps] (1Mbps = 128 KBps)."
    read banda
    bandabps=`expr $banda / 8`

    ls -las $dir_controle/*down | grep $faixa.$ip >> /dev/null

    if [ "$?" == '1' ] ; then
        nome_arquivo
        cria_down
        cria_up
        echo "CONTROLE AO IP [$faixa.$ip] COM [$bandabps]KBps ADICIONADO"
    else
        echo "IP [$faixa.$ip] JA CONTROLADO";
    fi
    echo "ENTER PARA VOLTAR AO MENU"
    read

    menu
}

nome_arquivo()
{

    if [ -e $dir_controle/cbq-0010-XXX.XXX.XXX.XXX-down ]; then
        echo "[OK]"
    else
        > $dir_controle/cbq-0010-XXX.XXX.XXX.XXX-down # Apaga o default
    fi

    ls $dir_controle/*down | awk -F "-" '{ print $2}' >> temp
    num=`tail -1 temp`
    rm -rf temp
    num=`expr $num + 1`
    num=`printf "%04d\n" $num` # completa zeros a esquerda
    arquivo_down=$dir_controle/cbq-$num-$faixa.$ip-down
    arquivo_up=$dir_controle/cbq-$num-$faixa.$ip-up
}

cria_down()
{
    echo "DEVICE=eth0,100Mbit,10Mbit" >> $arquivo_down
    echo "RATE="$banda"Kbit" >> $arquivo_down
    echo "WEIGHT="$bandabps"Kbit" >> $arquivo_down
    echo "PRIO=5" >> $arquivo_down
    echo "" >> $arquivo_down
    echo "RULE=$faixa.$ip" >> $arquivo_down
    echo "" >> $arquivo_down
    echo "BOUNDED=yes" >> $arquivo_down
    echo "ISOLATED=yes" >> $arquivo_down
}

cria_up()
{
    echo "DEVICE=eth0,100Mbit,10Mbit" >> $arquivo_up
    echo "RATE="$banda"Kbit" >> $arquivo_up
    echo "WEIGHT="$bandabps"Kbit" >> $arquivo_up
    echo "PRIO=5" >> $arquivo_up
    echo "" >> $arquivo_up
    echo "RULE="$faixa.$ip"," >> $arquivo_up
    echo "" >> $arquivo_up
    echo "BOUNDED=yes" >> $arquivo_up
    echo "ISOLATED=yes" >> $arquivo_up
}
#---------------------------CRIACAO DE ARQUIVOS---------------------------------

#---------------------------REMOCAO DE ARQUIVOS---------------------------------

remover()
{
    clear
    echo "DIGITE O IP QUE PODERA SER REMOVIDO DO CONTROLE"
    read ip
    remover_down=`ls $dir_controle/*down | grep $faixa.$ip`
    remover_up=`ls $dir_controle/*up | grep $faixa.$ip`

    if [ "$?" == '0' ] ; then

        echo "-------------------------------------------"
        echo "          CONTROLES ENCONTRADOS"
        echo "$remover_down"
        echo "$remover_up"
        echo "-------------------------------------------"
        echo "REMOVER CONTROLE DO IP [$faixa.$ip]? (s/n) "
        read resp
        if [ "$resp" == 's' ] ; then

            rm -rf $remover_down
            rm -rf $remover_up
            echo "CONTROLE DO IP [$faixa.$ip] FOI REMOVIDO!"
        else
            echo "CONTROLE DO IP [$faixa.$ip] NAO FOI REMOVIDO!"
        fi
    else
        echo "O IP [$faixa.$ip] NAO FOI ENCONTRADO!"
    fi
    echo "ENTER PARA VOLTAR AO MENU"
    read

    menu
}

#---------------------------REMOCAO DE ARQUIVOS---------------------------------



#---------------------------LISTAR DE ARQUIVOS---------------------------------

listar()
{
    if [ -e $dir_controle/cbq-0010-XXX.XXX.XXX.XXX-down ]; then
        rm -rf $dir_controle/cbq-0010-XXX.XXX.XXX.XXX-down # Apaga o default
    fi

    clear
    echo "LISTA DE USUARIOS COM CONTROLE DE BANDA ATIVADO"
    echo "-----------------------------------------------"
    ls $dir_controle/*down >> tmp

    while read tmp;
    do
        ip=`echo $tmp | awk -F "-" '{ print $3 }'`
        banda=`cat $tmp | grep WEI | awk -F "=" '{ print $2 }'`
        nome=`cat $arq_dhcp | grep $ip -B 2 | head -n 1 | awk '{ print $2 }'`
        mac=`cat $arq_dhcp | grep $ip -B 1 | head -n 1 | awk '{ print $3 }'`
        printf "Usuario -> $nome \t MAC -> $mac\n"
        printf "IP-> $ip\tBANDA -> $banda \n"
    done < tmp

    rm -rf tmp
    echo "-----------------------------------------------"
    echo "PRESSIONE ENTER PARA RETORNAR AO MENU"
    read
    menu
}

#---------------------------LISTAR DE ARQUIVOS---------------------------------

#---------------------------APLICAR CONFIGURACOES------------------------------
aplicar()
{

    echo "DESEJA APLICAR AS CONFIGURACOES? (s/n) "
    read resp
    if [ "$resp" == 's' ] ; then
        if [ -e $dir_controle/cbq-0010-XXX.XXX.XXX.XXX-down ]; then
            rm -rf $dir_controle/cbq-0010-XXX.XXX.XXX.XXX-down # Apaga o default
        fi

        echo "--------------------------"
        echo "APLICANDO NOVAS DEFINICOES"
        sleep 1
        /etc/init.d/shaper restart
        echo "--------------------------"
        echo "NOVAS DEFINICOES APLICADAS "
        echo "ENTER PARA RETORNAR MENU"
        read
        menu
    else
        echo "--------------------------"
        echo "ENTER PARA RETORNAR MENU"
        read
        menu
    fi
}
#---------------------------APLICAR CONFIGURACOES------------------------------
menu

Scripts recomendados

Removedor de arquivos vazios na pasta corrente

Script para monitorar memória do servidor

check_mem.sh - Plugin para o Nagios

Script para start,stop de .jar

Slackware-bashrc


  

Comentários
[1] Comentário enviado por drc em 24/10/2014 - 11:09h

Grande Denilson,
Uma dúvida, tenho um link de 10 megas, ao utilizar o shapper para controlar a banda para um determinado ip com 1 mega, ele irá reservar 1 mega do meu link principal disponibilizando 9 megas para o restante da rede ou irá simplesmente limitar o up/down em 1 mega?

[2] Comentário enviado por denilsoneskas em 24/10/2014 - 11:53h


[1] Comentário enviado por drc em 24/10/2014 - 11:09h:

Grande Denilson,
Uma dúvida, tenho um link de 10 megas, ao utilizar o shapper para controlar a banda para um determinado ip com 1 mega, ele irá reservar 1 mega do meu link principal disponibilizando 9 megas para o restante da rede ou irá simplesmente limitar o up/down em 1 mega?


Obrigado por comentar.

Eu criei este script para poder limitar a velocidade para os usuários de onde trabalho, em determinados momentos os usuários "sugavam" a banda disponível e impossibilitando acesso dos demais IPs. Pelo que pesquisei, o shaper limita toda comunicação entre o IP e quem estiver limitando a velocidade estabelecida, inclusive outros serviços como por exemplo o compartilhamento de arquivos. Então todos os pacotes que trafegarem entre o limitador e o IP não irá ultrapassar o limite estabelecido, pelo menos da forma em que fiz o script. Como o trafego entre o meu limitador e os IPs que limitei são praticamente só de Internet, fiz o controle de banda desta forma.

Portanto a resposta de sua pergunta é sim somente a limitação, lembrando que é limitada toda comunicação entre o limitador e o IP.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts