网络与 IP

DHCP 什么意思?工作原理、DORA 四步与机房里的用法

DHCP 是 Dynamic Host Configuration Protocol(动态主机配置协议)的缩写,作用是让设备接入网络后自动拿到 IP 地址、子网掩码、网关和 DNS,不用逐台手工填写。客户端和服务器用 Discover、Offer、Request、ACK 四个报文完成分配,地址有租期、到期前要续租,跨网段时由网关上的 DHCP 中继转发请求。

作者 顶联产品团队发布于 6 分钟阅读

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 中继:

  1. 网关收到客户端的广播 Discover;
  2. 把自己在这个 VLAN 的接口地址填进报文的 giaddr 字段,改成单播发给 DHCP 服务器;
  3. 服务器根据 giaddr 判断请求来自哪个网段,从对应的地址池里分配;
  4. 应答单播回到网关,再由网关转给客户端。

三家设备的中继配置,以 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 服务。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88