第10章:BOOTP和DHCP(BOOTP and DHCP)
动态主机配置
一、导读
1.1 本章学习目标
第10章深入讲解BOOTP和DHCP——现代网络中IP地址自动分配的核心协议。当你的电脑或手机连接到Wi-Fi时,它会自动获得IP地址、子网掩码、默认网关、DNS服务器等配置信息,这一切都归功于DHCP。DHCP是BOOTP的超集,是当今网络中主机配置的标准方式。
本章的核心学习目标包括:
- 理解BOOTP的工作原理:BOOTP如何取代RARP
- 深入掌握DHCP的完整工作流程:DORA四步过程(Discover→Offer→Request→Acknowledge)
- 理解DHCP的地址分配机制:静态分配、动态分配、自动分配的区别
- 掌握DHCP租约的生命周期:获取、使用、续约、释放
- 了解DHCP中继代理的作用:如何让DHCP请求跨路由器传播
- 学会配置和管理DHCP服务器:dhcpd.conf的配置
1.2 为什么本章如此重要
DHCP是网络基础设施的核心组件。几乎每一个企业网络、家庭网络、公共Wi-Fi都依赖DHCP来自动分配IP地址。理解DHCP对于以下方面至关重要:
- 网络管理:配置DHCP服务器、排查地址分配问题
- 故障诊断:理解"无法获取IP地址"的原因
- 网络设计:合理规划地址池、租约时间
- 安全:防范DHCP欺骗攻击
DHCP也是理解网络启动过程的关键。PXE(Preboot Execution Environment)网络启动使用DHCP获取IP地址和引导服务器信息,是数据中心大规模部署服务器的基础技术。
1.3 核心问题引导
在阅读本章时,请带着以下问题思考:
DHCP的DORA过程为什么需要四个步骤?两个步骤(Discover→Ack)够吗?
为什么DHCP的Discover和Offer使用广播,而客户端此时还没有IP地址?
DHCP租约机制解决了什么问题?如果没有租约,地址池耗尽后怎么办?
DHCP中继代理是如何工作的?它修改了DHCP报文的哪些字段?
如果网络中有两个DHCP服务器,客户端会如何处理?
DHCP可以分配哪些配置信息?除了IP地址,还能提供什么?
二、核心概念详解
2.1 BOOTP(Bootstrap Protocol)
BOOTP(RFC 951, 1985年)是RARP的替代方案,使用UDP传输,支持跨路由器,可以提供更丰富的配置信息。
2.1.1 BOOTP报文格式
BOOTP报文固定300字节,使用UDP传输(客户端端口68,服务器端口67):
| 字段 | 长度 | 说明 |
|---|---|---|
| op | 1 | 操作码:1=请求,2=响应 |
| htype | 1 | 硬件类型(1=以太网) |
| hlen | 1 | 硬件地址长度(6) |
| hops | 1 | 跳数(中继代理使用) |
| xid | 4 | 事务ID(随机生成,用于匹配请求和响应) |
| secs | 2 | 启动经过的秒数 |
| flags | 2 | 标志位(最高位:1=广播响应) |
| ciaddr | 4 | 客户端IP地址(客户端已知时使用) |
| yiaddr | 4 | 你的IP地址(服务器分配) |
| siaddr | 4 | 服务器IP地址 |
| giaddr | 4 | 中继代理IP地址 |
| chaddr | 16 | 客户端硬件地址 |
| sname | 64 | 服务器名 |
| file | 128 | 引导文件名 |
| options | 可变 | 可选参数(后来扩展为DHCP选项) |
2.1.2 BOOTP vs RARP
| 特性 | RARP | BOOTP |
|---|---|---|
| 传输层 | 链路层 | UDP |
| 跨路由器 | 不支持 | 支持(中继代理) |
| 提供的信息 | 仅IP | IP、网关、DNS、引导文件 |
| 地址分配 | 静态映射 | 静态映射 |
2.2 DHCP(Dynamic Host Configuration Protocol)
DHCP(RFC 2131, 1997年)是BOOTP的超集,增加了动态地址分配和租约机制。DHCP完全兼容BOOTP——DHCP报文就是带有特殊选项的BOOTP报文。
2.2.1 DHCP的DORA过程
客户端 DHCP服务器
│ │
│ ① DHCP Discover(广播) │
│ src=0.0.0.0, dst=255.255.255.255 │
│ 选项:DHCP Message Type=Discover │
│ 选项:Requested Parameters │
│ ──────────────────────────────────→ │
│ │
│ ② DHCP Offer(广播) │
│ src=服务器IP, dst=255.255.255.255 │
│ yiaddr=提供的IP地址 │
│ 选项:DHCP Message Type=Offer │
│ 选项:Subnet Mask, Router, DNS... │
│ 选项:Lease Time │
│ ←────────────────────────────────── │
│ │
│ ③ DHCP Request(广播) │
│ src=0.0.0.0, dst=255.255.255.255 │
│ 选项:DHCP Message Type=Request │
│ 选项:Server Identifier=选中的服务器│
│ 选项:Requested IP=选中的IP │
│ ──────────────────────────────────→ │
│ │
│ ④ DHCP Acknowledge(广播) │
│ src=服务器IP, dst=255.255.255.255 │
│ yiaddr=确认分配的IP地址 │
│ 选项:DHCP Message Type=Ack │
│ 选项:所有配置参数 │
│ ←────────────────────────────────── │
│ │
│ 客户端配置IP地址,开始使用 │2.2.2 为什么需要四个步骤
- Discover→Offer:客户端寻找服务器,服务器提供地址
- Request→Ack:客户端确认选择,服务器确认分配
为什么不能只有两步(Discover→Ack)?因为可能有多个服务器响应Offer。客户端需要选择一个服务器(通常是最先收到的Offer),通过Request告知所有服务器自己的选择。未选中的服务器收到Request后,知道客户端没有选择自己,会释放预留的地址。
2.2.3 DHCP选项
DHCP通过选项(options)传递配置信息:
| 选项号 | 名称 | 说明 |
|---|---|---|
| 1 | Subnet Mask | 子网掩码 |
| 3 | Router | 默认网关 |
| 6 | DNS Server | DNS服务器 |
| 15 | Domain Name | 域名 |
| 28 | Broadcast Address | 广播地址 |
| 51 | Lease Time | 租约时间(秒) |
| 53 | Message Type | DHCP消息类型 |
| 54 | Server Identifier | 服务器标识 |
| 55 | Parameter Request | 请求的参数列表 |
2.3 DHCP地址分配方式
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 静态分配 | 根据MAC地址分配固定IP | 服务器、打印机 |
| 动态分配 | 从地址池分配,有租约 | 普通客户端 |
| 自动分配 | 永久分配第一个获得的IP | 混合场景 |
2.3.1 动态分配的地址池
# dhcpd.conf 配置示例
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 domain-name-servers 8.8.8.8; # DNS
default-lease-time 3600; # 默认租约1小时
max-lease-time 86400; # 最大租约24小时
}2.4 DHCP租约管理
2.4.1 租约生命周期
获取IP ──→ T1时间 ──→ T2时间 ──→ 租约到期
│ │ │ │
│ │ │ └── 停止使用,重新Discover
│ │ └── 广播Request续约(任何服务器可响应)
│ └── 单播Request续约(原服务器响应)
└── 使用IP地址- T1(通常为租约的50%):客户端尝试向原服务器续约
- T2(通常为租约的87.5%):客户端广播续约请求(任何服务器可响应)
- 租约到期:客户端必须停止使用IP地址
2.4.2 租约续约
# 查看DHCP租约
cat /var/lib/dhcp/dhclient.leases
# lease {
# interface "eth0";
# fixed-address 192.168.1.100;
# option subnet-mask 255.255.255.0;
# option routers 192.168.1.1;
# option domain-name-servers 8.8.8.8;
# renew 2 2026/10/07 06:00:00; # T1
# rebind 2 2026/10/07 09:00:00; # T2
# expire 2 2026/10/07 18:00:00; # 到期
# }
# 手动释放租约
sudo dhclient -r eth0
# 手动获取新租约
sudo dhclient eth02.5 DHCP中继代理
DHCP使用广播,路由器默认不转发广播帧。DHCP中继代理(relay agent)解决了这个问题:
客户端A ──→ 路由器(中继代理)──→ DHCP服务器
192.168.1.0/24 giaddr=192.168.1.1 10.0.0.1中继代理收到客户端的DHCP广播后:
将广播改为单播,发送给指定的DHCP服务器
在BOOTP报文的 giaddr 字段填入自己的接口地址
DHCP服务器根据 giaddr 确定客户端所在的子网,选择正确的地址池
三、实战案例
3.1 案例一:使用tcpdump观察DHCP过程
sudo tcpdump -i eth0 -nn -v 'udp port 67 or udp port 68'输出示例(DORA过程):
# Discover
12:34:56.789 IP 0.0.0.0.68 > 255.255.255.255.67:
BOOTP/DHCP, length 300: Request (0x01), hwaddr 00:11:22:33:44:55
DHCP-Message Option 53, length 1: Discover
Option 55, length 5: Request: SubnetMask, Router, DNS, Domain, LeaseTime
# Offer
12:34:56.790 IP 192.168.1.1.67 > 255.255.255.255.68:
BOOTP/DHCP, length 300: Reply (0x02), yiaddr 192.168.1.100
DHCP-Message Option 53, length 1: Offer
Option 1, length 4: SubnetMask 255.255.255.0
Option 3, length 4: Router 192.168.1.1
Option 6, length 4: DNS 8.8.8.8
Option 51, length 4: LeaseTime 3600
# Request
12:34:56.791 IP 0.0.0.0.68 > 255.255.255.255.67:
BOOTP/DHCP, length 300: Request (0x01)
DHCP-Message Option 53, length 1: Request
Option 54, length 4: ServerID 192.168.1.1
Option 50, length 4: RequestedIP 192.168.1.100
# Ack
12:34:56.792 IP 192.168.1.1.67 > 255.255.255.255.68:
BOOTP/DHCP, length 300: Reply (0x02), yiaddr 192.168.1.100
DHCP-Message Option 53, length 1: Ack3.2 案例二:配置ISC DHCP服务器
# 安装
sudo apt install isc-dhcp-server
# 配置 /etc/dhcp/dhcpd.conf
default-lease-time 3600;
max-lease-time 86400;
authoritative;
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 domain-name-servers 8.8.8.8, 8.8.4.4;
option domain-name "example.local";
}
# 静态分配
host server1 {
hardware ethernet 00:11:22:33:44:55;
fixed-address 192.168.1.10;
}
# 启动服务
sudo systemctl start isc-dhcp-server3.3 案例三:DHCP故障排查
# 步骤1:检查是否获取到IP
ip addr show eth0
# 如果没有IP或显示169.254.x.x(APIPA),说明DHCP失败
# 步骤2:手动获取DHCP地址
sudo dhclient -v eth0
# -v 显示详细的DHCP过程
# 步骤3:检查DHCP服务器是否可达
ping 192.168.1.1
# 步骤4:查看DHCP日志
sudo journalctl -u isc-dhcp-server四、常见误区与难点
4.1 误区一:"DHCP使用TCP"
DHCP使用UDP(客户端68,服务器67)。因为客户端在获取IP地址之前没有有效的IP配置,使用UDP更简单。
4.2 误区二:"DHCP Offer是单播发送给客户端的"
在客户端配置IP地址之前,它还不能接收单播数据报。因此,DHCP Offer通常使用广播发送(除非客户端在Discover中设置了broadcast flag=0,且服务器支持单播Offer)。
4.3 难点:理解中继代理的giaddr字段
giaddr(gateway IP address)是中继代理填入的自己的接口地址。DHCP服务器根据giaddr确定客户端所在的子网,从而选择正确的地址池和配置参数。这是DHCP能够跨路由器工作的关键。
五、本章小结
第10章深入讲解了BOOTP和DHCP:
BOOTP取代了RARP,使用UDP传输,支持跨路由器和丰富的配置选项。
DHCP是BOOTP的超集,增加了动态地址分配和租约机制,是现代网络的标准。
DORA过程:Discover→Offer→Request→Acknowledge,四步完成地址分配。
租约机制:客户端租用IP地址,到期前续约,保证地址的有效利用。
DHCP中继代理:通过giaddr字段实现DHCP请求的跨路由器传播。
六、思考与练习
思考题
如果DHCP只有两步(Discover→Ack),没有Request阶段,会有什么问题?
DHCP租约时间设得太长或太短分别有什么问题?如何确定合适的租约时间?
如果网络中有恶意DHCP服务器,会造成什么危害?如何防范?
IPv6的DHCPv6与DHCPv4有什么区别?IPv6的无状态地址自动配置(SLAAC)如何替代DHCP?
练习题
使用tcpdump捕获完整的DHCP DORA过程,分析每个报文的选项字段。
搭建一个DHCP服务器(如dnsmasq),为虚拟机分配IP地址。
查看本机的DHCP租约信息,分析获得的各项配置参数。