两个不同虚拟机上的 MAC 地址相同,但我有互联网连接

use*_*ser 8 networking ip ethernet mac-address

我已经设置了一个网络:在 VirtualBox 上设置仅主机网络。第一个适配器配置了 NAT,第二个适配器配置了仅主机网络

主机:Windows
来宾:CentOS VM1、CentOS VM2(VM1 的克隆)

在两个虚拟机上执行 ifconfig -a 时,我注意到 MAC 地址完全相同。我的问题是,考虑到 MAC 地址相同,我如何能够从 VM1 ping 到 VM2?

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
Run Code Online (Sandbox Code Playgroud)

phe*_*mer 15

这是让人们感到惊讶的事情之一,因为它违背了他们的教导。
同一广播域上具有相同硬件 mac 地址的 2 台机器可以相互通信,只要它们具有不同的 IP 地址(并​​且交换设备很好用)。

让我们从测试设置开始:

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
Run Code Online (Sandbox Code Playgroud)

 

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
Run Code Online (Sandbox Code Playgroud)

所以请注意两台机器如何具有相同的 MAC 地址,但不同的 IP。

让我们尝试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
Run Code Online (Sandbox Code Playgroud)

所以,远程主机响应了。嗯,这很奇怪。让我们看看邻居表:

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
Run Code Online (Sandbox Code Playgroud)

那是我们的MAC!

让我们tcpdump在另一台主机上做一个,看看它实际上正在获取流量:

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
Run Code Online (Sandbox Code Playgroud)

因此,如您所见,即使流量具有相同的源和目标硬件 mac 地址,一切仍然正常运行。

其原因是 MAC 地址查找在通信过程中非常晚。这个盒子已经使用了目标 IP 地址和路由表来确定它将在哪个接口上发送流量。它添加到数据包中的 mac 地址出现在该决定之后。

我还应该指出,这取决于第 2 层基础设施。这些机器是如何连接的,它们之间有什么。如果你有一个更智能的开关,这可能不起作用。它可能会看到这个数据包通过并拒绝它。

现在,继续传统的信念,认为这是行不通的。从某种角度来看,这是真的:-)
当网络上的另一台主机需要与这些机器中的任何一台通信时,就会出现问题。当流量出去时,交换机将通过目标 mac 地址路由流量,并且只会将其发送到单个主机。

此测试设置有效的可能原因有以下几个:

  1. 流量被广播到所有端口,或者广播到 MAC 匹配的所有端口。
  2. 交换机在确定目的端口时会丢弃源端口作为一个选项。
  3. 交换机实际上是第 3 层交换机,并且基于 IP 地址而不是 mac 地址进行路由。


mpo*_*llo 5

在某些情况下,重复 MAC 地址的影响可能很微妙。

交换机根据“可见的 MAC”地址将流量分配给主机。当您打开计算机并在网络上发送第一个数据包时,您的交换机将登录其 MAC 表“MAC 地址 X 来自端口 Y”。反过来,以后当它看到寻址到 MAC 地址 X 的单播数据包时,它知道将它发送到端口 Y。

由于您的 VM 仅位于单个物理交换机端口上,因此由您的虚拟机管理程序 (VirtualBox) 决定将定向到该虚拟 MAC 的数据包发送到何处。在重复的情况下,它可能只是将它发送到两个 VM,并让每个 VM 上的网络堆栈对其进行排序。(网络堆栈可能会看到流量被发送到不属于它自己的 IP 地址之一的 MAC 地址,并默默地丢弃数据包。)所以你可以想象这会导致相当多的额外工作,因为操作系统唤醒并处理每个数据包,而如果您有唯一的 MAC 地址,[虚拟] 硬件或驱动程序可能会在将其发送到堆栈之前丢弃用于其他主机的数据包。

在交换网络上(与您的 VM 示例不同),重复的 MAC 地址会导致交换机对发送流量的位置感到困惑。具有重复 MAC 的主机发出的每个数据包通常会导致交换机推测主机从交换机上的一个端口“移动”到另一个端口。如果两台主机以相同的速率发送和接收流量,您会期望每台主机丢失 50% 的返回流量。

ARP 和 IPv4 可能不太关心重复的 MAC 地址,因此 IPv4 组网可能会正常工作。(尽管强大的堆栈或具有附加安全/网络工具的主机可能会将重复的 MAC 地址视为危险信号。)此外,如果您使用 DHCP,DHCP 服务器(缺少足够唯一的客户端 ID)可以分配一个重复的 IPv4 地址,这可能有问题。

另一方面,IPv6 基于 MAC 地址自动配置地址。IPv6 还包括重复地址检测的概念,这意味着重复的 MAC 地址可能会导致以下影响(根据 RFC 4862 第 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).
Run Code Online (Sandbox Code Playgroud)

  • @Patrick 我工作过的第 3 层交换机仍然在第 2 层使用 MAC 地址。当他们说“第 3 层交换机”时,他们通常意味着交换硬件也知道如何在第 3 层*路由*流量。(充当IP 路由器)第 3 层的路由流量与第 2 层的交换流量的处理方式不同。(因此传入的路由数据包可能不会受到数据包丢失的影响,但同一网络上的第 2 层交换数据包会。)但是您是哪个特定的交换机谈论? (2认同)