Dia 27: Bridging e Bonding no Linux — bridge, bond e team

1. Introdução ao Bridging e Bonding

No Dia 1 do curso vimos o modelo OSI e o conceito de camada 2 (ligação de dados). Hoje aprofundamos essa camada com três tecnologias fundamentais em Linux para gestão de interfaces de rede: bridging, bonding e teaming. Estas técnicas permitem criar infra-estruturas de rede mais flexíveis, redundantes e de elevado desempenho.

O bridging funciona como um switch virtual em software — liga duas ou mais interfaces de rede na mesma rede lógica, permitindo que dispositivos em segmentos físicos diferentes comuniquem como se estivessem no mesmo domínio de difusão. É essencial em virtualização (KVM, LXC), onde as máquinas virtuais precisam de acesso directo à rede física.

O bonding agrega duas ou mais interfaces físicas numa única interface lógica, oferecendo redundáncia (se um cabo falha, o outro mantém a ligação) e, em alguns modos, aumento de largura de banda. O teaming é uma alternativa moderna ao bonding, com arquitectura modular e melhor desempenho em sistemas multi-core.

No Dia 16 abordámos VLANs, que operam igualmente na camada 2. Bridging e bonding são complementares: é possível criar um bond e depois colocá-lo como porta de uma bridge, combinando redundáncia e segmentação.

Tecnologia Função principal Caso de uso típico
Bridge Switch virtual L2 Virtualização (KVM, LXC)
Bond Agregação de links Redundância de NICs
Team Alternativa moderna ao bond Servidores multi-core

2. Bridging — Switch Virtual em Linux

Uma bridge Linux opera como um switch de camada 2. Aprende endereços MAC das interfaces conectadas e encaminha tráfego entre elas com base nessa tabela. Ao contrário do encaminhamento, não modifica o cabeçalho Ethernet — os pacotes atravessam a bridge de forma transparente.

O comando ip link add … type bridge cria a bridge, e ip link set … master br0 adiciona interfaces como portas. É necessário que o módulo bridge esteja carregado no kernel (normalmente já está em distribuições modernas).

# Criar bridge br0
ip link add name br0 type bridge
# Adicionar interfaces como portas
ip link set eth0 master br0
ip link set eth1 master br0
# Activar bridge e atribuir IP
ip link set br0 up
ip addr add 192.168.1.10/24 dev br0
# Verificar bridge
bridge link show
bridge fdb show br0

O comando bridge link show lista as portas da bridge e o seu estado, enquanto bridge fdb show mostra a tabela de encaminhamento (endereços MAC aprendidos). Esta tabela é dinâmica — entradas expiram após 300 segundos por defeito.

Em ambientes de virtualização, a bridge é o elemento central: as interfaces virtuais (vnet0, vnet1) são adicionadas como portas da bridge, e as VMs obtêm endereços directamente do DHCP da rede física, sem NAT.

STP — Spanning Tree Protocol

A bridge Linux suporta STP (Spanning Tree Protocol) para evitar loops em topologias redundantes. Por defeito, STP está activo quando se cria uma bridge. Para verificar o estado, use bridge link show — procure o campo root_id e bridge_id. Para desactivar STP (apenas em ambientes controlados sem loops): ip link set br0 type bridge stp_state 0.

O bonding combina múltiplas interfaces de rede numa só. A interface resultante (bond0) apresenta um único endereço MAC e IP, e o kernel distribui o tráfego pelas interfaces físicas subordinadas conforme o modo seleccionado. Isto oferece dois benefícios: redundância (tolerância a falhas de cabo/NIC) e aumento de largura de banda (em modos que suportam agregação).

O bonding requer o módulo bonding no kernel. A configuração manual com iproute2 é directa: cria-se a interface bond, definem-se as interfaces físicas como subordinadas e activa-se.

# Criar bond0 em modo 802.3ad (LACP)
ip link add bond0 type bond mode 802.3ad
# Adicionar interfaces físicas
ip link set eth0 master bond0
ip link set eth1 master bond0
# Activar bond e atribuir IP
ip link set bond0 up
ip addr add 192.168.1.10/24 dev bond0
# Verificar estado do bonding
cat /proc/net/bonding/bond0

O ficheiro /proc/net/bonding/bond0 é a fonte de verdade para diagnosticar bonding. Mostra o modo activo, interfaces subordinadas, estado de cada uma (up/down), estatísticas de pacotes e eventos de failover. Em caso de problema, é sempre o primeiro comando a executar.

ℹ Redundância sem switch gerido

O bonding active-backup dá redundância sem necessidade de configuração no switch — ideal para PME sem switches geridos.

4. Modos de Bonding

O bonding suporta sete modos de operação, cada um com requisitos e comportamentos distintos. A escolha do modo correcto depende do hardware disponível (especialmente das capacidades do switch) e dos objectivos: redundância, largura de banda ou ambos.

Modo Nome Switch requerido Largura de banda
0 balance-rr Não (padrão) Soma de todas as NICs
1 active-backup Não 1 NIC
2 balance-xor Não (padrão) Soma de todas as NICs
3 broadcast Não (padrão) 1 NIC (tudo em todas)
4 802.3ad (LACP) Sim (LACP) Soma de todas as NICs
5 balance-tlb Não Soma (saída)
6 balance-alb Não Soma (saída + entrada)

Modos mais utilizados

active-backup (modo 1) é o mais simples e robusto: apenas uma interface está activa de cada vez. Se falha, a outra assume imediatamente. Não requer configuração no switch, o que o torna ideal para ambientes sem switches geridos. A desvantagem é que só se usa uma NIC de cada vez — sem aumento de largura de banda.

802.3ad LACP (modo 4) é o padrão IEEE para agregação de links. Requer que o switch suporte e esteja configurado para LACP. Oferece verdadeiro aumento de largura de banda (soma das NICs) e redundância. É o modo recomendado em centros de dados e ambientes empresariais com switches geridos.

balance-rr (modo 0) round-robin distribui pacotes sequencialmente pelas NICs. Aumenta a largura de banda mas pode causar reordenação de pacotes (fora de ordem), o que afecta o desempenho de TCP em alguns casos. Não requer configuração no switch mas nem todos os switches toleram este comportamento.

⚠ LACP requer configuração no switch

O modo 802.3ad (LACP) requer configuração no switch — se o switch não suportar LACP, o bonding não funciona correctamente.

A documentação oficial do kernel Linux descreve todos os modos em detalhe: kernel.org — bonding.txt. É a referência autoritativa para parâmetros avançados como miimon (frequência de monitorização do link), downdelay/updelay (tempos de transição) e lacp_rate (frequência de PDUs LACP).

5. Teaming — Alternativa Moderna

O teaming é uma alternativa ao bonding desenvolvida pela Red Hat com uma arquitectura diferente. Enquanto o bonding é implementado como um módulo do kernel, o teaming usa um processo em espaço de utilizador (teamd) para a lógica de controlo e uma pequena porção no kernel para o caminho de dados. Isto oferece várias vantagens.

A principal vantagem do teaming é o paralelismo multi-core: o bonding processa todo o tráfego numa única thread, enquanto o teaming distribui o processamento por múltiplas CPUs. Em servidores com interfaces de 10 Gbps ou superior, isto faz diferença significativa. Adicionalmente, o teaming tem uma arquitectura modular com “runners” (equivalentes aos modos de bonding) carregáveis dinamicamente.

O teaming suporta os mesmos modos principais do bonding: activebackup, loadbalance, roundrobin, broadcast e lacp (equivalente ao 802.3ad). A configuração é feita através de um ficheiro JSON e o daemon teamd.

# Iniciar teamd com configuração
teamd -d -f /etc/teamd/team0.conf
# Verificar estado do team
teamdctl team0 state
# Configuração típica (ficheiro JSON)
# /etc/teamd/team0.conf:
# {
#   "device": "team0",
#   "runner": {"name": "activebackup"},
#   "link_watch": {"name": "ethtool"},
#   "ports": {"eth0": {}, "eth1": {}}
# }

O comando teamdctl team0 state mostra o estado detalhado do team, incluindo a porta activa, estado de cada interface e estatísticas. A saída em JSON é mais estruturada que /proc/net/bonding/bond0 e integra-se melhor com scripts de monitorização.

6. Configuração com NetworkManager

Em sistemas modernos (RHEL 8+, Fedora, Ubuntu 22.04+), o NetworkManager é a ferramenta padrão para gestão de redes. O nmcli suporta bridges, bonds e teams nativamente, com configuração persistente (sobrevive a reinicializações).

Bridge com nmcli

# Criar bridge br0
nmcli con add type bridge con-name br0 ifname br0
# Adicionar portas à bridge
nmcli con add type bridge-slave con-name br0-eth0 ifname eth0 master br0
nmcli con add type bridge-slave con-name br0-eth1 ifname eth1 master br0
# Activar bridge
nmcli con up br0
# Atribuir IP estático
nmcli con mod br0 ipv4.addresses 192.168.1.10/24
nmcli con mod br0 ipv4.method manual
nmcli con up br0

Bonding com nmcli

# Criar bond0 em modo 802.3ad
nmcli con add type bond con-name bond0 ifname bond0 mode 802.3ad
# Adicionar interfaces ao bond
nmcli con add type ethernet con-name bond0-eth0 ifname eth0 master bond0
nmcli con add type ethernet con-name bond0-eth1 ifname eth1 master bond0
# Atribuir IP e activar
nmcli con mod bond0 ipv4.addresses 192.168.1.10/24
nmcli con mod bond0 ipv4.method manual
nmcli con up bond0

Para teaming com NetworkManager, o processo é similar: nmcli con add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}' cria o team, e as portas são adicionadas com type team-slave.

Uma vantagem do NetworkManager é a persistência automática: todas as configurações ficam guardadas em /etc/NetworkManager/system-connections/ e são restauradas após reinício. Com comandos ip directos, é necessário criar ficheiros ifcfg-* ou unidades systemd-networkd manualmente.

7. Erros Comuns e Lista de Verificação

A configuração de bridges, bonds e teams envolve vários pontos de falha possíveis — desde incompatibilidades de switch até configuração incorrecta de parâmetros. Abaixo os problemas mais frequentes e uma lista de verificação para os evitar.

Sintoma Causa provável Solução
Bond não agrega largura de banda Modo não-LACP ou switch sem LACP Mudar para 802.3ad e configurar LACP no switch
Failover não detecta falha de cabo miimon desactivado ou valor muito alto Definir miimon=100 (100ms)
VMs sem acesso à rede na bridge IP atribuído à interface física em vez da bridge Mover IP de eth0 para br0
LACP não negoceia com switch lacp_rate incorrecto ou xmit_hash_policy Verificar lacp_rate=1 e xmit_hash_policy=layer2+3
Configuração perdida após reinício Comandos ip sem persistência Usar nmcli ou ficheiros systemd-networkd

Lista de verificação pré-produção

Antes de colocar uma bridge, bond ou team em produção, verificar cada ponto abaixo:

  • Modo de bonding correcto — confirmar que o modo escolhido é compatível com as capacidades do switch (LACP requer switch gerido).
  • miimon configurado — definir miimon=100 para detecção rápida de falhas de link (100ms).
  • IP na interface correcta — em bridges, o IP vai na bridge (br0), nunca na porta física. Em bonds, o IP vai no bond (bond0).
  • STP activo em bridges redundantes — se houver múltiplos caminhos, STP evita loops. Confirmar com bridge link show.
  • Persistência da configuração — testar reinício e verificar que a configuração sobrevive. Usar nmcli ou systemd-networkd.
  • Teste de failover — desligar um cabo fisicamente e confirmar que a ligação se mantém. Verificar tempo de recuperação.
  • Verificar /proc/net/bonding/ — confirmar que ambas as interfaces aparecem como “up” e que o modo está correcto.
  • Endereço MAC consistente — em bonds, o MAC da interface lógica deve ser consistente após reinício para evitar conflitos ARP.

Com estas práticas, a sua infra-estrutura de rede Linux ficará redundante e preparada para falhas de hardware. No Dia 26: Encaminhamento em Linux — ip route, Policy Routing, VRF continuámos a explorar tecnologias de rede avançadas, e no próximo dia fechamos a série com consolidação e revisão geral.