iproute2 Herdar ou Copiar Tabela

1

Eu configurei o roteamento da política de origem em um "roteador" Linux usando:

ip rule add from 192.168.1.0/24 table FOO
ip route add default dev eth0 table FOO

Os pacotes encaminhados dessa sub-rede atingem os destinos da Internet.

O problema é que a tabela FOO não herda rotas conectadas localmente da tabela principal.
Eu poderia adicionar rotas conectadas localmente manualmente, mas obviamente isso é frágil e requer mais manutenção.

Eu gostaria que a tabela FOO herdasse todas as rotas da tabela main e, em vez de "ip route add default ...", eu poderia usar um "ip route change default".

A rota padrão da tabela principal deve permanecer no lugar de outras sub-redes.

Como posso fazer isso?

    
por robut 12.02.2018 / 04:10

1 resposta

0

Aqui está a forma usual de adicionar novas tabelas e regras de roteamento, que o OP não deseja:

  1. crie uma nova tabela de roteamento que inclua "exceções", chamada FOO
  2. adicione uma regra com uma condição que selecione esta tabela FOO
  3. porque a regra obtém uma prioridade menor (melhor) a nova tabela FOO é lida primeiro, portanto, ignorando totalmente a tabela main . Para "corrigir" este problema, as rotas da tabela main são copiadas para a tabela FOO .

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:

  1. todo tráfego local deve ser tratado com as rotas usuais da tabela main
  2. se o tráfego for proveniente de 192.168.1.0/24 , sua rota padrão deve ser obtida da tabela FOO (aqui dev eth0 )
  3. 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
#
  1. mova a regra procurando main para uma prioridade mais baixa

    # ip rule add priority 32000 from all lookup main
    # ip rule del priority 32766
    
  2. implementar exceções

    # ip route add default dev eth0 table FOO
    # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
    
  3. mova a rota padrão "usual" da tabela main para a tabela default , para permitir que exceções sejam acionadas na regra 32100. A regra 32767 ainda fornecerá a rota padrão da tabela default 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.

    
por 25.03.2018 / 21:14

Tags