Unindo duas interfaces de camada 3 para failover

1

Eu tenho uma máquina Linux com dois modems USB, cada um com seu próprio cartão SIM e endereço IP público.

Um dos modems pode perder conectividade em algum momento e eu quero que as conexões sejam tão resilientes quanto possível. Eu entendo que é provavelmente impossível sustentar as conexões existentes, mas pelo menos uma vez que a interface 1 perde a conectividade, eu quero que a interface 2 seja usada para novas conexões imediatamente.

Qual é a melhor maneira de obter tempo mínimo de inatividade com duas interfaces no Linux?

                                                ____________
                         +------------+        /            \
                         |            |       |              |
           +-------------+ Provider 1 +-------                \
           |             |            |     /                  \
    +------+--------+    +------------+    |                    |
    |     if1       |                      /                    \
    |               |                      |                    |
    + Linux machine |                      |     Internet       |
    |               |                      |                    |
    |     if2       |                      \                    /
    +------+--------+    +------------+    |                    |
           |             |            |     \                  /
           +-------------+ Provider 2 +-------                /
                         |            |       |              |
                         +------------+        \____________/
    
por naktinis 25.04.2016 / 11:54

1 resposta

3

Eu sugiro ter as duas interfaces ativadas o tempo todo e ajustar sua tabela de roteamento de tal forma que:

  • Sua interface principal sempre será a preferida
  • Seu secundário tem um IP e está pronto (hot standby), mas o tráfego não está passando (para que você não mude muito)
  • Ter um segundo gateway padrão com maior métrica

Você pode fazer o acima usando

ip route add default dev xyz metric 100

Dependendo da sua distribuição linux, você poderá torná-la permanente editando os scripts de post-up ou if-up.

Outra abordagem, especialmente se você não estiver sendo cobrado por uso, é balancear a carga das duas interfaces. Eu nunca configurei nada parecido ... mas parece bastante simples usar lnlb . Não, meu erro, isso é para o balanceamento de carga de LAN / cluster, mas isso tem uma implementação baseada em iptables .

ATUALIZAÇÃO: com base no comentário:

Uma tabela de roteamento é semelhante à seguinte:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.207.246.1    0.0.0.0         UG    0      0        0 br0
10.0.3.0        0.0.0.0         255.255.255.0   U     0      0        0 lxcbr0
10.207.246.0    0.0.0.0         255.255.255.0   U     0      0        0 br0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 br0

As rotas padrão são aquelas com destino 0.0.0.0 . Você pode ver o meu é:

0.0.0.0         10.207.246.1    0.0.0.0         UG    0      0        0 br0

O metric indica a prioridade e o menor número é o mais preferido. Por exemplo, com duas interfaces eu poderia ter o seguinte, nesse caso eu prefiro enviar tráfego para minha interface br0 (bridge):

0.0.0.0         10.207.246.1    0.0.0.0         UG    0      0        0 br0
0.0.0.0         10.205.243.1    0.0.0.0         UG    100    0        0 eth1

Se br0 cair por algum motivo, a segunda rota padrão será a única rota e, portanto, eth1 será usado. Quando a br0 voltar, a rota preferida mudará novamente e apontará para essa interface.

Agora, a segunda abordagem, como eu a entendo, usa duas tabelas de roteamento distintas! Usando o exemplo do blog vinculado, você pode ver uma tabela chamada bsnl e uma tabela chamada tata . Cada tabela mapeia para um provedor de internet e cada um tem:

  1. Uma LAN diretamente conectada:

    ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table bsnl
    
  2. Uma rota / gateway padrão:

    ip route add default via 192.168.1.1 table bsnl
    
  3. E uma regra que assumo mapeia o tráfego de entrada para uma tabela de roteamento (corrija-me se estiver errado - lendo this ):

    ip rule add from 192.168.1.10 table bsnl
    

A configuração acima definiu o lado WAN / ISP (um conjunto para cada conexão com a Internet) Por último, a rota padrão do escopo global decidirá o nexthop para o tráfego proveniente da LAN e deve ser roteado para WAN . (O escopo global que eu suponho é aplicado para todas as interfaces que não se enquadram em um ip rule ):

ip route add default scope global nexthop via 192.168.1.1 dev eth1 weight 1 \
                                  nexthop via 192.168.0.1 dev eth2 weight 4

A diferença mais importante é que a última técnica usa as duas interfaces / conexões simultaneamente executando balanceamento de carga com as prioridades dadas. No exemplo acima, eth1 é preferido 1/5 do tempo (20%), que eth2 é preferido 4 / 5s (80%). Ao contrário, na primeira configuração, usando duas rotas padrão, apenas uma conexão é usada a qualquer momento.

Disclaimer: Eu nunca fiz a segunda configuração, então algumas coisas podem estar erradas ou não serem explicadas em detalhes ...

Espero que ajude

    
por 25.04.2016 / 12:52