我们虚拟机之前的网卡配置是交给 init的 networking 服务来管理的, 具体配置不同系统系统可能不一样。 比如 Debian/Ubuntu系列操作系统配置在 /etc/network/interfaces文件中, 而Redhat/CentOS系列操作系统配置在 /etc/sysconfig/network-scripts/ifcfg-XXX 网卡配置中。

但是如果我们希望所有网卡通过 DHCP 动态获取IP地址, 那我们就需要在对应的网卡配置中, 配置动态获取功能。 例如 Ubuntu

# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug eth1
iface eth1 inet dhcp

如果我们网卡数量较多, 就需要在网卡配置文件中添加所有网卡的 dhcp 配置信息。 但是有些时候我们又不定有多少张网卡的化, 那这种配置就带来很大问题。 无法提前预制好配置。 当然有个比较low的办法就是在network服务启动之前, 添加一个服务采集所有网卡名称, 将dhcp的配置写进去。这种方式最大的问题, 就是要添加自定义网卡配置采集和配置服务, 同时要求该服务要在网络服务启动之前启动。但是这种基础服务, 要我们插入我们自定义的服务才能,还是不能酸完美

较新的发行版, 都使用systemd作为init进程, 为什么网络服务还在使用 /etc/init.d/networking服务? 所以查找了下 systemd 下的网络管理模块,可以使用 systemd-networkd来管理网卡配置。

对于我们的需求, 可以使用模式匹配模式, 比如 eth* 来匹配所有 eth0/eth1/...等等网卡。在 /etc/systemd/network/50-dhcp.network 配置如下:

[Match]
Name=eth*

[Network]
DHCP=ipv4

相比 /etc/init.d/networking 最后使用 dhclient 来进行dhcp操作, 默认是将网卡的 mac 作为 DHCP 的 Client ID,而 systemd-networkd 模式则是有 networkd 程序处理 DHCP请求。

因此在按 /etc/systemd/network/50-dhcp.network 这种模式配置, 所有网卡以及所有虚拟机通过DHCP获取的IP变成了同样的。查找 systemd-networkd 的配置选项之后, dhcp部分有如下选项

[DHCP]
ClientIdentifier=duid

使用什么样的 DHCPv4 客户端标识符: "mac" 表示连接的MAC地址; "duid" 表示一个符合RFC4361规范的客户端ID(也就是 IAID 与 DUID 的组合); "duid-only" 表示仅使用 DUID (可能与 RFC 规范不兼容,但某些场合需要这样做)。 默认值是 "duid"

默认是使用 duid 来作为 DHCP 客户端的标识, 而 duid 又依赖 /etc/machine-id, 因为所有虚拟机的都是基于同一个原始qcow2镜像, 我们并没有清理 /etc/machine-id 的内容。因此相当于所有虚拟机均使用的同样的 /etc/machine-id, 导致最终 DHCP Server来分配IP的时候, 发现所有请求都是基于同一个 客户端标识, 因此分配同样的IP给客户端。问题找到, 最终的配置如下:

[Match]
Name=eth*

[Network]
DHCP=ipv4

[DHCP]
ClientIdentifier=mac

将 ClientIdentifier指制定为根据 mac 地址来分配IP, 就不存在上述问题了。

【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!
https://cloud.tencent.com/act/cps/redirect?redirect=1068&cps_key=e4b50f6c64a4480367f8a8d16fd07c5a&from=console

标签: network, interface, centos, redhat, systemd, system-networkd, dhcp, debian, ubuntu, duid, mac

添加新评论