背景

虚拟化嵌套

今天在ESXi的虚拟化平台下,通过虚拟机搭建了一台Linux KVM的虚拟化服务器,
然后在KVM服务器中又再次虚拟安装了一台CentOS8GuestOS

ESXi ---虚拟---> Linux KVM ---虚拟---> CentOS8 Guest
架构如下:
ESXi-KVM.png

问题

KVM 内部的二层虚拟机与外部 Lan 网络无法通信

从网络架构上来说KVM和最里面Guest OS的网卡都是桥接模式,理论上应该能与ESXi所接入的物理LAN网络之间正常通讯,且应该可以通过物理网络中的防火墙正常访问Internet才对。

但是实际情况是二次虚拟的CentOS8pingLinux KVMIP但无法与同网段的其他任何IP通讯;
确定CentOS8发出的数据包出不了KVM的范围,也就是到不了ESXi外面的网络,在物理Lan的防火墙上抓包也看不到任何从CentOS8发出的数据包;

尝试开启了Linux KVMnet.ipv4.ip_forward转发也不行

分析CentOS8能正常与它的宿主KVM的IP通讯,说明CentOS8的网络配置和KVM的桥接设定都是没有问题的;
那么应该只有一种可能,就是 ESXi 阻止了KVM对外发送数据包的传输;

这里有一个概念,在ESXi的视角Linux KVM是他内部的一个普通Guest主机,那么ESXi会通过虚拟交换机vSwitch0或者是端口组来管理这个Guest主机所发出的数据帧,且默认规则是Guest主机的一个虚拟网卡有且也只能允许用一个固定的MAC地址来发送自己的数据包,这是一个接入网络的普通终端所应该具有的正常行为;

但是我们在ESXi内部虚拟的这台Linux KVM它不是一台普通接入的终端,它的虚拟网卡(KVM系统内部的eth0网卡)实际是与KVM内部二次虚拟的CentOS8的虚拟网卡进行桥接的,当CentOS8要对外部网络发送数据时,Linux KVM需要通过自己的eth0网卡作为网桥来进行二层的桢转发,此时数据帧的源MAC地址会封装成CentOS8的网卡MAC,这种行为在ESXivSwitch0看来,就是MAC地址伪造,它的Guest主机(Linux KVM)的网卡在用其他的MAC(CentOS8的虚拟网卡MAC地址)地址发出数据帧,这种情况默认ESXi是禁止的,数据帧会被vSwitch0直接丢弃,自然外部网络就收不到任何来自CetnOS8发出的数据包了;

解决方案

配置ESXi上的vSwitch虚拟交换机,将安全设置中的混杂模式伪传输这两项设置为允许即可,如下图:
vSwitch.png

不过修改vSwitch的设置会影响到所有连接到这个交换机的虚拟机,
如果只希望针对个别的虚拟机开启混杂模式伪传输,可以为这些虚拟机单独建立一个端口组portgroups,然后在该端口组的安全设置中开启混杂模式伪传输,设置如下:
portgroup.png

经过测试验证,混杂模式伪传输这两项要同时允许才可以恢复通讯,
MAC地址更改选项似乎对这个问题并没有影响,建议保持默认不启用;

Last modification:August 18, 2022
如果觉得我的文章对你有用,请随意赞赏