Depois de fazer uma configuração normal de apenas eth0, voltei e adicionei a configuração para eth1. Com apenas eth0 up, a tabela de rotas era:
# ip route show
192.168.0.96/27 dev eth0 proto kernel scope link src 192.168.0.126
default via 192.168.0.97 dev eth0 metric 100
Mas uma vez que eu indiquei eth1, a ordem das instruções de rota padrão determinou qual interface era sempre usada. Como mostrado abaixo, acontece de escolher a rota eth1 para o gateway 192.168.1.65.
# ip route show
192.168.0.96/27 dev eth0 proto kernel scope link src 192.168.0.126
192.168.1.64/27 dev eth1 proto kernel scope link src 192.168.1.93
default via 192.168.1.65 dev eth1 metric 100
default via 192.168.0.97 dev eth0 metric 100
apenas uma instrução de gateway
O primeiro problema pode ser a rota padrão 'via 192.168.1.65' adicional. Ele aparece lá se a definição de eth1 em / etc / network / interfaces tiver uma instrução "gateway 192.168.1.65". Portanto, remova qualquer instrução de gateway extra e salte a interface:
# ifdown eth1
# ifup eth1
# ip route show
192.168.0.96/27 dev eth0 proto kernel scope link src 192.168.0.126
192.168.1.64/27 dev eth1 proto kernel scope link src 192.168.1.93
default via 192.168.0.97 dev eth0 metric 100
configura a nova tabela de roteamento
Crie uma nova tabela de roteamento separada contendo uma rota padrão apropriada para todo o tráfego que sai da eth1. O número da mesa aqui não é importante; 101 simplesmente não é a tabela de roteamento principal. Faça isso com um comando 'post-up' na configuração eth1 em / etc / network / interfaces. Adicione apenas um post-up em eth1; Não o adicione a qualquer uma das subinterfaces eth1:
post-up ip route add default via 192.168.1.65 dev eth1 table 101
Saltar eth1. A tabela de roteamento principal é inalterada, e a tabela 101 conterá a rota padrão via 192.168.1.65 se eth1 estiver ativo.
# ifdown eth1
# ip route show
192.168.0.96/27 dev eth0 proto kernel scope link src 192.168.0.126
default via 192.168.0.97 dev eth0 metric 100
# ip route show table 101 (ie, table is empty, no output)
# ifup eth1
# ip route show
192.168.0.96/27 dev eth0 proto kernel scope link src 192.168.0.126
192.168.1.64/27 dev eth1 proto kernel scope link src 192.168.1.93
default via 192.168.0.97 dev eth0 metric 100
# ip route show table 101
default via 192.168.1.65 dev eth1
nova regra de roteamento
Adicione uma regra de roteamento para usar a tabela 101 para selecionar uma rota padrão para os pacotes que devem sair da eth1.
# ip rule add from 192.168.1.64/27 lookup 101
# ip rule show
0: from all lookup local
32765: from 192.168.1.64/27 lookup 101
32766: from all lookup main
32767: from all lookup default
Adicione também a regra ao arquivo /etc/network/interfaces
:
post-up ip rule add from 192.168.1.64/27 lookup 101
Agora, adicione a limpeza para remover a rota e a regra quando a interface ficar inativa:
post-down ip rule del from 192.168.1.64/27
post-down ip route del default via 192.168.1.65 table 101
[EDIT para o Ubuntu 16.04+]
Como indicado aqui e do teste que eu fiz desta ajuda, ip route2 mudou sua estrutura de comandos.
Para fazer o trabalho você terá que se adaptar um pouco para fazer na ordem como os man ip
apontam .
up ip route add default table 101 dev eth1 via 192.168.1.65
up ip rule add from 192.168.1.64/27 lookup 101
down ip rule del from 192.168.1.64/27
down ip route del default table 101 via 192.168.1.65
Ou você terminará após um comando ifdown - ifup com um comando de mensagem de erro @ifdown (mensagem padrão para dizer que os periféricos não estão configurados corretamente) e @ifup a ausência de uma rota na tabela 101.