Aqui está a forma usual de adicionar novas tabelas e regras de roteamento, que o OP não deseja:
- crie uma nova tabela de roteamento que inclua "exceções", chamada
FOO
- adicione uma regra com uma condição que selecione esta tabela
FOO
- porque a regra obtém uma prioridade menor (melhor) a nova tabela
FOO
é lida primeiro, portanto, ignorando totalmente a tabelamain
. Para "corrigir" este problema, as rotas da tabelamain
são copiadas para a tabelaFOO
.
As regras seriam assim:
# ip rule
0: from all lookup local
32765: from 192.168.1.0/24 lookup FOO
32766: from all lookup main
32767: from all lookup default
O OP não deseja ter que fazer 3., porque aumenta a carga administrativa quando as rotas são alteradas.
Pelo que entendi, é isso que a OP deseja:
- todo tráfego local deve ser tratado com as rotas usuais da tabela
main
- se o tráfego for proveniente de
192.168.1.0/24
, sua rota padrão deve ser obtida da tabelaFOO
(aquidev eth0
) - else, o tráfego usará a rota padrão "normal".
Vamos implementá-lo nesta ordem, em vez do pedido normal. O resultado pode não ser exatamente o que foi descrito na pergunta, mas deve ser o que foi desejado. Sem o problema real a ser resolvido e a configuração adequada fornecida pelo OP, algumas coisas podem parecer estranhas (como reutilizar a saída de ip route
para mover a rota padrão da tabela main
para a tabela default
).
A partir das regras habituais:
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Observe que a tabela default
está vazia (por padrão) e livre para usar.
# ip route show table default
#
-
mova a regra procurando
main
para uma prioridade mais baixa# ip rule add priority 32000 from all lookup main # ip rule del priority 32766
-
implementar exceções
# ip route add default dev eth0 table FOO # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
-
mova a rota padrão "usual" da tabela
main
para a tabeladefault
, para permitir que exceções sejam acionadas na regra 32100. A regra 32767 ainda fornecerá a rota padrão da tabeladefault
se nenhuma correspondência for encontrada antes, não há perda de conectividade.# ip route add $(ip route show 0.0.0.0/0) table default # ip route del default
As regras agora serão assim:
# ip rule
0: from all lookup local
32000: from all lookup main
32100: from 192.168.1.0/24 lookup FOO
32767: from all lookup default
Alguns exemplos em um contêiner (isso não fará muito sentido, é apenas ver as tabelas envolvidas):
# ip -br link
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0@if12 UP 66:d4:11:94:49:5f <BROADCAST,MULTICAST,UP,LOWER_UP>
local0@if9 UP 00:16:3e:6a:c1:e9 <BROADCAST,MULTICAST,UP,LOWER_UP>
# ip -4 -br a
lo UNKNOWN 127.0.0.1/8
local0@if9 UP 10.0.3.66/24
# ip route
10.0.3.0/24 dev local0 proto kernel scope link src 10.0.3.66
# ip route show table FOO
default dev eth0 scope link
# ip route show table default
default via 10.0.3.1 dev local0
# ip -o route get 10.0.3.2
10.0.3.2 dev local0 src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8
8.8.8.8 via 10.0.3.1 dev local0 table default src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8 from 192.168.1.2 iif local0
8.8.8.8 from 192.168.1.2 dev eth0 table FOO \ cache iif local0
É isso. A única diferença de uso é que a rota padrão "usual" agora deve ser definida na tabela default
( 253
) em vez da tabela main
( 254
). Scripts de inicialização devem ser adaptados para lidar com isso: as configurações não devem indicar uma rota ou gateway padrão, mas devem executar um script personalizado adicional que fará ip route add default ... table default
. Para o Debian isto pode ser feito com os comandos post-up
( por exemplo, post-up ip route add default via xxx table default || :
) em /etc/network/interfaces
. Para o RHEL7, isso deve ser feito com route-XXX arquivos. Para os novos métodos de rede do systemd, não faço ideia.