Dia 26: Encaminhamento com Linux — ip route, Policy Routing e VRF

O Linux não é apenas um sistema operativo para servidores e estações de trabalho — pode funcionar como um router completo, encaminhando tráfego entre redes com a mesma flexibilidade que um equipamento comercial. Neste Dia 26 do curso de redes, exploramos o encaminhamento avançado em Linux: ip route, tabelas de encaminhamento múltiplas, policy routing com ip rule, e VRF (Virtual Routing and Forwarding) — funcionalidades que permitem segmentar tráfego, implementar multi-WAN, e isolar redes de forma elegante.

♿ O Linux pode funcionar como router completo — com ip route, policy routing e VRF, substitui routers comerciais em cenários PME.

⚠️ Activar encaminhamento IP sem firewall adequado expõe a rede — sempre configurar iptables/nftables antes de activar net.ipv4.ip_forward.

1. Introdução ao Encaminhamento em Linux

O kernel Linux inclui um subsistema de encaminhamento de rede extremamente capaz, acessível através do comando ip do pacote iproute2. Por defeito, o Linux não encaminha pacotes entre interfaces — funciona como um hospedeiro final. Para que actue como router, é necessário activar o IP forwarding ao nível do kernel.

O encaminhamento em Linux suporta vários níveis de complexidade:

  • Rotas estáticas — rotas manuais com ip route add
  • Protocolos de encaminhamento dinâmico — OSPF, BGP via FRRouting, BIRD, ou Quagga
  • Tabelas múltiplas — até 4.294.967.295 tabelas independentes
  • Policy routing — decisões de encaminhamento baseadas em origem, marca, TOS, etc.
  • VRF — isolamento completo de instâncias de encaminhamento (L3 VPNs)

O comando ip substituiu completamente as ferramentas antigas ifconfig, route e arp. Para referência completa, consulte a página de manual oficial do ip(8).

2. ip route — Comandos Essenciais

O subcomando ip route gere a tabela de encaminhamento principal. É a ferramenta base para definir como o tráfego é encaminhado entre redes.

Activar IP Forwarding

Antes de qualquer configuração de rotas, é necessário activar o encaminhamento no kernel. Sem isto, o Linux descarta pacotes que não são destinados a si próprio.

# Activar IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
# Tornar persistente
# /etc/sysctl.d/99-routing.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

O primeiro método é temporário (perde-se ao reiniciar). Para tornar a configuração persistente, criar o ficheiro em /etc/sysctl.d/ e aplicar com sysctl -p /etc/sysctl.d/99-routing.conf.

Rotas Estáticas

As rotas estáticas definem manualmente o caminho para redes específicas. A tabela principal (main) é a predefinida.

# Rotas estáticas
ip route add 10.0.2.0/24 via 10.0.1.1
ip route add default via 192.168.1.1 dev eth0
ip route show
Comando Descrição
ip route add Adiciona uma rota à tabela principal
ip route del Remove uma rota específica
ip route show Lista todas as rotas da tabela principal
ip route flush Limpa todas as rotas (cuidado!)
ip route get Mostra a rota exacta para um destino

A rota default é a última a ser consultada — quando nenhuma rota mais específica corresponde ao destino, o tráfego é enviado para o gateway predefinido. A métrica (priority) determina a ordem quando há várias rotas para o mesmo destino.

3. Tabelas de Encaminhamento Múltiplas

O Linux suporta múltiplas tabelas de encaminhamento independentes. Por defeito, existem 4 tabelas: local (id 255), main (id 254), default (id 253), e unspec (id 0). Podem ser criadas até 4.294.967.295 tabelas adicionais, definidas em /etc/iproute2/rt_tables.

As tabelas múltiplas são a base do policy routing — permitem que diferentes fluxos de tráfego usem conjuntos de rotas completamente diferentes. Um caso típico é uma rede com duas ligações WAN: tráfego VPN usa uma tabela, tráfego de convidados usa outra.

# Tabelas múltiplas
echo "100 vpn" >> /etc/iproute2/rt_tables
echo "200 guest" >> /etc/iproute2/rt_tables
ip route add default via 10.0.1.1 dev tun0 table vpn
ip route add 192.168.1.0/24 dev eth0 table vpn

Após definir as tabelas em rt_tables, as rotas são adicionadas com o parâmetro table NOME. Para visualizar uma tabela específica:

ip route show table vpn
ip route show table guest
ip route show table all

O comando ip route show table all lista o conteúdo de todas as tabelas simultaneamente — útil para auditar a configuração completa do sistema.

4. Policy Routing com ip rule

O policy routing estende o encaminhamento tradicional. Em vez de decidir a rota apenas pelo destino (IP de destino), o policy routing permite decidir com base em origem, marca de firewall (fwmark), TOS/DSCP, interface de entrada, e outros critérios. As regras são avaliadas em ordem de prioridade (número mais baixo = maior prioridade).

O fluxo de decisão é: o kernel consulta a lista de regras (ip rule) em ordem de prioridade. A primeira regra que corresponde indica qual tabela de encaminhamento usar. Dentro dessa tabela, o kernel procura a rota para o destino.

# Policy routing
ip rule add from 192.168.2.0/24 table vpn
ip rule add fwmark 0x1 table vpn
ip rule show

O exemplo acima cria duas regras: todo o tráfego originado da rede 192.168.2.0/24 usa a tabela vpn; e todo o tráfego marcado com fwmark 0x1 (marcado pelo iptables/nftables) também usa a tabela vpn.

Selector Descrição
from IP ou rede de origem
fwmark Marca aplicada pelo firewall (iptables/nftables)
iif Interface de entrada
tos Tipo de Serviço / DSCP
uidrange Intervalo de UID do processo

Cenário típico de multi-WAN: tráfego da rede de convidados (192.168.3.0/24) sai pela WAN secundária, enquanto o tráfego corporativo sai pela WAN principal. Com fwmark, pode-se marcar pacotes específicos (ex: VoIP) para usar uma rota com menor latência.

5. VRF no Linux

VRF (Virtual Routing and Forwarding) é a forma mais avançada de isolamento de encaminhamento em Linux. Um VRF cria uma instância de encaminhamento completamente separada — com a sua própria tabela de rotas, regras, e interfaces associadas. É o equivalente L3 das VLANs: assim como as VLANs isolam domínios de difusão, os VRFs isolam domínios de encaminhamento.

Os VRFs são suportados nativamente no kernel Linux desde a versão 4.8 (2016), através do módulo vrf. Cada VRF está associado a uma tabela de encaminhamento específica.

# VRF
ip link add vrf-corp type vrf table 10
ip link set vrf-corp up
ip link set eth1 master vrf-corp
ip addr add 10.0.10.1/24 dev eth1
ip route show table 10

Neste exemplo, criamos um VRF chamado vrf-corp associado à tabela 10. A interface eth1 passa a fazer parte deste VRF — todo o tráfego que entra e sai por eth1 usa apenas a tabela 10 para decisões de encaminhamento. O ip route show table 10 mostra as rotas dentro do VRF.

VRF vs Policy Routing

Característica Policy Routing VRF
Isolamento de rotas Parcial (regras selectivas) Total (instância separada)
Interfaces dedicadas Não Sim (associada ao VRF)
Protocolos de encaminhamento Partilhados Isolados por VRF
Complexidade Média Alta
Caso de uso típico Multi-WAN, QoS L3 VPN, multi-inquilinato

Para executar comandos dentro de um VRF específico (por exemplo, testar conectividade):

ip vrf exec vrf-corp ping 10.0.10.2
ip vrf exec vrf-corp ip route show

6. Encaminhamento IP e Depuração

A depuração de encaminhamento em Linux exige ferramentas específicas para inspecionar o estado do kernel e o fluxo real dos pacotes. O comando ip route get é especialmente útil — mostra exactamente que rota o kernel escolheria para um destino, incluindo a interface de saída e o gateway.

# Debugging
ip route get 8.8.8.8
ip -s link show eth0
ss -tlnp

O ip route get 8.8.8.8 responde com a rota exacta seleccionada, incluindo a interface, gateway, e origem. O ip -s link show eth0 mostra estatísticas detalhadas da interface (RX/TX, erros, descartes). O ss -tlnp lista sockets TCP em escuta com PID/programa associado.

Ferramentas Complementares

  • tcpdump -i eth0 — captura de pacotes em tempo real
  • traceroute / mtr — rastreia o caminho até ao destino
  • conntrack -L — inspeciona a tabela de ligações do netfilter
  • ip neigh show — tabela ARP/NDP (vizinhos)
  • sysctl net.ipv4.ip_forward — confirma estado do forwarding

Para verificar se o encaminhamento está activo para IPv6, usar sysctl net.ipv6.conf.all.forwarding. Cada interface tem as suas próprias variáveis em /proc/sys/net/ipv{4,6}/conf/.

7. Erros Comuns e Lista de Verificação

A configuração de encaminhamento em Linux é poderosa mas propensa a erros subtis. Abaixo, os erros mais frequentes e uma lista de verificação para auditoria.

Erro Causa Solução
Pacotes não são encaminhados ip_forward=0 Activar net.ipv4.ip_forward=1 via sysctl
Policy routing não funciona Tabela sem rotas definidas Verificar ip route show table N e adicionar rotas
VRF sem conectividade Interface não associada ao VRF ip link set ethX master vrf-N
Rotas perdem-se ao reiniciar Configuração não persistente Usar systemd-networkd, Netplan, ou ficheiro em /etc/sysctl.d/
fwmark sem efeito Marca não aplicada no firewall Configurar iptables -t mangle ou nftables meta mark
Tráfego contorna o firewall Encaminhamento activo sem regras FORWARD Definir política FORWARD DROP e regras explícitas

Lista de Verificação

  • ✓ Encaminhamento IP activo (sysctl net.ipv4.ip_forward = 1)
  • ✓ Encaminhamento IPv6 activo se aplicável
  • ✓ Firewall configurado ANTES de activar encaminhamento (política FORWARD DROP)
  • ✓ Rotas estáticas persistentes (systemd-networkd, Netplan, ou rc.local)
  • ✓ Tabelas múltiplas definidas em /etc/iproute2/rt_tables
  • ✓ Regras de policy routing testadas com ip route get
  • ✓ VRFs com interfaces correctamente associadas
  • rp_filter (filtragem de caminho inverso) configurado conforme necessário
  • ✓ Protocolo de encaminhamento dinâmico (FRR, BIRD) configurado se necessário
  • ✓ Monitorização de rotas via SNMP, NetFlow, ou scripts personalizados

O parâmetro rp_filter (filtragem de caminho inverso) merece atenção especial: quando activo em modo rigoroso (net.ipv4.conf.all.rp_filter=1), o kernel descarta pacotes cuja rota de retorno não passa pela mesma interface. Isto pode quebrar configurações multi-WAN com policy routing — nesses casos, usar modo permissivo (rp_filter=2) ou desactivar (rp_filter=0).

Artigos Relacionados