Afeta a seleção da interface de saída na ou após a cadeia POSTROUTING?

Afeta a seleção da interface de saída na ou após a cadeia POSTROUTING?

Tenho um sistema que hospeda várias instâncias KVM. Todos estes estão conectados a uma única ponte (digamos, brvirt), à qual também está conectado eth1. Este ambiente de camada 2 está em uma rede privada usando 172.16.10.0/24 para uma alteração de endereço. Existem duas outras interfaces no sistema que chamaremos de eth0(10.10.10.10) e eth2(10.10.20.20).

Em geral, a conectividade externa é fornecida através SNATdo endereço de eth0(e o gateway padrão dos hosts também está fora desta interface). Paraalguns sistemas, quero uma SNATregra 1-1 explícita na rede 10.10.20.0/24, que está anexada ao eth2.

Isso é um problema porque no momento em que atingimos a POSTROUTINGcadeia para realizar a SNATseleção da interface de saída já foi feita. O kernel já selecionou a rota padrão (assumindo uma conexão com qualquer coisa que não seja uma rede diretamente conectada), o que significa que quando a SNATregra modifica o endereço IP de origem, a infraestrutura de roteamento local descarta o pacote porque ele é originado na camada 2 errada rede.

Existe alguma maneira de contornar isso? O que eurealmenteO que eu quero fazer é tomar decisões de roteamento com base no endereço de origem do pacote na conclusão da POSTROUTINGcadeia... mas isso é chamado POSTROUTINGpor um bom motivo.

Responder1

isso pode ser feito com roteamento simples baseado em políticas.

você precisará de um conjunto de regras e rotas com o esquema:

ip rule add from 172.16.10.X iif brvirt lookup 200
ip route add default via 1.2.3.4 src 4.3.2.1 dev ethY table 200

Variáveis:

172.16.10.X = KVM's IP
200         = Example value for routing_table, has to be unique for each KVM
ethY        = either eth0 or eth2
1.2.3.4     = Example Gateway on iface ethY
4.3.2.1     = Example Source-IP for each KVM

Isso roteará qualquer coisa vinda 172.16.10.Xdo iface especificado ethYcom o endereço de origem de4.3.2.1

Você também pode fazer isso de forma mais complexa, fwmarksmas não acho que isso seja necessário neste caso.

Você pode verificar as rotas com: ip route get iif brvirt from 172.16.10.X 8.8.8.8. Isso exibirá a rota e o dispositivo de saída que o kernel usaria para uma conexão de 172.16.10.Xpara 8.8.8.8.

Espero que responda à sua pergunta,

foo

informação relacionada