前几日在家中遇到一件有趣的事情,与大家分享一下。

起初我有一套硬件 A,安装了 ESXi 与一些虚拟机,后来将 A 上的数据盘与系统盘(U 盘)拆至硬件 B 上,即 ESXi 从 A 迁移到了 B。闲置下来的硬件 A 就被我拿来安装了黑苹果,然而在黑苹果的路上遇到了很多的坑,例如掉帧、黑色块的问题(显卡驱动),蓝牙鼠标掉线的问题(蓝牙驱动),后来甚至发现这套黑苹果访问不了我的虚拟机们,也访问不到 ESXi。这时的我还很天真的以为是虚拟化和黑苹果之间的问题,Google 了一番未果还是换回了 Windows。

变更史

天真我以为这样就已经解决了问题,但结果是并没有什么卵用。同时我发现一直在使用的电脑访问 ESXi 也出现了问题,网络丢包严重,但是访问虚拟机却一点事情也没有。事已至此只能先简单抓包看一下,从硬件 A ping 向 ESXi(硬件 B)的同时,在 ESXi 上使用 tcpdump-uw 进行抓包(通过虚拟机作为跳板机连上 ESXi),结果是硬件 A 正常发送 ARP 请求,但是 ESXi 这里并没有收到 A 发送的请求。

到这里我基本断定是 ARP 的问题,但是为啥 ESXi 收不到我发出来的 ARP 包,其他的硬件却都能收到,我不得而知。但是为了验证我的猜想,我决定先在 Windows 上静态绑定一下 ARP 记录。

# 先用 netsh 找到对应 interface 的 idx
netsh i i show in   # netsh interface ipv4 show interfaces

# 绑定 IP-MAC
netsh -c "i i" add ne <idx> <IP> <MAC>  # netsh -c "interfaces ipv4" add neighbors <idx> <IP> <MAC>

# 也可以直接用 arp 命令进行临时绑定
arp -s <IP> <MAC>

这里 ESXi 的 MAC 是从虚拟机 ARP 获得的,因为目前只有虚拟机访问 ESXi 比较正常。绑定完 MAC 地址后我又信誓旦旦进行验证,结果网络依然不通!!WTF??到底发生甚么事了了?一开始以为 MAC 地址写错了,反复比对后确认了 MAC 地址并没有问题,那么为啥虚拟机用这个 MAC 地址可以 ping 通 ESXi,我用这个 MAC 就不行呢?

后来我怀疑是交换机的问题,我众多设备不是都接在同一个交换机上的,实际上是两个串联的傻瓜交换机,客厅一个卧室一个,而 ESXi 在客厅,实验的两台电脑在卧室。但是这个不成熟的猜想瞬间就被我给否定了,毕竟客厅和卧室里其他的设备互联都没有问题。

就在我一筹莫展把注意力集中到 Windows 的网络配置上时,我突然发现了一个神奇的事情 —— 硬件 B Windows 的 MAC 地址为啥和我 ESXi 一摸一样??这真是见了鬼了,两个不同硬件为啥会有相同的 MAC 地址!难道是因为 ESXi 迁移的时候 MAC 地址并没有跟着硬件走?毕竟 ESXi 的管理地址是在 VMKernel 上的,这并不是一个物理接口。

简单了搜了一下,在 VMware 的 KB 中确实有这样的记载 —— 更换网卡后或 vmkernel 的 MAC 地址重复时 vmk0 管理网络 MAC 地址不更新。如果已经冲突了就只能删除原来的管理端口,重新创建,但是我这台 ESXi 只有一个网络接口,如果删了的话就只能连上显示器去配置了,所以为了省事就在 Web 界面先添加一个端口,再删除原来的即可。

如果要配置静态的 IP 地址又不想接显示器的话,可以 SSH 到 ESXi 后进行如下操作

TERM=xterm
dcui

ESXi 控制台
绝对的懒人福音!!

重建了管理端口后,没有了 MAC 地址冲突,硬件 A 的 Windows 又满血复活了,这件事情告诉我们,没事别特么的拆东墙补西墙!