O tc (Traffic Control) é uma ferramenta poderosa para o gerenciamento de tráfego de rede no Linux. Ele faz parte da suíte de utilitários do iproute2 e permite configurar regras para controle de banda, atraso, perda de pacotes e outros aspectos de tráfego em interfaces de rede. Isso é particularmente útil em ambientes onde se deseja gerenciar a qualidade de serviço (QoS), garantir largura de banda mínima para determinados serviços ou simular condições de rede instáveis para testes.
Conceitos Básicos do tc
O tc utiliza uma estrutura hierárquica para o controle de tráfego, que consiste principalmente em três elementos:
- Filas (queues): Determinam a forma como os pacotes são enfileirados para envio.
- Classes: Definem as regras para dividir a largura de banda entre diferentes tipos de tráfego.
- Filtros: Aplicam critérios para classificar pacotes em filas ou classes específicas.
Além disso, o tc trabalha com qdiscs (disciplinas de enfileiramento), que são as principais ferramentas usadas para controlar como os pacotes são organizados e transmitidos.
Principais Disciplinas de Enfileiramento (qdiscs)
- pfifo_fast: Padrão no Linux, é um enfileiramento FIFO com priorização de pacotes. Geralmente, é utilizado quando não há necessidade de controle de tráfego.
- tbf (Token Bucket Filter): Controla a largura de banda máxima para uma interface. Ele permite que uma certa quantidade de dados seja transmitida instantaneamente, mas depois limita o tráfego à taxa configurada.
- htb (Hierarchical Token Bucket): Permite compartilhar largura de banda entre diferentes classes e suporta prioridades.
- netem: Usada para emular condições adversas de rede, como atraso, perda e duplicação de pacotes.
Agora que temos uma visão geral, vamos passar para exemplos práticos de como utilizar o tc.
Exemplos Práticos de Uso do tc
1. Limitando a Largura de Banda com o tbf
O exemplo a seguir demonstra como limitar a largura de banda de uma interface de rede utilizando o Token Bucket Filter (tbf).
Comando:
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
Explicação:
- dev eth0: Especifica a interface de rede (substitua por sua interface de rede).
- root: Define a regra na raiz da hierarquia da interface.
- tbf: Utiliza a disciplina de enfileiramento Token Bucket Filter.
- rate 1mbit: Limita a taxa de transmissão a 1 megabit por segundo.
- burst 32kbit: Permite que um burst (explosão) de 32 kilobits seja transmitido de forma instantânea.
- latency 400ms: Define uma latência máxima permitida de 400ms.
Resultado:
Após executar o comando, a largura de banda da interface eth0 será limitada a 1 Mbps, com uma latência configurada de até 400ms. Isso pode ser verificado com o comando iperf ou nload para medir a taxa de transferência.
2. Introduzindo Atraso Artificial com o netem
O netem é uma ferramenta muito útil para testar aplicações em condições de rede instáveis. Neste exemplo, adicionaremos um atraso de 100ms ao tráfego da interface de rede.
Comando:
sudo tc qdisc add dev eth0 root netem delay 100ms
Explicação:
- netem delay 100ms: Adiciona um atraso de 100ms a todos os pacotes que passam pela interface eth0.
Resultado:
Todos os pacotes que entram ou saem da interface eth0 terão um atraso artificial de 100ms. Isso é útil para simular latência em redes com alto RTT (Round-Trip Time).
3. Simulando Perda de Pacotes
Outra funcionalidade do netem é a capacidade de simular perda de pacotes. Isso pode ser útil para verificar como aplicações se comportam sob condições de rede adversas.
Comando:
sudo tc qdisc add dev eth0 root netem loss 5%
Explicação:
- netem loss 5%: Simula uma perda de 5% dos pacotes na interface eth0.
Resultado:
Neste cenário, 5% dos pacotes que trafegam pela interface serão descartados. Isso é frequentemente usado em testes de robustez de aplicativos de rede.
4. Criando Classes com o htb para Compartilhamento de Largura de Banda
Neste exemplo, vamos usar o htb para criar duas classes de tráfego, onde a primeira classe terá 70% da largura de banda e a segunda terá 30%. Esse tipo de configuração pode ser usado para garantir que um serviço crítico (como VoIP ou streaming) sempre tenha largura de banda garantida.
Comandos:
# Adicionar a qdisc HTB na raiz
sudo tc qdisc add dev eth0 root handle 1: htb default 10
# Criar uma classe pai com 1 Mbps de largura de banda
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
# Criar duas classes filhas com alocação de 70% e 30%
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 700kbit
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300kbit
# Aplicar filtros para direcionar o tráfego para as classes
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 443 0xffff flowid 1:20
Explicação:
- classid 1:10 e 1:20: Define duas classes para tráfego HTTP (porta 80) e HTTPS (porta 443), com 700 kbps e 300 kbps de largura de banda, respectivamente.
- u32 match ip dport: Filtros que definem qual tráfego vai para cada classe com base nas portas de destino.
Resultado:
Neste cenário, todo o tráfego HTTP será limitado a 700 kbps e o tráfego HTTPS a 300 kbps, garantindo que os dois tipos de tráfego não consumam mais do que a largura de banda alocada.
5. Removendo as Regras de Controle de Tráfego
Se você quiser remover todas as regras de controle de tráfego de uma interface, o seguinte comando será útil:
Comando:
sudo tc qdisc del dev eth0 root
Explicação:
Este comando remove todas as regras configuradas no root qdisc da interface eth0, restaurando o comportamento padrão de enfileiramento FIFO (pfifo_fast).
O comando tc é uma ferramenta extremamente poderosa e flexível para gerenciar o tráfego de rede no Linux. Ele permite desde simples limitações de largura de banda até a emulação de redes com alta latência e perda de pacotes. A utilização correta do tc pode ser vital em diversos cenários, como otimização de desempenho, simulação de condições de rede e garantia de QoS.
Ao dominar o tc, administradores de sistemas e engenheiros de rede podem ter controle granular sobre como os dados fluem em suas infraestruturas, garantindo um desempenho adequado para os serviços mais críticos.
Sou um profissional na área de Tecnologia da informação, especializado em monitoramento de ambientes, Sysadmin e na cultura DevOps. Possuo certificações de Segurança, AWS e Zabbix.