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 SNAT
do endereço de eth0
(e o gateway padrão dos hosts também está fora desta interface). Paraalguns sistemas, quero uma SNAT
regra 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 POSTROUTING
cadeia para realizar a SNAT
seleçã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 SNAT
regra 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 POSTROUTING
cadeia... mas isso é chamado POSTROUTING
por 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.X
do iface especificado ethY
com o endereço de origem de4.3.2.1
Você também pode fazer isso de forma mais complexa, fwmarks
mas 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.X
para 8.8.8.8
.
Espero que responda à sua pergunta,
foo