DHCP 什麼意思?工作原理、DORA 四步與機房裡的用法
DHCP 是 Dynamic Host Configuration Protocol(動態主機配置協議)的縮寫,作用是讓裝置接入網路後自動拿到 IP 位址、子網掩碼、閘道器和 DNS,不用逐台手工填寫。客戶端和伺服器用 Discover、Offer、Request、ACK 四個報文完成分配,位址有租期、到期前要續租,跨網段時由閘道器上的 DHCP 中繼轉發請求。
DHCP 什麼意思?DHCP 全稱 Dynamic Host Configuration Protocol,中文叫動態主機配置協議,是讓裝置接入網路後自動獲取 IP 位址的協議。一台電腦、手機或者伺服器的網路卡設成“自動獲取”,開機後就會在網路裡廣播請求,DHCP 伺服器從位址池裡挑一個空閒位址,連同子網掩碼、預設閘道器、DNS 一起發給它。整個分配過程是四個報文:Discover(發現)、Offer(提供)、Request(請求)、ACK(確認),取首字母簡稱 DORA。分出去的位址有租期,客戶端要在到期前續租;客戶端和伺服器不在同一網段時,靠閘道器上的 DHCP 中繼把請求轉過去。DHCP 定義在 RFC 2131,選項定義在 RFC 2132,伺服器監聽 UDP 67 連接埠,客戶端使用 UDP 68 連接埠。
DHCP 是什麼:自動分配網路引數的協議
DHCP 的作用
沒有 DHCP,每台裝置都要手工填寫四項引數:IP 位址、子網掩碼、閘道器、DNS。裝置一多,就會出現填錯、重複和改起來麻煩的問題。DHCP 解決的就是這幾件事:
- 自動分配:裝置接入即可上網,不需要知道網路規劃;
- 避免衝突:位址由伺服器統一分配,同一時刻一個位址只租給一台裝置;
- 集中修改:要換 DNS 或閘道器,只改 DHCP 伺服器,客戶端續租時自動更新;
- 回收複用:裝置離開後租期到期,位址自動回到池裡,適合人員、裝置流動大的網路;
- 網路啟動:PXE 裝機時,還沒有作業系統的裸機由網路卡韌體透過 DHCP 拿到位址和引導檔案。
一個 DHCP 系統由哪幾部分組成
| 角色 | 是什麼 | 例子 |
|---|---|---|
| DHCP 客戶端 | 要位址的一方,系統自帶 | Windows 的 DHCP Client 服務,Linux 的 NetworkManager、systemd-networkd、dhclient |
| DHCP 伺服器 | 管理位址池、應答請求的一方 | 家用路由器內建的 DHCP、dnsmasq、Kea、isc-dhcp-server、Windows Server 的 DHCP 角色、三層交換器的 DHCP 服務 |
| DHCP 中繼 | 把廣播請求轉發到其他網段的伺服器 | 三層交換器或路由器的 VLAN 介面 |
DHCP 下發的不只是位址,所有引數都以“選項”的形式放在報文裡。常見選項:
| 選項號 | 名稱 | 內容 |
|---|---|---|
| 1 | Subnet Mask | 子網掩碼 |
| 3 | Router | 預設閘道器 |
| 6 | Domain Name Server | DNS 伺服器 |
| 15 | Domain Name | 域名字尾 |
| 42 | NTP Servers | 時間伺服器 |
| 51 | IP Address Lease Time | 租期,單位秒 |
| 53 | DHCP Message Type | 報文型別:1 Discover、2 Offer、3 Request、4 Decline、5 ACK、6 NAK、7 Release、8 Inform |
| 54 | Server Identifier | 伺服器標識,即伺服器的位址 |
| 66、67 | TFTP Server Name、Bootfile Name | 網路啟動用的 TFTP 伺服器和引導檔案 |
| 82 | Relay Agent Information | 中繼插入的接入位置資訊,例如交換器連接埠 |
DHCP 工作原理:DORA 四步
| 步驟 | 報文 | 源 → 目的 | 關鍵內容 |
|---|---|---|---|
| 1 | DHCPDISCOVER | 0.0.0.0:68 → 255.255.255.255:67,廣播 | 客戶端 MAC、事務號 xid、想要的引數列表(選項 55),可帶上次用過的位址(選項 50) |
| 2 | DHCPOFFER | 伺服器:67 → 客戶端:68,廣播或單播 | 提供的位址(yiaddr 欄位)、伺服器標識(選項 54)、租期、掩碼、閘道器、DNS |
| 3 | DHCPREQUEST | 0.0.0.0:68 → 255.255.255.255:67,廣播 | 選項 54 寫明選中了哪台伺服器,選項 50 寫明要哪個位址 |
| 4 | DHCPACK | 伺服器:67 → 客戶端:68 | 確認分配,租期從此刻開始計算 |
幾個容易想不通的地方:
- 為什麼第一步用 0.0.0.0 和廣播:客戶端此時還沒有位址,也不知道伺服器在哪,只能以 0.0.0.0 為源位址、向全網段廣播。伺服器靠報文裡的客戶端 MAC 和事務號區分是誰在要位址。
- 為什麼 Request 還要廣播:網段裡可能有多台伺服器都發了 Offer。客戶端廣播 Request 並在選項 54 裡寫明選中的伺服器,其餘伺服器看到後,就把自己預留的位址收回。
- ACK 之後客戶端還會檢查一次:多數客戶端拿到位址後會先發 ARP 探測,發現這個位址已經有人在用,就發 DHCPDECLINE 拒絕,重新從 Discover 開始。
- NAK 什麼時候出現:客戶端請求的位址不屬於當前網段時,伺服器回 DHCPNAK。最常見的場景是筆記本從一個網路換到另一個網路,想續用舊位址被拒絕,於是重新走完整的四步。
除了這四個,還有兩個常用報文:客戶端主動釋放位址時發 DHCPRELEASE(Windows 的 ipconfig /release),手工配了靜態位址、只想要 DNS 等其他引數時發 DHCPINFORM。
在 DHCP 伺服器上抓包,可以直接看到這四步:
tcpdump -ni eth1 -v 'udp port 67 or udp port 68'
-v 會把選項 53 解碼出來,依次能看到 Discover、Offer、Request、ACK 四個報文。只看到 Discover 沒有 Offer,問題在伺服器或中繼;有 Offer 沒有 Request,多半是 Offer 沒有回到客戶端。
租期、續租和中繼
租期到一半就開始續租
位址不是永久分配的。按 RFC 2131 的預設計時,以 8 小時租期為例:
| 時間點 | 客戶端做什麼 |
|---|---|
| 0 小時 | 收到 ACK,開始使用位址 |
| 4 小時(T1,租期的 50%) | 單播 Request 給原來那台伺服器續租;成功則租期重新從 8 小時算起 |
| 7 小時(T2,租期的 87.5%) | 原伺服器一直沒回應,改為廣播 Request,任何一台伺服器都可以續租 |
| 8 小時 | 租期屆滿仍未續上,停止使用這個位址,從 Discover 重新開始 |
所以只要伺服器正常,客戶端每隔半個租期續一次,位址一般不會變。租期定多長看網路:訪客 Wi-Fi、會議室這類裝置進進出出的網路用短租期,位址回收快;固定裝置為主的網路用長租期,減少續租流量,DHCP 伺服器短時故障也不至於讓裝置掉線。
跨網段:DHCP 中繼
Discover 是廣播,到閘道器就停了,過不了三層裝置。一個機房幾十個 VLAN,不可能每個 VLAN 放一台 DHCP 伺服器,做法是在每個 VLAN 的閘道器介面上開 DHCP 中繼:
- 閘道器收到客戶端的廣播 Discover;
- 把自己在這個 VLAN 的介面位址填進報文的 giaddr 欄位,改成單播發給 DHCP 伺服器;
- 伺服器根據 giaddr 判斷請求來自哪個網段,從對應的位址池裡分配;
- 應答單播回到閘道器,再由閘道器轉給客戶端。
三家裝置的中繼配置,以 VLAN 30、DHCP 伺服器 10.0.0.10 為例。華為:
dhcp enable
interface Vlanif30
dhcp select relay
dhcp relay server-ip 10.0.0.10
H3C:
dhcp enable
interface Vlan-interface30
dhcp select relay
dhcp relay server-address 10.0.0.10
思科:
interface Vlan30
ip helper-address 10.0.0.10
中繼配好後,伺服器一側必須有這個網段的位址池,並且有到中繼位址(giaddr)的路由,否則請求能到、應答回不去。
DHCP 伺服器怎麼配:dnsmasq、isc-dhcp 與 Windows
下面三個例子做同一件事:為 10.40.0.0/24 分配 .100 到 .199,閘道器 10.40.0.1,租期 8 小時,並給一台 MAC 為 3c:ec:ef:12:34:56 的裝置固定分配 10.40.0.20。
dnsmasq:輕量,適合單個網段和裝機網
# /etc/dnsmasq.d/dhcp.conf
port=0
interface=eth1
bind-interfaces
dhcp-authoritative
dhcp-range=10.40.0.100,10.40.0.199,255.255.255.0,8h
dhcp-option=option:router,10.40.0.1
dhcp-option=option:dns-server,223.5.5.5,223.6.6.6
dhcp-host=3c:ec:ef:12:34:56,10.40.0.20,bmc-a01
log-dhcp
port=0 關閉 dnsmasq 的 DNS 功能,只當 DHCP 伺服器用;log-dhcp 把每次分配的細節寫進日誌,排障時有用。用 dnsmasq --test 檢查語法,systemctl restart dnsmasq 生效,journalctl -u dnsmasq 看日誌。租約記錄在租約檔案裡,Debian 系通常是 /var/lib/misc/dnsmasq.leases。
isc-dhcp-server:老牌,存量系統多
ISC 已在 2022 年底停止維護 ISC DHCP,新部署建議用同一機構的 Kea;但大量現網系統仍在用它,配置也最常見:
# /etc/dhcp/dhcpd.conf
authoritative;
default-lease-time 28800;
max-lease-time 86400;
subnet 10.40.0.0 netmask 255.255.255.0 {
range 10.40.0.100 10.40.0.199;
option routers 10.40.0.1;
option domain-name-servers 223.5.5.5, 223.6.6.6;
}
host bmc-a01 {
hardware ethernet 3c:ec:ef:12:34:56;
fixed-address 10.40.0.20;
}
Ubuntu、Debian 上還要在 /etc/default/isc-dhcp-server 裡寫 INTERFACESv4="eth1" 指定監聽的網路卡。改完先 dhcpd -t -cf /etc/dhcp/dhcpd.conf 檢查語法,再 systemctl restart isc-dhcp-server,租約在 /var/lib/dhcp/dhcpd.leases。伺服器給中繼過來的其他網段分位址時,除了那些網段的 subnet 宣告,還要有監聽網路卡自己所在網段的宣告,否則 dhcpd 會因為找不到對應的 subnet 而不在這塊網路卡上提供服務。
Windows Server:DHCP 伺服器角色
Install-WindowsFeature DHCP -IncludeManagementTools
netsh dhcp add securitygroups
Restart-Service dhcpserver
Add-DhcpServerv4Scope -Name "VLAN40" -StartRange 10.40.0.20 -EndRange 10.40.0.199 -SubnetMask 255.255.255.0 -LeaseDuration 0.08:00:00 -State Active
Add-DhcpServerv4ExclusionRange -ScopeId 10.40.0.0 -StartRange 10.40.0.21 -EndRange 10.40.0.99
Set-DhcpServerv4OptionValue -ScopeId 10.40.0.0 -Router 10.40.0.1 -DnsServer 223.5.5.5,223.6.6.6 -Force
Add-DhcpServerv4Reservation -ScopeId 10.40.0.0 -IPAddress 10.40.0.20 -ClientId "3c-ec-ef-12-34-56" -Name "bmc-a01"
Get-DhcpServerv4Lease -ScopeId 10.40.0.0
Windows 的保留位址要落在作用域的起止範圍內,所以作用域從 .20 開始,再用排除範圍去掉 .21–.99,動態分配的仍然只有 .100–.199。-LeaseDuration 0.08:00:00 的格式是“天.時:分:秒”,即 8 小時。Set-DhcpServerv4OptionValue 預設會校驗 DNS 位址是否可用,加 -Force 跳過校驗。加入了 Active Directory 域的 DHCP 伺服器還要在域中授權(Add-DhcpServerInDC)才會開始分配位址;不在域裡的獨立伺服器不需要。
機房裡怎麼用 DHCP
機房的網路按用途分成幾塊,DHCP 在每一塊裡的角色不一樣:
| 網路 | 位址怎麼來 | 原因 |
|---|---|---|
| 裝機網 | DHCP,只服務登記過的 MAC,短租期 | 裸機沒有系統,網路卡只能靠 DHCP 拿位址和引導檔案 |
| BMC 管理網 | DHCP 保留(按 MAC 固定位址)或靜態 | 新機器上架通電就拿到預定位址 |
| 客戶業務網 | 靜態 IP,在 IP 管理系統裡登記 | 不依賴 DHCP 服務,位址可追溯到客戶 |
| 維運辦公網 | 普通 DHCP | 終端多、流動性大 |
PXE 裝機離不開 DHCP。伺服器從網路卡啟動時,DHCP 應答裡除了位址,還要帶上 TFTP 伺服器位址(報文的 next-server 欄位或選項 66)和引導檔名(file 欄位或選項 67),網路卡韌體據此下載載入程式。裝機網通常是一個單獨的 VLAN,DHCP 伺服器只放在這裡,裝完的系統寫入靜態業務位址,連接埠再切回業務 VLAN。
業務網不跑 DHCP,但要防別人跑。只要有一台客戶伺服器誤裝或誤開了 DHCP 服務,同 VLAN 裡剛開機或正在續租的機器就可能拿到它分的位址和閘道器,隨即斷網。在接入交換器上開啟 DHCP Snooping,只把通往合法伺服器的上聯口設為信任連接埠,其他連接埠發出的 DHCP 應答一律丟棄。
BMC 用 DHCP 保留,要管好 MAC 清單。保留是按 MAC 繫結的,換了主機板或 BMC 模組,MAC 跟著變,原來的保留就失效了,新 MAC 會從動態池裡拿一個隨機位址。所以更換硬體後要同步更新保留記錄。
在管理系統裡怎麼落地
DHCP 伺服器只負責“發位址”,哪個段給裝機用、哪個段給 BMC、哪個段給客戶,需要另有一處統一登記。Toplink DCIM 的 IP 位址管理按 CIDR 錄入位址段,並把段標記為公網 IP、IPMI、客戶內網、內網 IP、臨時 IP 等型別,BMC 網的位址段標成 IPMI 型別,與公網、客戶內網分開統計用量;開通伺服器時,從開啟了自動分配的段裡取業務位址,鎖定的段不會被佔用。裝機這一步,IPMI 遠端管理可以把伺服器的下一次啟動設為 PXE,後面的 DHCP 應答、引導和安裝就交給裝機網完成。
常見問題
一個網段裡能放兩台 DHCP 伺服器嗎?
能。客戶端會收到兩份 Offer,通常接受先到的那一份。前提是兩台的位址池不能重疊,否則可能把同一個位址分給兩台裝置。傳統做法是把位址池按 80/20 拆給兩台;需要兩台同步租約時,用 Kea 的高可用功能或 Windows DHCP 的故障轉移。
DHCPv6 和 DHCP 是一回事嗎?
原理相似,但是獨立的協議:DHCPv6 用 UDP 546(客戶端)和 547(伺服器),報文是 Solicit、Advertise、Request、Reply。IPv6 主機還可以不用 DHCPv6,靠路由器通告自己生成位址;預設閘道器也來自路由器通告,DHCPv6 不下發閘道器。
怎麼知道網路裡是哪台 DHCP 伺服器給我分的位址?
Windows 執行 ipconfig /all,看“DHCP 伺服器”一行;Linux 上可以抓包看 Offer、ACK 報文裡的選項 54(伺服器標識)。如果這個位址不是你們的 DHCP 伺服器,說明網路裡有人私設了 DHCP 服務。