两个不同的VM上具有相同的MAC地址,但是我可以连接互联网


8

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

主机:Windows
Guest:CentOS VM1,CentOS VM2(VM1的克隆)

在两个VM上执行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

您确定确实要从VM2 ping VM1,而不是真的ping VM1吗?您可以拥有两台具有相同MAC地址的机器,但前提是它们位于不同的以太网链路上,而在同一主机上使用相同虚拟化软件的两台VM则不是这样。
吉尔(Gilles)“所以

为什么将其作为副本关闭?问题不一样。
Patrick

您是否将一个VM复制到另一个VM?在这种情况下,您需要更改通过“VirtualBox虚拟管理器” - >设置- >适配器1 - >高级- > MAC地址
安森

@吉尔斯。你错了。在同一主机上使用相同虚拟化软件的两个VM可以具有不同的以太网链接。查看VMware Workstation虚拟网络编辑器作为示例。
fpmurphy

1
@khadija,请注意您dadfailedip -6 addr输出中看到。这意味着您的地址无法检测到重复地址,因此IPv6将无法在该接口上使用。
mpontillo 2014年

Answers:


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

 

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

因此,请注意两台计算机的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

因此,远程主机做出了响应。好吧,那很奇怪。让我们看一下邻居表:

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

那就是我们的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

因此,正如您所看到的,即使流量具有相同的源和目标硬件mac地址,一切也仍然可以正常工作。

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

我还应注意,这取决于第二层基础结构。这些机器如何连接以及它们之间的位置。如果您拥有更智能的开关,则可能无法使用。它可能会看到此数据包通过并拒绝它。

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

此测试设置起作用的可能原因有几个:

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

有趣的解释!感谢您提供一些说明。
用户

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).

存在第3层交换机,它们基于IP而不是MAC进行路由。
帕特里克

2
@Patrick我研究过的第3层交换机仍在第2层使用MAC地址。当他们说“第3层交换机”时,通常表示交换硬件也知道如何在第3层路由流量。(充当IP路由器) )对第3层的路由流量与第2层的交换流量的处理方式有所不同(因此,传入的路由数据包可能不会受到丢包的影响,但是同一网络上的第2层交换数据包会受到影响。)但是,您要谈论的是哪个特定的交换机?
mpontillo 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.