Controle de Largura de Banda no Linux com tc: Guia de TBF e HTB

01 Introdução

1.1 Visão Geral

Este guia demonstra como utilizar o comando tc (Traffic Control) no Linux para controlar a largura de banda de rede através dos módulos TBF (Token Bucket Filter) e HTB (Hierarchical Token Bucket). Abordaremos limitações de upload, download, controle por endereço IP específico e restrição por porta de rede. Todos os exemplos utilizam a interface de rede eth0 como referência, sendo adequados para testes de desempenho ou simulação de condições de rede específicas.

1.2 Pré-requisitos

  • Privilégios: Todos os comandos tc devem ser executados com privilégios root (utilizando sudo).
  • Ferramentas: Certifique-se de que o pacote iproute2 está instalado (contém o comando tc). Para instruções de instalação, consulte o guia tc: Simulação de Anomalias de Rede (Network Emulation, netem) na seção Capítulo 2: Pré-requisitos.

02 Limitação de Upload com TBF

Comando:

sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

Funcionalidaed: Limita a largura de banda de saída (upload) da interface eth0 para 1Mbps, permitindo um burst de 32Kb e latência máxima de 400ms na fila. Ideal para cenários que exigem tráfego suavizado (como limitação de upload), permitindo breves aumentes de vazão.

Parâmetros explicados:

  • tbf: Filtro de Balde de Tokens (Token Bucket Filter), controla a taxa de envio de dados através de tokens. O sistema gera tokens em taxa fixa, cada token permite o envio de uma quantidade específica de dados. Pacotes sem tokens são atrasados ou descartados.
  • rate 1mbit: Limite de largura de banda média de 1Mbps.
  • burst 32kbit: Capacidade máxima do balde de tokens, permitindo tráfego de até 32Kb instantaneamente.
  • latency 400ms: Latência máxima de enfileiramento, excedendo este valor os pacotes são descartados. Valores menores de latency reduzem atraso mas podem aumentar perda de pacotes; valores maiores aumentam atraso mas melhoram o throughput.

Verificação

# Verificar regras
tc qdisc show dev eth0
# Testar largura de banda de upload (requere servidor externo com iperf)
iperf -c <ip_servidor>

Remoção de regras:

sudo tc qdisc del dev eth0 root

03 Limitação de Download com Módulo IFB

Comando:

# Carregar módulo ifb
sudo modprobe ifb
# Ativar interface virtual ifb0
sudo ip link set dev ifb0 up
# Redirecionar tráfego de entrada da eth0 para ifb0
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
# Limitar largura de banda de saída da ifb0 (equivalente ao download da eth0)
sudo tc qdisc add dev ifb0 root tbf rate 1mbit burst 20kbit latency 500ms

Funcionalidade: Utiliza o módulo IFB (Intermediate Functional Block) para limitar a largura de banda de entrada (download) da eth0 para 1Mbps, permitindo burst de 20Kb e latência máxima de 500ms. Útil para testar congestionamento de rede ou simular ambientes de download com baixa velocidade.

Parâmetros explicados:

  • ifb: Módulo de interface virtual que redireciona tráfego de entrada como tráfego de saída para fins de limitação.
  • ingress: Captura tráfego de entrada da eth0.
  • u32 match u32 0 0: Corresponde a todo o tráfego IP.
  • action mirred egress redirect dev ifb0: Redireciona tráfego de entrada para saída da ifb0.
  • tbf rate 1mbit burst 20kbit latency 500ms: Limita a largura de banda de saída da ifb0 para 1Mbps.

Verificação:

# Verificar se o módulo ifb está carregado
lsmod | grep ifb
# Verificar regras
tc qdisc show dev eth0
tc qdisc show dev ifb0
# Testar largura de banda de download
iperf -c <ip_servidor>

Remoção de regras:

sudo tc qdisc del dev eth0 ingress
sudo tc qdisc del dev ifb0 root
sudo ip link set dev ifb0 down

Observações:

  1. O tc não pode limitar diretamente o tráfego de entrada, sendo necessário utilizar IFB para converter o tráfego de download em tráfego de saída.
  2. Certifique-se de que o módulo ifb está carregado (modprobe ifb).
  3. A limitação é simulada (pode introduzir atrasos ou perda de pacotes), não sendo um controle físico da largura de banda.

04 Limitação por Endereço IP com HTB

Comando:

# Criar fila raiz HTB
sudo tc qdisc add dev eth0 root handle 1: htb default 10
# Adicionar classe pai (largura de banda total de 10Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
# Adicionar classe filha (limita IP alvo para 2Mbps, podendo emprestar até 3Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit ceil 3mbit
# Adicionar filtro (corresponde ao IP alvo 192.168.1.100)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10

Funcionalidade: Utiliza HTB (Hierarchical Token Bucket) para limitar a largura de banda de saída da eth0 para o endereço IP (192.168.1.100) em 2Mbps, permitindo empréstimo de banda até 3Mbps. Ideal para controle granular do tráfego de dispositivos ou IPs específicos.

Parâmetros explicados:

  • htb: Algoritmo de balde de tokens hierárquico, suporta alocação de banda em camadas.
  • handle 1: Identificador da fila raiz (manipulador principal é 1).
  • default 10: Tráfego não correspondente às regras entra na classe 1:10 por padrão.
  • classid 1:1: Identificador da classe pai, limitando largura de banda total em 10Mbps.
  • classid 1:10: Identificador da classe filha, limitando banda para o IP alvo.
  • rate 2mbit: Garantia de banda de 2Mbps.
  • ceil 3mbit: Permite empréstimo de banda até 3Mbps (quando a rede está ociosa).
  • u32 match ip dst 192.168.1.100: Corresponde ao tráfego com destino para 192.168.1.100.
  • flowid 1:10: Direciona o tráfego correspondente para a classe 1:10.

Verificação:

tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
iperf -c 192.168.1.100

Remoção de regras:

sudo tc qdisc del dev eth0 root

05 Limitação por Porta de Rede com HTB

Comando:

# Remover regras existentes
sudo tc qdisc del dev eth0 root
# Criar fila raiz HTB
sudo tc qdisc add dev eth0 root handle 1: htb default 20
# Criar classe pai (largura de banda total de 100Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
# Criar classe filha (limita porta HTTP 80 para 1Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
# Adicionar filtro (corresponde à porta de destino 80)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
# Adicionar classe filha padrão (outros tráfegos com 50Mbps, podendo emprestar até 100Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 50mbit ceil 100mbit

Funcionalidade: Utiliza HTB para limitar a largura de banda de saída da eth0 para a porta de destino (HTTP porta 80) em 1Mbps, com outros tráfegos garantidos em 50Mbps (podendo emprestar até 100Mbps). Recomendado para limitar serviços específicos (como serviços Web).

Parâmetros explicados:

  • htb default 20: Tráfego não correspondente às regras entra na classe 1:20.
  • classid 1:1: Classe pai, definindo largura de banda total de 100Mbps.
  • classid 1:10: Classe filha, limitando banda da porta 80 para 1Mbps.
  • classid 1:20: Classe filha padrão, garantindo 50Mbps para outros tráfegos.
  • match ip dport 80 0xffff: Corresponde à porta de destino 80 (máscara de 16 bits precisa).
  • protocol ip: Corresponde a tráfego IPv4 (para IPv6, usar protocol ipv6).

Verificação:

tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
curl http://<ip_servidor>

Remoção de regras:

sudo tc qdisc del dev eth0 root

Tags: tc iproute2 TBF HTB QoS

Publicado em 6-1 20:37 por Thomas