一次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 及以后版本)全面转向了 Netplansystemd-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 服务器识别为独立的设备。

  1. 清空现有的 machine-id
sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id

  1. 重新生成新的 machine-id
sudo systemd-machine-id-setup
sudo ln -s /etc/machine-id /var/lib/dbus/machine-id

  1. 重启虚拟机使配置生效:
sudo reboot

方法二:修改 Netplan 强制基于 MAC 地址获取 IP

修改网络配置,让系统恢复传统的基于 MAC 地址向 DHCP 申请 IP 的模式。

  1. 编辑 Netplan 配置文件(文件名通常类似于 00-installer-config.yaml50-cloud-init.yaml):
sudo nano /etc/netplan/*.yaml

  1. 找到对应网卡(例如 ens33eth0)的配置,在 dhcp4: true 下方添加 dhcp-identifier: mac,注意 YAML 的缩进:
network:
  version: 2
  ethernets:
    ens33: 
      dhcp4: true
      dhcp-identifier: mac

  1. 应用更改:
sudo netplan apply


补充检查:VMware 物理 MAC 地址

如果执行上述系统级配置后仍有冲突,请核实 VMware 层面是否正确分配了不同的硬件地址:

  1. 关闭虚拟机。
  2. 在 VMware 中右键点击该虚拟机 -> 设置 (Settings)
  3. 选择 网络适配器 (Network Adapter) -> 点击 高级 (Advanced)
  4. 检查底部的 MAC 地址 (MAC Address),确保四台虚拟机的 MAC 地址均不相同。如果存在相同的 MAC,请点击 生成 (Generate) 重新获取。
posted @ 2026-06-11 09:42  韭菜花也是花  阅读(11)  评论(0)    收藏  举报