? 最近發現,自己使用虛擬機建立的集群,在斷電關機或者關機一段時間后,集群之間的鏈接散了,并且節點自身的 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
則設置成功