Endereço MAC idêntico em duas VMs diferentes, mas tenho conectividade com a Internet

8

Eu configurei uma rede como tal: Configure a rede somente de host no VirtualBox. O primeiro adaptador é configurado com NAT, o segundo com rede somente host

HOST: Windows
CONVIDADO: CentOS VM1, CentOS VM2 (clone da VM1)

Ao executar o ifconfig -a nas duas VMs, notei que os endereços MAC são exatamente os mesmos. Minha pergunta é como eu sou capaz de ping de VM1 para VM2, considerando que os endereços MAC são os mesmos?

VM1:
eth0      Link encap:Ethernet  HWaddr 08:00:27:AF:A3:28  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:feaf:a328/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:47 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:10671 (10.4 KiB)  TX bytes:5682 (5.5 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:C4:A8:B6  
          inet addr:192.168.56.102  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fec4:a8b6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:859 errors:0 dropped:0 overruns:0 frame:0
          TX packets:41 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:114853 (112.1 KiB)  TX bytes:4823 (4.7 KiB)

 ip -6 addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
        inet6 fe80::a00:27ff:feaf:a328/64 scope link 
           valid_lft forever preferred_lft forever
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
        inet6 fe80::a00:27ff:fec4:a8b6/64 scope link 
           valid_lft forever preferred_lft forever

VM2:

eth0      Link encap:Ethernet  HWaddr 08:00:27:AF:A3:28  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:feaf:a328/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:114 errors:0 dropped:0 overruns:0 frame:0
          TX packets:151 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:41594 (40.6 KiB)  TX bytes:13479 (13.1 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:C4:A8:B6  
          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fec4:a8b6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1900 errors:0 dropped:0 overruns:0 frame:0
          TX packets:78 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:259710 (253.6 KiB)  TX bytes:9736 (9.5 KiB)



ip -6 addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
        inet6 fe80::a00:27ff:feaf:a328/64 scope link 
           valid_lft forever preferred_lft forever
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
        inet6 fe80::a00:27ff:fec4:a8b6/64 scope link tentative dadfailed 
           valid_lft forever preferred_lft forever
    
por user 04.10.2014 / 14:22

2 respostas

15

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:

  1. O tráfego é transmitido para todas as portas ou para todas as portas que o MAC corresponde.
  2. O switch descarta a porta de origem como uma opção ao determinar a porta de destino.
  3. O switch é na verdade um switch da camada 3 e é roteado com base no endereço IP, e não no endereço MAC.
por 04.10.2014 / 18:53
5

Os efeitos de um endereço MAC duplicado podem ser sutis em alguns casos.

Switches distribuem tráfego para hosts com base em endereços "vistos MAC". Quando você liga seu computador e envia seu primeiro pacote para fora da rede, seu switch irá logar em sua tabela MAC que "o endereço MAC X veio da porta Y". Por outro lado, no futuro, quando vir um pacote unicast endereçado ao endereço MAC X, ele saberá enviá-lo para a porta Y.

Como sua VM está em uma única porta de switch físico, cabe ao seu hipervisor (VirtualBox) classificar para onde enviar os pacotes direcionados a esse MAC virtual. No caso de uma duplicata, ela provavelmente a envia para as duas VMs e permite que a pilha da rede em cada VM resolva o problema. (a pilha de rede provavelmente veria que o tráfego foi enviado para seu endereço MAC que não pertencia a um de seus próprios endereços IP, e silenciosamente descartaria o pacote.) Assim, você pode imaginar que isso causaria uma quantidade razoável de trabalho extra, por exemplo. o sistema operacional para ativar e processar cada pacote, enquanto se você tivesse endereços MAC exclusivos, o hardware ou o driver [virtual] poderia descartar o pacote destinado ao outro host, antes de enviá-lo para a pilha.

Em uma rede comutada (ao contrário do exemplo de sua VM), um endereço MAC duplicado faria com que um switch ficasse confuso sobre para onde enviar tráfego. Cada pacote que um host com um MAC duplicado envia normalmente levaria o switch a supor que o host "moveu-se" de uma porta no switch para outro. Se ambos os hosts estivessem enviando e recebendo tráfego na mesma taxa, você esperaria que cada host perdesse 50% de seu tráfego de retorno.

O ARP e o IPv4 podem não estar muito preocupados com endereços MAC duplicados, portanto, a rede IPv4 pode funcionar corretamente. (embora uma pilha robusta, ou um host com ferramentas de segurança / rede adicionais, considere um endereço MAC duplicado como um sinalizador vermelho.) Além disso, se você estiver usando DHCP, um servidor DHCP (sem identificação de cliente suficientemente endereço IPv4 duplicado, o que poderia ser problemático.

Por outro lado, o IPv6 baseia os endereços configurados automaticamente no endereço MAC . O IPv6 também inclui o conceito de detecção de endereço duplicado , o que significa que um endereço MAC duplicado pode causar os seguintes efeitos (de acordo com a RFC 4862, seção 5.4.5):

-  not send any IP packets from the interface,

-  silently drop any IP packets received on the interface, and

-  not forward any IP packets to the interface (when acting as a
   router or processing a packet with a Routing header).
    
por 04.10.2014 / 19:57