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:
- 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.
- Certifique-se de que o módulo ifb está carregado (modprobe ifb).
- 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