É possível ter vários gateways padrão para conexões de saída?

15

Eu gostaria de ter várias NICs (eth0 e wlan0) na mesma sub-rede e servir como backup dos aplicativos no host se uma das NICs falhar. Por esse motivo, criei uma tabela de roteamento adicional. É assim que /etc/network/interfacesparece:

iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

Isso funciona para conectar-se ao host: ainda posso fazer o SSH nele se uma das interfaces falhar. No entanto, os aplicativos no host não podem inicializar uma conexão com o mundo externo se eth0estiverem inativos. Esse é o meu problema.

Eu pesquisei esse tópico e encontrei as seguintes informações interessantes:

Quando um programa inicia uma conexão de saída, é normal o uso do endereço de origem curinga (0.0.0.0), indicando que não há preferência sobre qual interface é usada, desde que o endereço de destino relevante esteja acessível. Isso não é substituído por um endereço de origem específico até que a decisão de roteamento tenha sido tomada. O tráfego associado a essas conexões, portanto, não corresponderá a nenhuma das regras de política acima e não será direcionado para nenhuma das tabelas de roteamento recém-adicionadas. Supondo uma configuração normal, ela cairá na tabela de roteamento principal. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

O que eu quero é que a tabela de rotas principal tenha mais de um gateway padrão (um ativado eth0e outro ativado wlan0) e vá para o gateway padrão via eth0por padrão e via wlan0se eth0estiver inoperante.

Isso é possível? O que preciso fazer para obter essa funcionalidade?

rosix
fonte
Muito brevemente: Várias rotas padrão escolherão uma interface aleatoriamente, o que gera problemas porque o IP atribuído é diferente. O que você quer é multihoming ou agregação , que é difícil de fazer, ver, por exemplo aqui
dirkt
1
Você pode usar o failover dinâmico com ligação . Não há necessidade de mexer nas rotas padrão.
Ingo

Respostas:

17

Eu mesmo resolvi. Parece haver poucas informações sobre o material de rede que você pode fazer com o Linux, por isso decidi documentar e explicar minha solução em detalhes. Esta é minha configuração final:

  • 3 NICs: eth0 (fio), wlan0 (wifi embutido, fraco), wlan1 (adaptador wifi usb, sinal mais forte que wlan0)
  • Todos eles em uma única sub-rede, cada um com seu próprio endereço IP.
  • eth0 deve ser usado para tráfego de entrada e saída por padrão.
  • Se eth0 falhar, então wlan1 deve ser usado.
  • Se a wlan1 falhar, então a wlan0 deve ser usada.

Primeiro passo : Crie uma nova tabela de rotas para todas as interfaces do Windows /etc/iproute2/rt_tables. Vamos chamá-los de rt1, rt2 e rt3

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep
1 rt1
2 rt2
3 rt3

Segunda etapa : configuração de rede em /etc/network/interfaces. Esta é a parte principal e tentarei explicar o máximo que puder:

auto eth0 wlan0
allow-hotplug wlan1

iface lo inet loopback

iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
    post-up ip route add default via 192.168.178.1 dev eth0 table rt1
    post-up ip rule add from 192.168.178.99/32 table rt1
    post-up ip rule add to 192.168.178.99/32 table rt1
    post-up ip route add default via 192.168.178.1 metric 100 dev eth0
    post-down ip rule del from 0/0 to 0/0 table rt1
    post-down ip rule del from 0/0 to 0/0 table rt1

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.97/32 table rt2
    post-up ip rule add to 192.168.178.97/32 table rt2
    post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
    post-down ip rule del from 0/0 to 0/0 table rt2
    post-down ip rule del from 0/0 to 0/0 table rt2

iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
    post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
    post-up ip rule add from 192.168.178.98/32 table rt3
    post-up ip rule add to 192.168.178.98/32 table rt3
    post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
    post-down ip rule del from 0/0 to 0/0 table rt3
    post-down ip rule del from 0/0 to 0/0 table rt3

Se você digitar ip rule show, verá o seguinte:

0:  from all lookup local 
32756:  from all to 192.168.178.98 lookup rt3 
32757:  from 192.168.178.98 lookup rt3 
32758:  from all to 192.168.178.99 lookup rt1 
32759:  from 192.168.178.99 lookup rt1 
32762:  from all to 192.168.178.97 lookup rt2 
32763:  from 192.168.178.97 lookup rt2 
32766:  from all lookup main 
32767:  from all lookup default 

Isso nos diz que o tráfego de entrada ou saída do endereço IP "192.168.178.99" usará a tabela de rotas rt1. Por enquanto, tudo bem. Mas o tráfego gerado localmente (por exemplo, você deseja executar ping ou ssh da máquina para outro lugar) precisa de tratamento especial (consulte a grande citação na pergunta).

As quatro primeiras linhas de post-in /etc/network/interfacessão simples e explicações podem ser encontradas na internet, a quinta e a última linha de post-up são as que fazem a mágica acontecer:

post-up ip r add default via 192.168.178.1 metric 100 dev eth0

Observe como não especificamos uma tabela de rotas para esta linha de postagem. Se você não especificar uma tabela de rotas, as informações serão salvas na maintabela de rotas em que vimos ip rule show. Essa linha de postagem coloca uma rota padrão na tabela de rotas "principal" usada para o tráfego gerado localmente que não é uma resposta ao tráfego de entrada. (Por exemplo, um MTA no seu servidor tentando enviar um email.)

As três interfaces colocam uma rota padrão na tabela de rotas principal, embora com métricas diferentes. Vamos dar uma olhada na maintabela de rotas com ip route show:

default via 192.168.178.1 dev eth0  metric 100 
default via 192.168.178.1 dev wlan1  metric 101 
default via 192.168.178.1 dev wlan0  metric 102 
192.168.178.0/24 dev wlan0  proto kernel  scope link  src 192.168.178.97 
192.168.178.0/24 dev eth0  proto kernel  scope link  src 192.168.178.99 
192.168.178.0/24 dev wlan1  proto kernel  scope link  src 192.168.178.98

Podemos ver que a tabela de rotas principal possui três rotas padrão, embora com métricas diferentes. A prioridade mais alta é eth0, depois wlan1 e wlan0 porque números de métricas mais baixos indicam uma prioridade mais alta. Como eth0possui a métrica mais baixa, esta é a rota padrão que será usada enquanto eth0estiver em operação. Se eth0cair, o tráfego de saída mudará para wlan1.

Com esta configuração, podemos digitar ping 8.8.8.8um terminal e ifdown eth0outro. pingainda deve funcionar porque, porque ifdown eth0removerá a rota padrão relacionada a eth0, o tráfego de saída mudará para wlan1.

As linhas post-down garantem que as tabelas de rotas relacionadas sejam excluídas do banco de dados da política de roteamento ( ip rule show) quando a interface é desativada, a fim de manter tudo organizado.

O problema que resta é que, quando você puxa o plugue da eth0rota padrão, ele eth0ainda está lá e o tráfego de saída falha. Precisamos de algo para monitorar nossas interfaces e executar ifdown eth0se houver algum problema com a interface (ou seja, falha na NIC ou alguém puxando o plugue).

Última etapa : insira ifplugd. Esse é um daemon que observa interfaces e executa ifup/ifdownse você desconectar ou se houver algum problema com a conexão wifi /etc/default/ifplugd:

INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

Agora você pode ligar o plugue eth0, o tráfego de saída mudará para wlan1e, se você reconectá-lo, o tráfego de saída retornará para eth0. Seu servidor permanecerá online enquanto qualquer uma das três interfaces funcionar. Para conectar-se ao seu servidor, você pode usar o endereço IP de eth0 e, se isso falhar, o endereço IP de WLAN1 ou WLAN0.

rosix
fonte
Tente fazer uma conexão que demore mais (por exemplo, scp um arquivo grande), observe qual interface de rede ele usa, desative essa interface e veja o que acontece.
dirkt
A scpsessão será interrompida porque o endereço IP é alterado. Você pode tentar usar withsctppara manter a conexão ativa nesse caso ou usar em rsyncvez de scplimitar a transferência a partir do ponto em que parou.
1937 rosix
O ponto é: se ele quebrar, qual é a vantagem de sua configuração complicada em ter apenas uma rota padrão, digamos na interface de rede mais rápida atualmente instalada? withsctptambém funcionará para apenas uma rota padrão.
19317
1
"qual é a vantagem da sua configuração complicada em relação a ter apenas uma única rota padrão, digamos na interface de rede mais rápida atualmente instalada?" >> É exatamente isso que minha instalação está fazendo. Somente a rota padrão mais rápida (eth0) é usada por padrão. Seja bem-vindo.
1937 rosix
10

O Linux fornece uma solução melhor do que sua solução alternativa com script: ligação de backup ativo.

Dessa forma, sua máquina terá apenas um endereço IP (e um endereço MAC) e alternará as interfaces de forma automática e transparente se uma interface ficar indisponível. Nenhuma interrupção de nenhuma conexão TCP (nem na sua LAN interna nem na Internet).

Estou usando essa configuração para fazer failover automaticamente de eth0 para wlan0 no meu laptop debian quando eu desconecto meu laptop da estação de acoplamento.

Meu / etc / network / interfaces:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

Você pode facilmente estender essa configuração para incluir vários dispositivos wlan. Definir a primary_reselectopção para better(selecionar automaticamente o link mais rápido) deve ajudar aqui.

Para mais informações, consulte https://wiki.linuxfoundation.org/networking/bonding e https://wiki.debian.org/Bonding

E (é claro) a documentação do kernel do linux em https://www.kernel.org/doc/Documentation/networking/bonding.txt

Thilo
fonte