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 服务。