最近发现,自己使用虚拟机建立的集群,在断电关机或者关机一段时间后,集群之间的链接散了,并且节点自身的 IP 也发生了变化,发现是 DHCP 的问题,这里记录一下。
DHCP
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种用于自动分配IP地址、网关、DNS服务器等网络参数的协议,使得设备可以在网络中无需手动配置即可获得正确的网络设置。
DHCP的工作流程
DHCP采用客户端-服务器架构
- **DHCP Discover(发现)
设备(客户端)加入网络后,发送广播请求 (DHCPDISCOVER
) 询问是否有可用的IP地址。 - **DHCP Offer(提供)
DHCP服务器收到请求后,提供一个可用的IP地址 (DHCPOFFER
) 并发送给客户端。 - **DHCP Request(请求)
客户端收到多个服务器的DHCPOFFER
时,会选择一个并发送DHCPREQUEST
请求,表明自己想要这个IP。 - **DHCP Acknowledge(确认)
DHCP服务器最终确认分配 (DHCPACK
),并将IP地址、子网掩码、网关、DNS等信息发送给客户端,配置完成。
DHCP的常见配置
- DHCP服务器:管理IP地址分配,一般由路由器、Windows/Linux服务器等设备提供
- DHCP客户端:请求并获取IP地址
- DHCP中继(Relay):用于跨网段转发DHCP请求,使得不同子网的客户端也能获取IP地址
在 DHCP(动态主机配置协议)中,IP 地址的租期(Lease Time)决定了客户端何时需要重新请求 DHCP 服务器分配 IP
DHCP 命令
使用 dhclient
查看 DHCP 租期信息
使用 dhclient
sudo dhclient -v -d
如果想查看当前租约信息,可以检查 lease 文件
cat /var/lib/dhcp/dhclient.leases
手动释放 IP 后重新申请
使用 DHCP 更改 IP
sudo dhclient -r ens18 # 释放当前 DHCP IP
sudo dhclient -v ens18 # 重新申请 DHCP IP
但是,这种方法更换的 IP 取决于 DHCP 的分配策略,更改后的 IP 也是随机的,如果想要指定更换 IP (前提是 IP 没有冲突,申请的 IP 并没有被分配给其他的节点)
修改 dhclient.conf
申请特定 IP
通过配置文件申请,修改 dhclient.conf
发送 dhcp-requested-address
sudo dhclient -v -r ens18 # 释放当前租约
sudo dhclient -v ens18 -sf /bin/true
更改 /etc/dhcp/dhclient.conf
文件,添加如下配置
interface "ens18" {send dhcp-requested-address 172.100.0.120
}
然后向 DHCP 发送请求
sudo dhclient -v ens18
注意,这里只是请求,请求分配我们想要的指定的 IP,但是如果申请的 IP 出现冲突,则 DHCP 服务器不会给予分配
下面是正常情况下的执行情况
如果有权限,可以在 DHCP 服务器上绑定 MAC 地址,这样每次 DHCP 分配给节点的 IP 都是固定的
设置静态IP
但是呢,使用 DHCP 为节点设置指定 IP,在遇到下一次断电或者长时间未重启还是会变化 IP ,所以我们可以设置静态 IP
DHCP 服务器上设置静态 IP
这里最推荐的是,有DHCP管理权限的话,登录DHCP服务器,将 IP 绑定指定节点 MAC 地址
使用命令获取客户端的 MAC 地址 bc:24:11:ea:14:01
ip link show ens18
ifconfig ens18 | grep ether
在 DHCP 服务器上,编辑 /etc/dhcp/dhcpd.conf
sudo nano /etc/dhcp/dhcpd.conf
在 subnet
配置块中,添加以下内容
host my-static-device {hardware ethernet bc:24:11:6f:82:13; # 客户端的 MAC 地址fixed-address 172.100.0.109; # 希望分配的静态 IP
}
确保 subnet
也包含这个 IP 段
subnet 172.100.0.0 netmask 255.255.0.0 {range 172.100.0.100 172.100.0.200;option routers 172.100.0.1;option domain-name-servers 8.8.8.8;
}
重启 DHCP 服务器
sudo systemctl restart isc-dhcp-server
或者:
sudo service isc-dhcp-server restart
在客户端重新获取 IP
sudo dhclient -r ens18 # 释放当前 IP
sudo dhclient -v ens18 # 重新获取 IP
如果一切配置正确,客户端应该会获取 172.100.0.120
客户端手动配置静态 IP
如果没有 DHCP 管理权限或者无法操作 DHCP 服务器
那么也可以在客户端设置静态IP
编辑设置 /etc/netplan
下的 /etc/netplan/00-installer-config.yaml
修改之前,建议先备份当前 Netplan 配置
sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
获取 默认网关
ip route | grep default
route -n
DNS 服务器
cat /etc/resolv.conf
network:ethernets:ens18:dhcp4: noaddresses:- 172.110.0.120/24routes:- to: defaultvia: 172.110.0.1 # 默认网关nameservers: # DNS 服务器addresses:- 127.0.0.53 - 10.96.0.10version: 2
应用配置
sudo netplan apply
则设置成功