跳到主要内容

DHCP 动态主机配置协议

在复杂的现代网络中,动态主机配置协议(Dynamic Host Configuration Protocol,简称 DHCP)是不可或缺的基础设施。它负责自动分配合适的 IP 地址及相关配置选项,让网络管理更加高效便捷。理解 DHCP 的工作原理对于网络管理员和运维工程师至关重要。

为什么需要 DHCP

在 DHCP 出现之前,网络管理员需要手动为每台设备配置 IP 地址、子网掩码、网关、DNS 服务器等信息。这种方式存在明显的问题:

  • 配置繁琐:大型网络中可能有成百上千台设备需要配置
  • 容易出错:手动配置容易出现 IP 地址冲突
  • 难以管理:设备移动或更换时需要重新配置
  • 地址浪费:静态分配无法有效利用地址资源

DHCP 通过自动化的地址分配机制解决了这些问题,让设备接入网络变得即插即用。

DHCP 报文格式

DHCP 基于 BOOTP(Bootstrap Protocol)协议,使用 UDP 进行传输。客户端使用端口 68,服务器使用端口 67。

报文结构

DHCP 报文包含以下字段:

字段长度说明
op1 字节报文类型:1=请求,2=响应
htype1 字节硬件地址类型:1=以太网
hlen1 字节硬件地址长度:6=MAC 地址
hops1 字节跳数,中继代理使用
xid4 字节事务 ID,用于匹配请求和响应
secs2 字节客户端启动后经过的秒数
flags2 字节标志位,最高位为广播标志
ciaddr4 字节客户端 IP 地址
yiaddr4 字节"你的" IP 地址(服务器分配的地址)
siaddr4 字节服务器 IP 地址
giaddr4 字节中继代理 IP 地址
chaddr16 字节客户端硬件地址(MAC)
sname64 字节服务器名称
file128 字节启动文件名
options可变选项字段

在选项字段之前有一个 4 字节的"魔法 Cookie",值为 0x63825363,用于标识这是 DHCP 报文而非 BOOTP 报文。

常用 DHCP 选项

DHCP 选项字段用于传递各种配置参数,定义在 RFC 2132 中:

选项编号名称说明
1Subnet Mask子网掩码
3Router默认网关
6Domain Name ServerDNS 服务器
12Host Name主机名
15Domain Name域名
51IP Address Lease Time租约时间
53DHCP Message Type消息类型
54Server Identifier服务器标识
55Parameter Request List参数请求列表
58Renewal Time Value (T1)续约时间
59Rebinding Time Value (T2)重绑定时间

DHCP 消息类型(选项 53)

类型值名称说明
1DHCPDISCOVER客户端发现服务器
2DHCPOFFER服务器提供地址
3DHCPREQUEST客户端请求地址
4DHCPDECLINE客户端拒绝地址
5DHCPACK服务器确认
6DHCPNAK服务器拒绝
7DHCPRELEASE客户端释放地址
8DHCPINFORM客户端请求配置参数

DORA 交互流程

DHCP 地址分配的核心流程称为 DORA(Discover-Offer-Request-Acknowledge):

各阶段详解

1. Discover(发现)

客户端启动时,没有 IP 地址,不知道网络中有哪些 DHCP 服务器。它发送一个 DHCPDISCOVER 广播包:

  • 源地址:0.0.0.0(客户端还没有 IP)
  • 目的地址:255.255.255.255(广播地址)
  • 源端口:68
  • 目的端口:67

2. Offer(提供)

网络中的 DHCP 服务器收到 Discover 后,从地址池中选择一个可用的 IP 地址,通过 DHCPOFFER 响应:

  • 如果客户端设置了广播标志位,服务器广播响应
  • 否则,服务器尝试单播到客户端的 MAC 地址

Offer 包含:

  • 提议的 IP 地址
  • 子网掩码
  • 租约时间
  • 服务器标识

3. Request(请求)

客户端可能收到多个服务器的 Offer,通常选择第一个收到的。然后发送 DHCPREQUEST 广播包:

  • 告知选中的服务器:我接受你的 Offer
  • 告知其他服务器:我选择了别的服务器,你可以释放预留的地址

4. Acknowledge(确认)

被选中的服务器发送 DHCPACK,确认地址分配:

  • 包含完整的配置参数(DNS、网关、租约时间等)
  • 客户端收到后进行 ARP 检查,确保地址未被占用

如果客户端检测到地址冲突,会发送 DHCPDECLINE 拒绝这个地址。

地址租约与续约

DHCP 分配的 IP 地址是有期限的,称为租约(Lease)。租约机制确保了地址的有效利用——设备下线后,地址可以被回收重新分配。

租约时间

租约时间由服务器配置,通常为:

场景建议租约时间
办公网络(设备稳定)8 小时 ~ 24 小时
公共场所(流动性大)1 小时 ~ 4 小时
数据中心(服务器固定)7 天 ~ 30 天

续约过程

客户端在租约期间会尝试续约:

T1(续约时间):默认为租约时间的 50%。客户端向原 DHCP 服务器发送单播 DHCPREQUEST 尝试续约。

T2(重绑定时间):默认为租约时间的 87.5%。如果 T1 续约失败,客户端广播 DHCPREQUEST,任何 DHCP 服务器都可以响应。

租约到期:如果 T2 重绑定也失败,客户端必须停止使用该 IP 地址,重新开始 DORA 流程。

DHCP 中继代理

在企业网络中,通常有多个子网,每个子网都需要 DHCP 服务。但为每个子网部署独立的 DHCP 服务器成本过高。DHCP 中继代理(Relay Agent)解决了这个问题。

工作原理

DHCP 中继代理位于子网边界(通常是路由器),负责转发 DHCP 消息:

中继代理的处理

  1. 中继代理收到客户端的广播 DHCP 消息
  2. 将消息的 giaddr 字段设置为收到消息的接口 IP
  3. 将消息单播转发到配置的 DHCP 服务器
  4. 服务器根据 giaddr 判断客户端所在的子网,从相应的地址池分配 IP
  5. 响应发送回中继代理
  6. 中继代理广播给客户端

配置示例(Cisco 路由器)

# 在接口上启用 DHCP 中继
interface GigabitEthernet0/0
ip address 192.168.1.1 255.255.255.0
ip helper-address 10.0.0.100 # DHCP 服务器地址
!
# 可以配置多个 helper-address
interface GigabitEthernet0/1
ip address 192.168.2.1 255.255.255.0
ip helper-address 10.0.0.100
ip helper-address 10.0.0.101 # 备用服务器

DHCP 服务器配置

ISC DHCP Server(Linux)

ISC DHCP Server 是 Linux 系统上最常用的 DHCP 服务器软件。

安装

# Ubuntu/Debian
sudo apt install isc-dhcp-server

# CentOS/RHEL
sudo yum install dhcp-server

配置文件 /etc/dhcp/dhcpd.conf

# 全局配置
option domain-name "example.com";
option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;

# 子网配置
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
default-lease-time 3600;
max-lease-time 86400;
}

# 静态绑定(保留地址)
host printer {
hardware ethernet 00:11:22:33:44:55;
fixed-address 192.168.1.50;
}

host server {
hardware ethernet AA:BB:CC:DD:EE:FF;
fixed-address 192.168.1.10;
}

启动服务

# 启动服务
sudo systemctl start isc-dhcp-server

# 开机自启
sudo systemctl enable isc-dhcp-server

# 查看状态
sudo systemctl status isc-dhcp-server

Kea DHCP(现代替代方案)

Kea 是 ISC 开发的新一代 DHCP 服务器,支持 DHCPv4 和 DHCPv6,具有更好的性能和扩展性。

配置示例 /etc/kea/kea-dhcp4.conf

{
"Dhcp4": {
"interfaces-config": {
"interfaces": ["eth0"]
},
"lease-database": {
"type": "memfile",
"persist": true,
"name": "/var/lib/kea/dhcp4.leases"
},
"subnet4": [
{
"subnet": "192.168.1.0/24",
"pools": [
{
"pool": "192.168.1.100 - 192.168.1.200"
}
],
"option-data": [
{
"name": "routers",
"data": "192.168.1.1"
},
{
"name": "domain-name-servers",
"data": "8.8.8.8, 8.8.4.4"
}
]
}
]
}
}

dnsmasq(轻量级方案)

dnsmasq 是一个小型网络服务软件,同时提供 DNS 和 DHCP 功能,适合家庭网络和小型办公环境。

配置示例 /etc/dnsmasq.conf

# DHCP 配置
interface=eth0
bind-interfaces

# DHCP 地址范围
dhcp-range=192.168.1.100,192.168.1.200,12h

# 网关
dhcp-option=3,192.168.1.1

# DNS 服务器
dhcp-option=6,8.8.8.8,8.8.4.4

# 静态绑定
dhcp-host=00:11:22:33:44:55,192.168.1.50,infinite
dhcp-host=AA:BB:CC:DD:EE:FF,server,192.168.1.10

# 记录租约文件
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

DHCPv6 简介

IPv6 网络中的地址分配机制与 IPv4 有很大不同。IPv6 支持 SLAAC(无状态地址自动配置),设备可以自己生成地址,不一定需要 DHCP。但 DHCPv6 仍然有用武之地。

DHCPv6 与 SLAAC 的选择

方式特点适用场景
SLAAC设备自行生成地址,无需服务器简单网络,无需精细管理
无状态 DHCPv6SLAAC 生成地址,DHCPv6 提供其他配置需要下发 DNS 等参数
有状态 DHCPv6DHCPv6 分配地址和配置需要集中管理地址

DHCPv6 报文类型

DHCPv6 使用不同的报文类型:

类型名称说明
1Solicit客户端发现服务器
2Advertise服务器响应
3Request客户端请求地址
4Confirm客户端确认地址有效
5Renew客户端续约
6Rebind客户端重绑定
7Reply服务器响应
8Release客户端释放地址
11Information-request无状态配置请求

DHCPv6 配置示例(Kea)

{
"Dhcp6": {
"interfaces-config": {
"interfaces": ["eth0"]
},
"lease-database": {
"type": "memfile",
"persist": true
},
"subnet6": [
{
"subnet": "2001:db8:1::/64",
"pools": [
{
"pool": "2001:db8:1::100-2001:db8:1::200"
}
],
"option-data": [
{
"name": "dns-servers",
"data": "2001:4860:4860::8888"
}
]
}
]
}
}

DHCP 安全问题与防护

DHCP 饥饿攻击(DHCP Starvation)

攻击者伪造大量不同的 MAC 地址,向 DHCP 服务器请求地址,耗尽地址池,导致合法用户无法获取 IP。

防护措施

  • 启用 DHCP Snooping(交换机特性)
  • 配置端口安全限制 MAC 地址数量
  • 监控异常的 DHCP 请求

伪造 DHCP 服务器

攻击者在网络中部署非法 DHCP 服务器,分发错误的网关或 DNS 地址,将流量导向恶意服务器。

防护措施

  • DHCP Snooping:只允许信任端口接收 DHCP 响应
  • 802.1X 认证:只有认证通过的设备才能接入网络
  • 网络监控:检测异常的 DHCP 响应

DHCP Snooping 配置(Cisco)

# 全局启用 DHCP Snooping
ip dhcp snooping

# 在 VLAN 上启用
ip dhcp snooping vlan 1,10,20

# 配置信任端口(连接合法 DHCP 服务器的端口)
interface GigabitEthernet0/24
ip dhcp snooping trust

# 限制 DHCP 请求速率(防止饥饿攻击)
interface GigabitEthernet0/1
ip dhcp snooping limit rate 100

DHCP 故障排查

常用诊断命令

# 释放当前租约
sudo dhclient -r eth0

# 请求新地址
sudo dhclient -v eth0

# 查看租约文件
cat /var/lib/dhcp/dhclient.leases

# 抓包分析
tcpdump -i eth0 port 67 or port 68 -v

# Windows 命令
ipconfig /release
ipconfig /renew
ipconfig /all

常见问题排查

问题 1:无法获取 IP 地址

排查步骤:

  1. 检查物理连接是否正常
  2. 检查 DHCP 服务器是否运行
  3. 检查交换机是否阻止了 DHCP 流量
  4. 使用 tcpdump 抓包查看 DHCP 消息是否正常

问题 2:获取到错误的 IP 地址

可能原因:

  • 存在非法 DHCP 服务器
  • VLAN 配置错误导致获取到其他子网的地址

问题 3:租约频繁更新

可能原因:

  • 租约时间设置过短
  • 客户端与服务器之间网络不稳定
  • 存在 IP 地址冲突

总结

DHCP 是网络基础设施的核心组件,通过自动化地址分配大大简化了网络管理:

  • DORA 流程:Discover → Offer → Request → Acknowledge 完成地址分配
  • 租约机制:通过 T1/T2 定时器实现地址续约
  • 中继代理:跨子网转发 DHCP 消息,减少服务器部署
  • 安全防护:DHCP Snooping 防止饥饿攻击和伪造服务器
  • DHCPv6:为 IPv6 网络提供有状态地址分配

掌握 DHCP 的工作原理和配置方法,是网络管理和故障排查的基础技能。

[!TIP] 想了解网络层其他协议?请看 IP 协议详解NAT 网络地址转换