
Eu tenho uma máquina servidor Linux que também uso como gateway/"roteador" de rede. Possui três interfaces de rede ativas – duas interfaces de rede conectadas à Internet através de diferentes ISPs e a terceira que fornece acesso à Internet para minhas máquinas locais através de NAT. Tenho balanceamento de carga entre os links WAN.
A partir do servidor, a rede é acessível perfeitamente – tudo funciona, o balanceamento de carga funciona e geralmente não há perdas de pacotes. As conexões entre o servidor e as máquinas locais também funcionam perfeitamente. Mas se eu acessar a internet/WAN de uma máquina local através do servidor, sempre vejo perda constante de pacotes de aproximadamente 40%. Isso torna as conexões muito instáveis. Com um pouco de investigação, pude ver que recebo (e perco) pacotes que passam por ambas as interfaces de forma mais ou menos igual, então énãocomo se uma das interfaces estivesse arrastando todo o resto, perdendo todos os seus pacotes.
Se eu desabilitar qualquer um dos dois links WAN, essa perda de pacotes desaparecerá instantaneamente. Ele reaparece instantaneamente se eu ativar os dois links WAN novamente.
O que poderia causar isso? Alguma dica de como solucionar esse problema sem precisar desistir de um dos links WAN?
minha iptables
tabela de filtros:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
minha iptables
tabela nat:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.42.0.0/24 !10.42.0.0/24
minha iptables
mesa mangle:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 mark match ! 0x0
MARK all -- 0.0.0.0/0 0.0.0.0/0 state NEW MARK set 0x2
MARK all -- 0.0.0.0/0 0.0.0.0/0 state NEW statistic mode random probability 0.50000000000 MARK set 0x1
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
ip route show
saída:
default
nexthop via 10.7.0.254 dev eth0 weight 1
nexthop via 78.62.255.254 dev eth2 weight 1
10.7.0.0/16 dev eth0 proto kernel scope link src 10.7.5.102
10.42.0.0/24 dev eth1 proto kernel scope link src 10.42.0.254
78.62.192.0/18 dev eth2 proto kernel scope link src 78.62.239.10
169.254.0.0/16 dev eth1 scope link metric 1000
tudo não foi editado como está - não se preocupe muito com "privacidade" neste caso
Responder1
Com base nas tabelas que você mostrou, você não está fazendo nada para garantir que o NAT mantenha os fluxos saindo pela mesma interface em que foram iniciados, o que significa que aproximadamente metade dos seus pacotes de saída provavelmente estão sendo mal traduzidos.
Para fazer o balanceamento de carga NAT corretamente, você precisa de uma regra de pré-roteamento na tabela mangle marcando aleatoriamente novos fluxos com 1 ou 2, você precisa de ip rule
regras de roteamento de pacotes marcados como 1 para a interface WAN 1 e de pacotes marcados como 2 para a interface WAN 2 , e você precisa de regras SNAT separadas na iptables
tabela NAT, uma para cada interface WAN.
Para uma descrição mais detalhada, consulte O balanceamento de carga Iptables de Diego Lima em poucas palavras