我在所有机器上都使用 CentOS 7(除了下面提到的 Mac)。主机有 VirtualBox 5.1.8。网络是 192.168.10.0/24。任何地方都没有防火墙。
在这种情况下,一切都按预期进行:
没有任何标记,主机和客户机可以通过任何端口、任何 IP 进行通信。每个客户机上的网络接口都是桥接的。这里的生活很美好。
此方案失败:
我在主机和每个客户机上创建了 VLAN 接口。我们将其称为 eth0.10。每个客户机继续使用 eth0(因为使用 eth0.10 会有效地将其从网络中移除)。每个客户机上的网络接口都是桥接的。
注意:当我在这里提到 ping 时,我意识到那只是 ICMP,但我的测试还包括 TCP 测试。为简洁起见,使用 ping。
我现在可以 ping 客户机 (192.168.10.5) 到客户机 (192.168.10.10),但无法 ping 客户机 (.10.5) 到主机 (.10.50)。主机 (.10.50) 到客户机 (.10.5 或 .10.10) 也行不通。
当我将客户机 (.10.5 或 .10.10) ping 到其他物理系统(Mac/OS X,也在 VLAN10 (.10.200) 中)时,我得到了响应。当我将主机 (.10.5) ping 到 Mac (.10.200) 时,我得到了响应。反之亦然。
我还在 Mac (.10.200) 上运行了 Wireshark(数据包嗅探器)。我使用了过滤器“vlan host 192.168.10.5”,我可以在数据包中看到 vlan id 10!vlan 10 中的每个主机都是如此。
因此,除了主人之外,所有人都可以看到客人。客人都可以看到彼此,也可以看到其他人,但看不到主人。很疯狂吧?
我读过一些关于打开 Vswitch但我不知道这是否是我需要的。似乎我忽略了一些基本的东西,但我现在已从很多角度检查了这项工作。
任何建议将不胜感激!
答案1
我能够复制您的确切场景。
这是我的测试环境
+---------------------------------------------------------+ +-----------------------------------------+
| | | |
| Mac OS X El Capitan | | Mikrotik router board |
| Host is also setup with vlan0 VLAN ID 20 | | |
| 192.168.10.3 | | |
| | | |
| Both VMs are bridged to en0 |en0 Trunk | VLAN 20 192.168.10.250 |
| +-----------------------------------------------------------------------------+ VLAN 30 192.168.30.250 |
| | | | VLANs 20 and 30 | |
| +------------------+ +-------------------+ | | |
| | | | | | | |
| | Cent OS 7 | | Cent OS 7 | | | |
| | Node 1 | | Node 2 | | | |
| | | | | | | |
| | 192.168.10.2 | | 192.168.10.4 | | +-----------------------------------------+
| +------------------+ +-------------------+ |
| VLAN 20 VLAN 20 |
+---------------------------------------------------------+
完全相同的事情发生了。
当两个虚拟机都桥接到 en0 时:
- 它们可以互相 ping 通。192.168.10.2 < -- > 192.168.10.4
- 他们可以 ping 离开 Mikrotik 的 VLAN 20 Int 192.168.10.250,因此他们具有外部世界连接。
- Mac 主机也设置了 vlan0 VLAN ID 20 192.168.10.3 可以 ping Mikrotik
- 虚拟机无法 ping 通主机,主机也无法 ping 通虚拟机。
当将虚拟机桥接到 vlan0 而不是 en0 时 - 它们会失去与外界的连接(无法 ping mikrotik)
因此,这种情况确实与使用 macvtap 在 KVM 中完成桥接的方式非常相似。使用 macvtap 时,虚拟机无法与主机通信,因此这里解释了这个问题https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/App_Macvtap.html
这种情况实际上并不是错误 — 这是 macvtap 的定义行为。由于主机的物理以太网连接到 macvtap 网桥的方式,从客户机转发到物理接口的进入该网桥的流量无法反弹回主机的 IP 堆栈。此外,从主机的 IP 堆栈发送到物理接口的流量无法反弹回 macvtap 网桥以转发给客户机。
看来桥接 VLAN 也采用了同样的机制。我不确定,只是猜测。
编辑:我从 rackspace 找到了这个博客,它准确地解释了这个问题http://blog.rackspace.com/vms-vlans-and-bridges-oh-my-part-2