我通过 VirtualBox 6.0 上的 GUI 创建了一个启用 dhcp 的新 nat 网络,并将 2 个客户虚拟机连接到该网络,但即使它们同时运行,也会一直为这两个虚拟机分配相同的 IP。
- 主机:Ubuntu 桌面 18.04。
- 访客 A:Ubuntu Server 18.04。08:00:27:33:ac:c6
- 访客 B:Ubuntu Server 18.04. 08:00:27:b9:41:77(从访客 A 克隆)
我检查了 VirtualBox 第一次启动虚拟机后生成的 NatNetwork-Dhcpd.leases 文件,发现两个虚拟机的租约都显示为“已确认”,但即使它们有不同的 MAC 地址,也获得了相同的 IP。
<?xml version="1.0"?> <Leases version="1.0"> <Lease mac="08:00:27:b9:41:77" id="ffe2343f3e00020000ab117f957fa5c66cfffd" network="0.0.0.0" state="acked"> <Address value="10.0.2.4"/> <Time issued="1565568632" expiration="1200"/> </Lease> <Lease mac="08:00:27:33:ac:c6" network="0.0.0.0" state="acked"> <Address value="10.0.2.4"/> <Time issued="1565568546" expiration="1200"/> </Lease> </Leases>
我还注意到,如果我关闭客户机 A 并再次打开它,那么 NatNetwork-Dhcpd.leases 会删除ID属性到客户 B 的租约部分,并将其添加到客户 A 的租约部分,并使用完全相同的值修改文件,如下所示:
<?xml version="1.0"?> <Leases version="1.0"> <Lease mac="08:00:27:b9:41:77" network="0.0.0.0" state="acked"> <Address value="10.0.2.4"/> <Time issued="1565568632" expiration="1200"/> </Lease> <Lease mac="08:00:27:33:ac:c6" id="ffe2343f3e00020000ab117f957fa5c66cfffd" network="0.0.0.0" state="acked"> <Address value="10.0.2.4"/> <Time issued="1565576544" expiration="1200"/> </Lease> </Leases>
我的VirtualBox nat网络如下:
<NetserviceRegistry> <DHCPServers> <DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="192.168.56.100" networkMask="255.255.255.0" lowerIP="192.168.56.101" upperIP="192.168.56.254" enabled="1"/> <DHCPServer networkName="NatNetwork" IPAddress="10.0.2.3" networkMask="255.255.255.0" lowerIP="10.0.2.4" upperIP="10.0.2.254" enabled="1"> <Options> <Option name="3" value="10.0.2.1"/> <Option name="6" value="10.0.2.1"/> </Options> </DHCPServer> </DHCPServers> <NATNetworks> <NATNetwork networkName="NatNetwork" network="10.0.2.0/24" ipv6="0" ipv6prefix="fd17:625c:f037:2::/64" advertiseDefaultIPv6Route="0" needDhcp="1" enabled="1"> <Mappings> <Loopback4 address="127.0.0.1" offset="2"/> </Mappings> </NATNetwork> </NATNetworks> </NetserviceRegistry>
任何帮助将非常感激。
答案1
经过更多的研究和反复试验,我发现
问题原因是 Ubuntu 18.04 的内置网络配置不再使用 NIC Mac 地址作为 DHCP 请求的默认 id。(anneb,2018,第 1 段)。
还有
Mos DHCP 客户端(包括 dhclient)提供类型为“01”(基于 MAC)的客户端 ID 字段。另一种常见类型是“00”(域名)。但是,默认情况下,systemd-networkd 会提供从 /etc/machine-id 的内容生成的“不透明”客户端 ID。
根据 DHCP 协议,租约首先由客户端 ID 选择(只要客户端提供“客户端 ID”选项,该选项可能是或可能不是基于 MAC 的),然后仅当客户端未发送 ID 时才由 MAC 地址选择。(grawity,2018,第4-5段)。
所以我在 Guest B 中以 hvd 的方式生成了一个新的 /etc/machine-id 文件(2017 年,np)。建议:
验证 /var/lib/dbus/machine-id 是否是 /etc/machine-id 的符号链接
$ sudo ls -l /var/lib/dbus/machine-id lrwxrwxrwx 1 root root 15 Aug 1 17:18 /var/lib/dbus/machine-id -> /etc/machine-id
删除 /etc/machine-id
sudo rm -f /etc/machine-id
重新生成 /etc/machine-id
sudo dbus-uuidgen --ensure=/etc/machine-id
重启虚拟机
sudo init 6
登录并验证新 IP 地址已分配给访客 B
$ ip addr show enp0s3 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:b9:41:77 brd ff:ff:ff:ff:ff:ff inet 10.0.2.5/24 brd 10.0.2.255 scope global dynamic enp0s3 valid_lft 1070sec preferred_lft 1070sec inet6 fe80::a00:27ff:feb9:4177/64 scope link valid_lft forever preferred_lft forever
答案2
我遇到了类似的问题基础机器(Ubuntu 18.04)。对我来说,这基本上是一个带有用户帐户的全新安装。我从未运行过这台机器,而是从中克隆新机器。但所有克隆都获得了相同的 IP,即使我给了它们新的 MAC。但在阅读了你的帖子并稍微摆弄了一下后,我像这样解决了这个问题基础机器:
- 删除
/etc/machine-id
和/var/lib/dbus/machine-id
。 - 创建一个空的
/etc/machine-id
。 - 给予
/etc/machine-id
适当的权限(这似乎不是严格必要的,但最初就是这样)。 - 关闭机器并绝不重新启动否则您将必须重复上述步骤!
或者用代码:
sudo rm /etc/machine-id /var/lib/dbus/machine-id
sudo touch /etc/machine-id
sudo chmod 444 /etc/machine-id
sudo shutdown -h now
现在基础机器可以安全地克隆,并且每台新机器machine-id
在第一次启动时都会生成自己唯一的。
新的/etc/machine-id
将自动生成systemd-machine-id-setup
如果它是只读的并且未初始化,则在启动时。