Pular para o conteúdo
Início » Controle de Tráfego no Linux com o Comando tc (Traffic Control)

Controle de Tráfego no Linux com o Comando tc (Traffic Control)

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:

  1. Filas (queues): Determinam a forma como os pacotes são enfileirados para envio.
  2. Classes: Definem as regras para dividir a largura de banda entre diferentes tipos de tráfego.
  3. 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.