Essa é uma daquelas coisas que surpreende as pessoas porque vai contra o que elas aprenderam.
2 máquinas com o mesmo endereço mac de hardware no mesmo domínio de broadcast podem se comunicar muito bem, desde que tenham endereços IP diferentes (e o equipamento de comutação funcione bem).
Vamos começar com uma configuração de teste:
VM1 $ ip addr show dev enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:3c:f9:ad brd ff:ff:ff:ff:ff:ff
inet 169.254.0.2/24 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe3c:f9ad/64 scope link
valid_lft forever preferred_lft forever
VM2 $ ip addr show dev enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:3c:f9:ad brd ff:ff:ff:ff:ff:ff
inet 169.254.0.3/24 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe3c:f9ad/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
Portanto, observe como as duas máquinas têm o mesmo endereço MAC, mas IPs diferentes.
Vamos tentar o ping:
VM1 $ ping -c 3 169.254.0.3
PING 169.254.0.3 (169.254.0.3) 56(84) bytes of data.
64 bytes from 169.254.0.3: icmp_seq=1 ttl=64 time=0.505 ms
64 bytes from 169.254.0.3: icmp_seq=2 ttl=64 time=0.646 ms
64 bytes from 169.254.0.3: icmp_seq=3 ttl=64 time=0.636 ms
--- 169.254.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.505/0.595/0.646/0.070 ms
Então, o host remoto respondeu. Bem, isso é estranho. Vamos olhar para a tabela de vizinhos:
VM1 $ ip neigh
169.254.0.3 dev enp0s8 lladdr 08:00:27:3c:f9:ad REACHABLE
10.0.2.2 dev enp0s3 lladdr 52:54:00:12:35:02 STALE
Esse é o nosso MAC!
Vamos fazer um tcpdump
no outro host para ver se ele está realmente recebendo o tráfego:
VM2 $ tcpdump -nn -e -i enp0s8 'host 169.254.0.2'
16:46:21.407188 08:00:27:3c:f9:ad > 08:00:27:3c:f9:ad, ethertype IPv4 (0x0800), length 98: 169.254.0.2 > 169.254.0.3: ICMP echo request, id 2681, seq 1, length 64
16:46:21.407243 08:00:27:3c:f9:ad > 08:00:27:3c:f9:ad, ethertype IPv4 (0x0800), length 98: 169.254.0.3 > 169.254.0.2: ICMP echo reply, id 2681, seq 1, length 64
16:46:22.406469 08:00:27:3c:f9:ad > 08:00:27:3c:f9:ad, ethertype IPv4 (0x0800), length 98: 169.254.0.2 > 169.254.0.3: ICMP echo request, id 2681, seq 2, length 64
16:46:22.406520 08:00:27:3c:f9:ad > 08:00:27:3c:f9:ad, ethertype IPv4 (0x0800), length 98: 169.254.0.3 > 169.254.0.2: ICMP echo reply, id 2681, seq 2, length 64
16:46:23.407467 08:00:27:3c:f9:ad > 08:00:27:3c:f9:ad, ethertype IPv4 (0x0800), length 98: 169.254.0.2 > 169.254.0.3: ICMP echo request, id 2681, seq 3, length 64
16:46:23.407517 08:00:27:3c:f9:ad > 08:00:27:3c:f9:ad, ethertype IPv4 (0x0800), length 98: 169.254.0.3 > 169.254.0.2: ICMP echo reply, id 2681, seq 3, length 64
Então, como você pode ver, mesmo que o tráfego tenha o mesmo endereço MAC de hardware de origem e destino, tudo ainda funciona perfeitamente.
A razão para isso é que a consulta de endereço MAC chega muito tarde no processo de comunicação. A caixa já usou o endereço IP de destino e as tabelas de roteamento para determinar em qual interface ele enviará o tráfego. O endereço mac que ele adiciona ao pacote vem depois dessa decisão.
Também devo observar que isso depende da infraestrutura da camada 2. Como essas máquinas estão conectadas e o que fica entre elas. Se você tem um switch mais inteligente, isso pode não funcionar. Pode ver este pacote chegando e rejeitá-lo.
Agora, indo para a crença tradicional, de que isso não funciona. Bem, é verdade, de um certo ponto de vista :-)
O problema surge quando outro host na rede precisa falar com qualquer uma dessas máquinas. Quando o tráfego sai, o switch vai direcionar o tráfego pelo endereço MAC de destino e enviar somente para um único host.
Existem alguns motivos possíveis para essa configuração de teste funcionar:
- O tráfego é transmitido para todas as portas ou para todas as portas que o MAC corresponde.
- O switch descarta a porta de origem como uma opção ao determinar a porta de destino.
- O switch é na verdade um switch da camada 3 e é roteado com base no endereço IP, e não no endereço MAC.