Skip to content


Controle de banda com TC e HTB

O Controle de Banda é uma tarefa muito simples de ser feita no Linux. Para realizá-la basta utilizar o tc.

Verta vez achei necessário fazer esse controle.
Após pesquisas na Internet, achei o site http://www.dicas-l.com.br/arquivo/qos_com_htb.php
Adaptei o meu script e o controle funcionou perfeitamente.

O script adaptado é:

#!/bin/bash
#########################################################
# AVISO:
#   Antes de fazer qualquer alteração nessas variáveis,
#   execute esse script com a opção stop
INT=eth2
TOTAL_DE_BANDA=3276kbps # ~= 400KBps    
BANDA_POR_IP="192.168.10.1 819kbps" # ~= 100KBps
#########################################################
case $1 in
    start)
        echo "Definindo que a interface trabalhará com o HTB ($INT)..."
        tc qdisc add dev $INT root handle 1: htb default 12
        echo "Criando as classes com seus respectivos limites de banda..."
        echo "Criando a classe mãe classid 1:1 com total de banda $TOTAL_DE_BANDA..."
        tc class add dev $INT parent 1: classid 1:1 htb rate $TOTAL_DE_BANDA ceil $TOTAL_DE_BANDA
        # Essas são as demais classes filhas...
        AUX_NUM=10
        while read IP BANDA;do
            echo "Liberando $BANDA para o IP: $IP..."
            tc class add dev $INT parent 1:1 classid 1:$AUX_NUM htb rate $BANDA ceil $TOTAL_DE_BANDA
            tc filter add dev $INT protocol ip parent 1:0 prio 1 u32 \
            match ip src $IP match ip dport 80 0xffff flowid 1:$AUX_NUM
            let AUX_NUM++
        done <<< "$BANDA_POR_IP"
        ;;
    stop)
        AUX_NUM=10
        while read IP BANDA;do
            echo "Removendo $BANDA para o IP: $IP..."
            tc filter del dev $INT protocol ip parent 1:0 prio 1 u32 \
            match ip src $IP match ip dport 80 0xffff flowid 1:$AUX_NUM &> /dev/null
            tc class  del dev $INT parent 1:1 classid 1:$AUX_NUM htb rate $BANDA ceil $TOTAL_DE_BANDA &> /dev/null
            let AUX_NUM++
        done <<< "$BANDA_POR_IP"
        echo "Removendo a classe mãe..."
        tc class del dev $INT parent 1: classid 1:1 htb rate $TOTAL_DE_BANDA ceil $TOTAL_DE_BANDA &> /dev/null
        echo "Removendo o HTB da interface $INT..."
        tc qdisc del dev $INT root handle 1: htb default 12 &> /dev/null
        ;;
    restart)
        $0 stop
        sleep 1
        echo
        $0 start
        ;;
    *)
        echo "Comando não reconhecido, utilize $0 [start|stop|restart]"
        ;;
esac

Podem utilizar a vontade, basta trocar as variáveis no início do script.

A variável BANDA_POR_IP pode receber vários valores, exemplo:

BANDA_POR_IP="192.168.10.1 300kbps
192.168.10.2 30kbps"

OBS:
Este script não aloca vários IPs na mesma classe, ele cria classes diferentes para cada um.

Postado em 🐧 GNU/Linux 🐧.


0 Respostas

Fique por dentro da conversa, assine o Feed deste post   em RSS.



Some HTML is OK

ou, responda este post através de um trackback.