Acabei de atualizar dois servidores do Debian 10 (Buster) para o Debian 11 (Bullseye). Depois, não consegui mais alcançar nenhum deles pela rede. Depois de alguma investigação, o seguinte problema acabou:
Ambas as máquinas têm um dispositivo de ponte configurado. Obviamente, o algoritmo que o Debian usa para atribuir endereços MAC aos dispositivos de ponte mudou da versão 10 para 11. Após a atualização, o dispositivo de ponte no primeiro servidor tinha o mesmo endereço MAC que o dispositivo de ponte no segundo servidor , o que com certeza não foi o caso antes.
Uma das respostas afirma que uma ponte é um dispositivo puramente interno e que, portanto, o endereço MAC de uma ponte não importa. No entanto, isso é obviamente errado. Pelo menos no meu caso, os pacotes de ambas as máquinas estavam saindo com o endereço de origem do hardware sendo o endereço MAC da ponte, e as portas de rede em ambas as máquinas estavam processando os pacotes de entrada apenas se fossem destinados ao endereço MAC da ponte.
Como esse endereço MAC era o mesmo em ambas as máquinas, a rede ficou inutilizável, o que é completamente lógico e compreensível.
Como posso fazer o Debian gerar endereços MAC diferentes para dispositivos de ponte que estão em máquinas diferentes (ou mesmo na mesma máquina, mas esse não é o meu problema)?
Navegando na Internet, encontrei este relatório de bug no systemd-udev relacionado às pontes do Debian 11: systemd-udev interfere nos endereços MAC das interfaces que não deveria fazer #21185 :
Como você pode ver, as pontes foram criadas com comandos de baixo nível, mas sempre herdam o mesmo valor de endereço MAC: um
systemd
componente interfere e define o endereço MAC. Pode-se ver isso em ação usandoip monitor link
:Você pode ver como o endereço MAC inicialmente aleatório é substituído por um fixo, duas vezes para o mesmo valor para um determinado nome de ponte.
Um outro efeito colateral é que quando a interface é configurada administrativamente UP, o status operacional da ponte se torna DOWN em vez de UNKNOWN inicialmente por causa disso (veja essas minhas respostas em SU e SF mencionando comportamentos sobre DOWN e UNKNOWN: Como o Linux determina o MAC padrão endereço de um dispositivo de ponte? , o endereço de ponte linux ipv6 não funciona quando o endereço mac é forçado ). De qualquer forma, isso não importa mais uma vez que sua primeira porta de ponte esteja conectada.
Fazer o mesmo experimento dentro de um namespace de rede (por exemplo:
ip add netns experiment
eip netns exec experiment bash -l
antes de executar os comandos acima duas vezes) ondesystemd-udevd
não interfere mostrará o comportamento usual de ter endereços aleatórios diferentes a cada vez.Este é um efeito do ecossistema systemd e não acontece em sistemas que não executam o systemd (ou versões mais antigas do systemd). Uma correção proposta é usar:
mas parece que a correção real é alterar o arquivo que participa da geração desse valor "stable random", conforme descrito lá: https://wiki.debian.org/MachineId
Cada máquina deve ter um valor diferente. Isso é especialmente importante para VMs clonadas de um modelo base. A relação entre
machine-id
e a maneira como o endereço MAC "estável" da ponte é gerado é mencionada no patch que implementou a mudança (bastante quebra) :Também foi mencionado que isso teria impactos , mas isso foi ignorado.
Isso não se limita a interfaces do tipo bridge, mas a qualquer interface que gere um endereço MAC aleatório : por exemplo, os tipos
veth
,macvlan
tuntap
também são afetados.Eu pude verificar que o mesmo nome de bridge obteria um valor "stable random" diferente depois de fazer as operações descritas no link do Debian:
dando agora no anterior
ip monitor
um novo endereço MAC para o mesmo nome da ponte: 32:ee:c8:92:9f:e8 em vez de 1a:d0:fc:63:c1:71 ao excluir e recriarbrtest0
.Conclusão:
Como o endereço MAC da ponte agora é definido manualmente, a ponte não herdará mais um dos endereços MAC de outras interfaces definidas como portas de ponte, incluindo as interfaces permanentes usuais (físicas ou VMs) que devem ter um endereço MAC diferente. Dois sistemas usando o mesmo
machine-id
e o mesmo nome de ponte (ex:br0
) com tal ponte participando do roteamento (ou seja: há um endereço IP configurado na ponte, mas mesmo que não a ponte possa emitir outros quadros relacionados à ponte dependendo de suas configurações) na mesma LAN emitirá quadros com o mesmo endereço MAC de origem (pontes), possivelmente interrompendo os switches no caminho e de qualquer maneira ignorando esse mesmo endereço MAC de origem do peer.Você pode dizer ao Debian para clonar o endereço MAC com uma
bridge_hw
diretiva.ex: meu
/etc/network/interfaces
arquivo:Agora ambos
enp2s0
ebr0
têm o mesmo endereço.Em primeiro lugar, a resposta de AB mostra a solução correta. Se você está tendo o mesmo problema, siga a resposta de AB para resolvê-lo da maneira correta.
No entanto, por uma questão de completude, gostaria de mostrar uma solução alternativa (muito inferior). Eu estava sob pressão e não esperava uma resposta correta tão rápido. Portanto, resolvi temporariamente o problema por conta própria, alterando ligeiramente
/etc/network/interfaces
:A última linha é o ponto chave. Faz com que o SO atribua o endereço MAC indicado à ponte. O endereço MAC mostrado é um endereço do intervalo de endereços MAC privado semi-oficial. Verifiquei que esse endereço MAC permanece o mesmo quando você remove ou adiciona dispositivos à ponte.
Obviamente, você deve fornecer a cada ponte um endereço MAC diferente, independentemente de as pontes estarem ou não na mesma máquina.
Novamente, o método acima apenas resolve o problema do endereço MAC da ponte. Acredito que muito mais pode dar muito errado se houver as mesmas IDs de máquina em máquinas diferentes. A resposta de AB menciona como criar uma nova ID de máquina e um teste rápido mostrou que cada ID de máquina criada dessa maneira difere de todas as outras IDs de máquina criadas dessa maneira.