
Eu tenho uma topologia de rede como esta:
veja bem, o em1
(1.1.8.209) é uma interface física com a qual posso me comunicar pela Internet. e criei duas instâncias de vm: PID 8740
e PID 8817
, ambas usam o IP da rede 1.1.8.210/29
e 1.1.8.211/29
, ambas endereços IP públicos.
agora posso me comunicar com o em1 pela Internet.
mas tenho um requisito: quero acessar as duas VMs diretamente, então quero anexar o em1 ao br0
.
então eu executei isso:
brctl addif br0 em1
a topologia se torna esta:
no entanto, depois de executar este comando, recebo um erro, não consigo 1.1.8.209
mais me comunicar. então apaguei o anexo brctl delif br0 em1
, então posso acessar 1.1.8.209
agora.
Por que recebo esse problema? Não entendo, por favor ajude a explicar o porquê.
Responder1
Quando a interface se torna uma porta bridge, ela não participa mais do roteamento.
Os detalhes de baixo nível são descritos neste blogIsolamento adequado de uma ponte Linux:
entregar o quadro para um manipulador de protocolo global ou específico do dispositivo (por exemplo, IPv4, ARP, IPv6).
Para uma interface em ponte, o kernel configurou um manipulador de recebimento específico do dispositivo,
br_handle_frame()
. Esta função não permitirá nenhum processamento adicional no contexto da interface de entrada, exceto para quadros STP e LLDP ou se o “brouting” estiver habilitado. Portanto, omanipuladores de protocolo nunca são executadosnesse caso.
O endereço IP da porta da ponte torna-se irrelevante para o pacote recebido. Deixá-lo definido onde está ainda pode interromper o roteamento adequado dos pacotes de saída, porque eles ainda podem ser enviados diretamente pela porta da ponte (quando não deveriam mais).
O que deve ser feito é mover o endereço IP para um sistema (ou namespace de rede, ou mesmo para a outra extremidade livre de um par veth no mesmo local) tendo sua outra extremidade conectada à ponte, ou para a porta própria da ponte, ou seja, a própria ponte . Sempre haverá uma pequena janela de tempo onde existirá interrupção durante esta movimentação, portanto as ações realizadas localmente para alterar esta configuração não devem depender do acesso à rede (ex.: não devem depender da digitação de comandos remotamente através de um shell usando a rota interrompida).
Usarei apenas ferramentas mais recentes com sintaxe mais recente abaixo.
Por exemplo:
ip address flush dev em1
ip address add 1.1.8.209/29 dev br0
Em vez disso, uma outra maneira de deixar a ponte sem participar do roteamento e usar um recurso extravethO final do par (no mesmo namespace de rede) para participar do roteamento poderia ser:
ip address flush dev em1
ip link add name em1twin type veth peer name br0portem1twin
ip link set br0portem1twin master br0 up
ip link set em1twin up
ip address add 1.1.8.209/29 dev em1twin
Em ambos os casos, se uma rota padrão (ou outras rotas) dependesse da existência deste endereço, esta rota também deverá ser adicionada novamente, pois desapareceu.