Roteamento Avançado com Múltiplos Gateways no Linux (sem cair a conexão)

Cenário Real: 2 Firewalls, 1 Servidor, 2 Placas de Rede

Você tem um servidor Linux com duas interfaces de rede, cada uma conectada a um firewall diferente, cada um com uma rota independente para a internet. Um cenário comum em ambientes de DMZ redundante ou links paralelos.

Exemplo de IPs:

  • eno1: 192.168.1.50, com gateway 192.168.1.1 (Firewall 1)
  • eno2: 172.16.3.2, com gateway 172.16.3.1 (Firewall 2)

O objetivo: permitir que o tráfego originado de cada IP saia pelo respectivo gateway, sem afetar a rota principal do sistema.


O Problema

Ao adicionar uma segunda interface com outro gateway, você não pode simplesmente adicionar outra default route, pois o kernel só usa uma por vez.

Você também não pode deixar sem rota, porque o pacote sai por um link e volta pelo outro — o que gera bloqueios, NAT quebrado e sessões TCP falhando.


A Solução: Roteamento com Tabelas e Regras (Policy Routing)

O Linux permite usar múltiplas tabelas de roteamento.

A regra é simples:

  • Pacote vindo de 192.168.1.50 → usar tabela rt1 → sair pelo Firewall 1
  • Pacote vindo de 172.16.3.2 → usar tabela rt2 → sair pelo Firewall 2

Passo a Passo

1. Adicione tabelas customizadas

Abra o arquivo /etc/iproute2/rt_tables:

nano /etc/iproute2/rt_tables

E adicione ao final (ou use os comandos abaixo):

100     rt1
200     rt2

Ou via terminal:

grep -q 'rt1' /etc/iproute2/rt_tables || echo "100 rt1" >> /etc/iproute2/rt_tables
grep -q 'rt2' /etc/iproute2/rt_tables || echo "200 rt2" >> /etc/iproute2/rt_tables

2. Adicione rotas separadas por tabela

# Rotas da eno1 → rt1
ip route add 192.168.1.0/24 dev eno1 src 192.168.1.50 table rt1
ip route add default via 192.168.1.1 dev eno1 table rt1

# Rotas da eno2 → rt2
ip route add 172.16.3.0/24 dev eno2 src 172.16.3.2 table rt2
ip route add default via 172.16.3.1 dev eno2 table rt2

3. Regras baseadas no IP de origem

ip rule add from 192.168.1.50 table rt1
ip rule add from 172.16.3.2 table rt2

4. (Opcional, mas recomendado) Desabilite verificação de rota reversa

Em sistemas com múltiplos gateways, o Reverse Path Filtering pode bloquear tráfego legítimo:

sysctl -w net.ipv4.conf.eno1.rp_filter=2
sysctl -w net.ipv4.conf.eno2.rp_filter=2

Para tornar permanente, edite o /etc/sysctl.conf:

net.ipv4.conf.eno1.rp_filter = 2
net.ipv4.conf.eno2.rp_filter = 2

O Que Aparece no route -n?

Nada muda. O route -n só mostra a tabela principal (main):

Destination     Gateway         Genmask         Iface
0.0.0.0         192.168.1.1     0.0.0.0         eno1
192.168.1.0     0.0.0.0         255.255.255.0   eno1
172.16.3.0      0.0.0.0         255.255.255.0   eno2

As outras tabelas são acessadas por:

ip route show table rt1
ip route show table rt2
ip rule

Teste Prático

Após aplicar, teste com:

curl --interface eno2 http://ipinfo.io

Você deve ver o IP público da DMZ 2 (Firewall 2).


Script para Automação (rc.local)

Se quiser aplicar tudo no boot, edite /etc/rc.local com:

#!/bin/bash

# Tabelas de roteamento (caso não existam)
grep -q 'rt1' /etc/iproute2/rt_tables || echo "100 rt1" >> /etc/iproute2/rt_tables
grep -q 'rt2' /etc/iproute2/rt_tables || echo "200 rt2" >> /etc/iproute2/rt_tables

# Rotas separadas
ip route add 192.168.1.0/24 dev eno1 src 192.168.1.50 table rt1
ip route add default via 192.168.1.1 dev eno1 table rt1

ip route add 172.16.3.0/24 dev eno2 src 172.16.3.2 table rt2
ip route add default via 172.16.3.1 dev eno2 table rt2

# Regras de origem
ip rule add from 192.168.1.50 table rt1
ip rule add from 172.16.3.2 table rt2

# Ajustes de reverse path filter
sysctl -w net.ipv4.conf.eno1.rp_filter=2
sysctl -w net.ipv4.conf.eno2.rp_filter=2

exit 0

Não esqueça:

chmod +x /etc/rc.local

Conclusão

Usar múltiplos gateways com roteamento baseado em IP de origem é a forma correta e elegante de lidar com servidores multihomed em Linux. Essa abordagem mantém a rota principal intacta, evita loops de retorno e resolve o tráfego assimétrico de forma profissional.

Rolar para cima