一次vmvare虚拟dhcp排查
使用vmvare虚拟机时,利用克隆功能复制了四台ubuntu虚拟机,并更改了对应的mac地址,但是开机发现会抢占ip地址,之前使用centos并无这种问题
出现这种差异,根本原因在于 Ubuntu 和 CentOS 在网络组件和 DHCP 客户端标识符(Client ID)的默认机制上不同。
1. CentOS:默认基于 MAC 地址(认“硬件”)
CentOS(尤其是常用的 CentOS 7)主要使用 NetworkManager 或传统的 network 脚本。
- 当系统向 DHCP 服务器请求 IP 时,默认提取网卡的物理 MAC 地址作为设备的唯一标识。
- 当你在 VMware 中克隆虚拟机(并选择“我已复制它/I copied it”)时,VMware 会自动为新克隆的虚拟机网卡生成一个新的 MAC 地址。
- 因为 MAC 地址改变了,DHCP 服务器会将其识别为一台全新的物理设备,自然就会分配一个不冲突的新 IP。
2. Ubuntu:默认基于 Machine ID(认“系统”)
现代 Ubuntu(18.04 及以后版本)全面转向了 Netplan 和 systemd-networkd 作为底层网络管理工具。
- 为了遵循较新的网络标准(RFC 4361),Ubuntu 默认不再使用 MAC 地址作为 DHCP 标识,而是使用系统级文件
/etc/machine-id生成一串哈希值作为客户端标识。 - 虚拟机克隆是磁盘级别的完全复制,因此克隆出来的四台 Ubuntu,其内部的
/etc/machine-id文本内容完全一模一样。 - 结果是:尽管 VMware 已经给四台虚拟机分配了不同的 MAC 地址,但 Ubuntu 系统内部在发送 DHCP 请求时,依然递交了相同的“身份证号”。路由器或 DHCP 服务器收到相同的 ID,就会认为这是同一台设备在不同端口上反复请求,从而把同一个 IP 轮流分配给它们,导致互相抢占和网络断连。
总结:
CentOS 依赖硬件属性(MAC 地址)获取 IP,VMware 会自动处理硬件属性的变化;而 Ubuntu 依赖系统内部文件属性(Machine ID),克隆机制不会去修改系统内部的文件内容,从而导致冲突。
解决办法
问题原因
在 VMware 中克隆 Ubuntu 虚拟机时,系统会连同 /etc/machine-id 文件一起复制。现代 Ubuntu 系统(使用 Netplan/systemd-networkd)默认使用 machine-id 而不是物理 MAC 地址作为 DHCP 客户端的唯一标识符(Client ID)。
因此,即使 VMware 为克隆的虚拟机分配了不同的 MAC 地址,路由器或 DHCP 服务器仍会读取到相同的 machine-id,将其判定为同一台设备,从而给所有克隆机分配同一个 IP 地址,导致 IP 抢占和冲突。
解决方案
你可以通过以下两种方法解决该问题。建议在每一台被克隆的虚拟机上执行。
方法一:重新生成 Machine ID(推荐)
为每台虚拟机生成全局唯一的 ID,使其被 DHCP 服务器识别为独立的设备。
- 清空现有的
machine-id:
sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id
- 重新生成新的
machine-id:
sudo systemd-machine-id-setup
sudo ln -s /etc/machine-id /var/lib/dbus/machine-id
- 重启虚拟机使配置生效:
sudo reboot
方法二:修改 Netplan 强制基于 MAC 地址获取 IP
修改网络配置,让系统恢复传统的基于 MAC 地址向 DHCP 申请 IP 的模式。
- 编辑 Netplan 配置文件(文件名通常类似于
00-installer-config.yaml或50-cloud-init.yaml):
sudo nano /etc/netplan/*.yaml
- 找到对应网卡(例如
ens33或eth0)的配置,在dhcp4: true下方添加dhcp-identifier: mac,注意 YAML 的缩进:
network:
version: 2
ethernets:
ens33:
dhcp4: true
dhcp-identifier: mac
- 应用更改:
sudo netplan apply
补充检查:VMware 物理 MAC 地址
如果执行上述系统级配置后仍有冲突,请核实 VMware 层面是否正确分配了不同的硬件地址:
- 关闭虚拟机。
- 在 VMware 中右键点击该虚拟机 -> 设置 (Settings)。
- 选择 网络适配器 (Network Adapter) -> 点击 高级 (Advanced)。
- 检查底部的 MAC 地址 (MAC Address),确保四台虚拟机的 MAC 地址均不相同。如果存在相同的 MAC,请点击 生成 (Generate) 重新获取。

浙公网安备 33010602011771号