13天:DHCP协议详解

第13天:DHCP协议详解

今日目标

  • 理解DHCP的工作原理和作用
  • 掌握DHCP四次握手过程
  • 了解IP地址租约管理机制
  • 学会分析DHCP数据包
  • 实现DHCP服务器模拟器

1. 什么是DHCP?

1.1 DHCP的定义

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是一种网络管理协议,用于自动分配IP地址和网络配置。

生活类比

  • 你去酒店入住,不需要自己决定住哪个房间
  • 前台会自动分配一个空房间给你
  • 退房后,房间可以分配给其他客人
  • DHCP就是网络中的"前台",自动分配IP地址

1.2 为什么需要DHCP?

没有DHCP的痛苦

场景1:公司有100台电脑
❌ 手动配置每台电脑的IP地址
❌ 记录哪些IP已被使用
❌ 避免IP地址冲突
❌ 新员工入职需要IT手动配置
❌ 员工离职需要手动回收IP

时间成本:每台约10分钟 × 100台 = 1000分钟

使用DHCP的好处

场景2:配置DHCP服务器
✅ 电脑开机自动获取IP
✅ 无需人工干预
✅ 自动避免IP冲突
✅ 新设备即插即用
✅ 离线设备自动回收IP

时间成本:配置一次DHCP服务器 ≈ 30分钟

1.3 DHCP能配置什么?

DHCP不仅分配IP地址,还会配置:

1. IP地址           192.168.1.100
2. 子网掩码         255.255.255.0
3. 默认网关         192.168.1.1
4. DNS服务器        8.8.8.8, 114.114.114.114
5. 租约时间         24小时
6. WINS服务器       (可选)
7. 域名             example.com
8. NTP时间服务器    (可选)

2. DHCP工作原理

2.1 DHCP四次握手(DORA过程)

DHCP获取IP地址需要四个步骤,称为DORA过程

  1. Discover - 发现服务器
  2. Offer - 提供地址
  3. Request - 请求地址
  4. Ack - 确认分配

完整流程图

客户端                                    DHCP服务器
  |                                           |
  |  1. DHCP Discover (广播)                 |
  |  "有DHCP服务器吗?我需要IP地址"           |
  |------------------------------------------>|
  |     源IP: 0.0.0.0                         |
  |     目标IP: 255.255.255.255               |
  |                                           |
  |                                           | 检查可用IP
  |                                           | 找到: 192.168.1.100
  |                                           |
  |  2. DHCP Offer (单播/广播)                |
  |  "我这里有个IP:192.168.1.100"            |
  |<------------------------------------------|
  |     源IP: 192.168.1.1                     |
  |     提供IP: 192.168.1.100                 |
  |                                           |
  | 决定接受这个IP                             |
  |                                           |
  |  3. DHCP Request (广播)                   |
  |  "我要192.168.1.100这个IP"                |
  |------------------------------------------>|
  |     请求IP: 192.168.1.100                 |
  |                                           |
  |                                           | 确认IP可用
  |                                           | 标记为已分配
  |                                           |
  |  4. DHCP Ack (单播)                       |
  |  "好的,192.168.1.100归你了,租期24小时"   |
  |<------------------------------------------|
  |     确认IP: 192.168.1.100                 |
  |     租期: 86400秒                          |
  |                                           |
  | ✅ 配置IP地址                              |
  | ✅ 可以上网了                              |
  |                                           |

2.2 详细步骤解析

步骤1:DHCP Discover(发现)

客户端刚开机,还没有IP地址

广播消息:
┌────────────────────────────────┐
│ 源MAC:  aa:bb:cc:dd:ee:ff    │
│ 目标MAC:ff:ff:ff:ff:ff:ff    │ (广播)
│ 源IP:   0.0.0.0               │ (还没有IP)
│ 目标IP: 255.255.255.255       │ (广播)
│ 消息:   我需要IP地址!         │
│ 事务ID: 0x12345678            │ (用于匹配响应)
└────────────────────────────────┘

特点:
- 使用广播,因为不知道DHCP服务器在哪
- 源IP是0.0.0.0,因为还没有IP地址
- 包含客户端的MAC地址(用于识别)

步骤2:DHCP Offer(提供)

服务器收到Discover后,从地址池中选择一个可用IP

单播/广播响应:
┌────────────────────────────────┐
│ 源IP:   192.168.1.1 (DHCP服务器) │
│ 目标IP: 192.168.1.100 或 广播   │
│ 提供IP: 192.168.1.100          │
│ 子网掩码:255.255.255.0         │
│ 默认网关:192.168.1.1           │
│ DNS:    8.8.8.8                │
│ 租期:   86400秒 (24小时)       │
│ 事务ID: 0x12345678 (匹配请求)  │
└────────────────────────────────┘

特点:
- 可能有多个DHCP服务器响应
- 提供IP但还没有分配
- 客户端可以选择接受哪个offer

步骤3:DHCP Request(请求)

客户端选择一个offer,正式请求该IP

广播消息:
┌────────────────────────────────┐
│ 源IP:   0.0.0.0               │ (仍然没有IP)
│ 目标IP: 255.255.255.255       │ (广播)
│ 请求IP: 192.168.1.100         │
│ 服务器: 192.168.1.1           │
│ 消息:   我要这个IP!           │
│ 事务ID: 0x12345678            │
└────────────────────────────────┘

为什么广播?
- 告诉所有DHCP服务器:"我选择了192.168.1.1的offer"
- 其他服务器可以回收它们提供的IP

步骤4:DHCP Ack(确认)

服务器确认分配,客户端可以使用IP了

单播响应:
┌────────────────────────────────┐
│ 源IP:   192.168.1.1           │
│ 目标IP: 192.168.1.100         │
│ 确认IP: 192.168.1.100         │
│ 租期:   86400秒               │
│ 开始时间:2024-01-15 10:00:00  │
│ 更新时间:2024-01-15 22:00:00  │ (50%租期)
│ 重绑时间:2024-01-16 04:30:00  │ (87.5%租期)
│ 消息:   分配成功!             │
└────────────────────────────────┘

客户端收到Ack后:
✅ 配置IP地址:192.168.1.100
✅ 配置子网掩码:255.255.255.0
✅ 配置默认网关:192.168.1.1
✅ 配置DNS服务器:8.8.8.8
✅ 启动租约计时器

2.3 特殊情况

情况1:服务器拒绝(DHCP Nak)

原因:
- 请求的IP已被其他设备占用
- IP地址不在分配范围内
- 租约已过期且IP被重新分配

流程:
客户端 → DHCP Request
服务器 → DHCP Nak (拒绝)
客户端 → 重新开始,发送 DHCP Discover

情况2:租约续期

时间线(假设租期24小时):

t=0h        获得IP地址
t=12h (50%) 尝试续期(直接向原服务器请求)
t=21h (87.5%) 如果续期失败,广播续期请求
t=24h       租约到期,释放IP,重新DORA

续期过程(简化的DORA):
客户端 → DHCP Request (续期请求)
服务器 → DHCP Ack (同意续期) 或 Nak (拒绝,重新DORA)

情况3:客户端重启

场景:客户端记得上次使用的IP

快速重连:
客户端 → DHCP Request (直接请求上次的IP)
        源IP: 0.0.0.0
        请求IP: 192.168.1.100 (上次的)

服务器 → DHCP Ack (如果IP仍然可用)
     或 DHCP Nak (IP已被占用,重新DORA)

优点:
- 跳过Discover和Offer
- 更快获得网络连接
- 减少网络流量

3. DHCP报文格式

3.1 DHCP报文结构

DHCP基于BOOTP协议,使用UDP传输:

UDP端口:
- 客户端端口:68
- 服务器端口:67

报文格式(最小236字节):
┌─────────────────────────────────────┐
│ Op (1字节)         操作码            │ 1=请求, 2=响应
│ HType (1字节)      硬件类型          │ 1=以太网
│ HLen (1字节)       硬件地址长度      │ 6=MAC地址
│ Hops (1字节)       跳数              │ 中继计数
├─────────────────────────────────────┤
│ Transaction ID (4字节) 事务ID        │ 随机数,匹配请求和响应
├─────────────────────────────────────┤
│ Seconds (2字节)    开机秒数          │ 客户端开机后的秒数
│ Flags (2字节)      标志位            │ 广播标志等
├─────────────────────────────────────┤
│ Client IP (4字节)  客户端IP          │ 续期时使用
│ Your IP (4字节)    你的IP            │ 服务器分配的IP
│ Server IP (4字节)  服务器IP          │ DHCP服务器地址
│ Gateway IP (4字节) 网关IP            │ 中继代理地址
├─────────────────────────────────────┤
│ Client MAC (16字节) 客户端硬件地址   │ 前6字节是MAC
├─────────────────────────────────────┤
│ Server Name (64字节) 服务器名称      │ 可选
│ Boot File (128字节)  启动文件名      │ 可选
├─────────────────────────────────────┤
│ Magic Cookie (4字节) 魔术字          │ 0x63825363
├─────────────────────────────────────┤
│ Options (可变)     选项字段          │ DHCP消息类型、参数等
└─────────────────────────────────────┘

3.2 重要选项(Options)

DHCP的核心功能在Options字段:

格式:[选项代码][长度][数据]

常用选项:

Option 53 (DHCP消息类型) - 1字节
├── 1: DHCP Discover
├── 2: DHCP Offer
├── 3: DHCP Request
├── 4: DHCP Decline (拒绝)
├── 5: DHCP Ack
├── 6: DHCP Nak (否认)
├── 7: DHCP Release (释放)
└── 8: DHCP Inform (通知)

Option 1 (子网掩码) - 4字节
└── 255.255.255.0

Option 3 (默认网关) - 4字节×n
└── 192.168.1.1

Option 6 (DNS服务器) - 4字节×n
├── 8.8.8.8
└── 8.8.4.4

Option 51 (租约时间) - 4字节
└── 86400 (秒)

Option 54 (DHCP服务器标识) - 4字节
└── 192.168.1.1

Option 58 (T1续约时间) - 4字节
└── 43200 (50%租期)

Option 59 (T2重绑时间) - 4字节
└── 75600 (87.5%租期)

Option 255 (结束标记)
└── 选项结束

3.3 报文示例

DHCP Discover报文

┌─────────────────────────────────────┐
│ Op: 1 (请求)                         │
│ HType: 1 (以太网)                    │
│ HLen: 6                              │
│ Hops: 0                              │
│ Transaction ID: 0x3d1d6b                │
│ Seconds: 0                           │
│ Flags: 0x0000                        │
│ Client IP: 0.0.0.0                   │
│ Your IP: 0.0.0.0                     │
│ Server IP: 0.0.0.0                   │
│ Gateway IP: 0.0.0.0                  │
│ Client MAC: aa:bb:cc:dd:ee:ff        │
│ Magic Cookie: 0x63825363             │
│ Options:                             │
│   - Option 53: 1 (Discover)          │
│   - Option 55: 请求参数列表           │
│     (1,3,6,15,51,54,58,59)          │
│   - Option 255: End                  │
└─────────────────────────────────────┘

4. IP地址租约管理

4.1 租约生命周期

租约状态机:

    [无IP]
      ↓
   DHCP DORA
      ↓
   [已绑定] ←──────┐
      ↓ (50%租期)  │
   [续约中] ────────┘ (续约成功)
      ↓ (失败)
   [重绑中] ←──────┐
      ↓ (87.5%租期)│
   [广播续约] ──────┘ (续约成功)
      ↓ (失败)
   [租约过期]
      ↓
    释放IP
      ↓
   重新DORA

4.2 租约时间计算

示例:租期24小时

时间点计算:

租约开始:2024-01-15 10:00:00
租约时长:86400秒 (24小时)

┌──────────────────────────────────────────┐
│ 0%        50%       87.5%       100%      │
│ │          │          │           │       │
│ ├──────────┼──────────┼───────────┤       │
│ │          │          │           │       │
│ 10:00    22:00    04:30       10:00      │
│ 开始      T1续约    T2重绑      过期      │
└──────────────────────────────────────────┘

T1 (Renewing Time):
= 开始时间 + 租期 × 50%
= 10:00 + 12小时
= 22:00

T2 (Rebinding Time):
= 开始时间 + 租期 × 87.5%
= 10:00 + 21小时
= 04:30 (次日)

到期时间:
= 开始时间 + 租期
= 10:00 + 24小时
= 10:00 (次日)

4.3 租约管理策略

服务器端地址池管理

地址池配置
├── 网络192.168.1.0/24
├── 可用范围192.168.1.100 - 192.168.1.200
├── 保留地址
   ├── 192.168.1.1 (网关)
   ├── 192.168.1.2 (DNS)
   └── 192.168.1.10-50 (静态IP)
└── DHCP池192.168.1.100-200 (101个地址)

分配策略
1. 优先分配客户端上次使用的IP
2. 选择租约最早到期的IP
3. 避免刚释放的IP等待2分钟
4. 记录每个IP的租约信息

客户端租约状态

租约数据库(示例):

MAC地址            IP地址         租约开始            租约结束            状态
aa:bb:cc:dd:ee:ff  192.168.1.100  2024-01-15 10:00   2024-01-16 10:00   已分配
11:22:33:44:55:66  192.168.1.101  2024-01-15 08:30   2024-01-16 08:30   已分配
aa:aa:aa:aa:aa:aa  192.168.1.102  2024-01-14 20:00   2024-01-15 20:00   已过期

5. DHCP中继代理

5.1 为什么需要中继?

问题:DHCP使用广播,但广播不能跨越路由器

场景:公司有多个子网

[子网1: 192.168.1.0/24]
     ↓
  [路由器] ← 广播在这里被阻挡
     ↓
[子网2: 192.168.2.0/24]  ← DHCP服务器在这里
     ↓
[子网3: 192.168.3.0/24]

问题:
- 子网1和子网3的客户端无法联系到子网2的DHCP服务器
- 需要每个子网都部署DHCP服务器?❌ 太麻烦

解决方案:DHCP Relay(中继代理)

[子网1客户端]
     ↓ 广播 DHCP Discover
[路由器/中继代理]
     ↓ 单播转发到DHCP服务器
[子网2 DHCP服务器]
     ↓ 单播响应到中继代理
[路由器/中继代理]
     ↓ 转发给客户端
[子网1客户端] ✅ 获得IP

5.2 中继工作流程

1. 客户端广播 Discover:
   源IP: 0.0.0.0
   目标IP: 255.255.255.255 (广播)

2. 中继代理收到,修改报文:
   源IP: 192.168.1.1 (中继代理地址)
   目标IP: 192.168.2.100 (DHCP服务器,单播)
   Gateway IP: 192.168.1.1 (填入中继地址)
   Hops: 增加1

3. DHCP服务器处理:
   - 看到Gateway IP,知道客户端在子网1
   - 从子网1的地址池分配IP
   - 单播响应给中继代理

4. 中继代理转发:
   - 将响应转发给客户端(广播或单播)

6. 实战项目:DHCP分析工具

6.1 项目功能

我们将实现:

  1. DHCP报文构建器
  2. DHCP报文解析器
  3. 模拟DHCP客户端
  4. 地址租约信息查看

6.2 工具演示

# 查看本机DHCP租约信息
python day13_dhcp_tool.py --show-lease

# 解析DHCP报文(从pcap文件)
python day13_dhcp_tool.py --parse capture.pcap

# 模拟DHCP Discover
python day13_dhcp_tool.py --discover

# 释放当前IP
python day13_dhcp_tool.py --release

7. 知识拓展

7.1 查看DHCP信息的命令

Windows

# 查看DHCP租约信息
ipconfig /all

输出示例:
以太网适配器 以太网:
   DHCP 已启用: 是
   IPv4 地址: 192.168.1.100
   子网掩码: 255.255.255.0
   默认网关: 192.168.1.1
   DHCP 服务器: 192.168.1.1
   获得租约的时间: 2024年1月15日 10:00:00
   租约过期的时间: 2024年1月16日 10:00:00
   DNS 服务器: 8.8.8.8

# 释放IP地址
ipconfig /release

# 重新获取IP
ipconfig /renew

Linux

# 查看网卡配置
ip addr show
ifconfig

# 查看DHCP租约(不同发行版路径不同)
cat /var/lib/dhcp/dhclient.leases       # Debian/Ubuntu
cat /var/lib/dhclient/dhclient.leases   # CentOS/RHEL

# 释放和重新获取(使用dhclient)
sudo dhclient -r eth0  # 释放
sudo dhclient eth0     # 重新获取

# 查看DHCP客户端日志
journalctl -u NetworkManager | grep -i dhcp

Mac

# 查看网络配置
ifconfig

# 释放DHCP租约
sudo ipconfig set en0 DHCP

# 查看DHCP详细信息
ipconfig getpacket en0

7.2 DHCP安全问题

1. DHCP欺骗攻击

攻击场景:
┌──────────────────────────────────────┐
│ 1. 攻击者部署假DHCP服务器             │
│ 2. 客户端发送 Discover                │
│ 3. 假服务器快速响应 Offer              │
│    - 分配正常IP                       │
│    - 但网关指向攻击者                  │
│    - DNS指向攻击者                     │
│ 4. 客户端流量被劫持                   │
└──────────────────────────────────────┘

防护措施:
- DHCP Snooping(交换机特性)
- 端口安全(只允许特定端口接收DHCP响应)
- 802.1X认证

2. DHCP饿死攻击

攻击原理:
1. 攻击者伪造大量不同MAC地址
2. 快速请求IP地址
3. 耗尽DHCP地址池
4. 正常用户无法获得IP

防护:
- 限制端口的MAC地址数量
- DHCP地址池足够大
- 启用端口安全

3. 非法DHCP服务器

场景:
- 员工私自接入路由器(启用DHCP)
- 导致网络混乱

检测方法:
- 监控网络中的DHCP响应
- 使用DHCP Snooping
- 定期扫描DHCP服务器

7.3 DHCP vs 静态IP

对比表

特性DHCP(动态)静态IP
配置方式自动获取手动配置
易用性✅ 简单,即插即用❌ 需要手动配置
管理成本✅ 低,集中管理❌ 高,逐台配置
IP冲突✅ 自动避免❌ 可能冲突
稳定性⚠️ 依赖DHCP服务器✅ 不依赖服务器
IP固定❌ 可能变化✅ 永久不变
适用场景普通客户端、移动设备服务器、网络设备

推荐策略

使用静态IP:
- 服务器(Web、DNS、DHCP等)
- 网络设备(路由器、交换机)
- 打印机、网络摄像头
- 需要端口映射的设备

使用DHCP:
- 普通办公电脑
- 笔记本电脑
- 移动设备(手机、平板)
- 访客设备

混合方案:
- DHCP + 保留地址(根据MAC分配固定IP)
  优点:既自动配置,又IP固定

8. 今日练习

练习1:查看本机DHCP信息

在你的电脑上查看:

1. 当前IP地址
2. DHCP服务器地址
3. 租约开始时间
4. 租约结束时间
5. DNS服务器地址
6. 默认网关地址

练习2:释放和重新获取IP

步骤:
1. 记录当前IP地址
2. 释放IP地址(ipconfig /release)
3. 观察网络状态(无法上网)
4. 重新获取IP(ipconfig /renew)
5. 对比前后IP是否相同
6. 分析为什么相同/不同

练习3:计算租约时间

已知:
- 租约开始:2024-01-15 14:00:00
- 租约时长:48小时

计算:
1. T1(续约时间)
2. T2(重绑时间)
3. 租约到期时间
4. 从开始到T1的间隔(秒)

练习4:DHCP抓包分析

使用Wireshark抓包:
1. 释放当前IP
2. 启动Wireshark,过滤 "dhcp"
3. 重新获取IP
4. 观察DORA四个报文
5. 分析每个报文的内容

9. 常见问题

Q1:为什么DHCP Request要广播而不是单播?

A:两个原因:

  1. 告诉所有DHCP服务器"我选择了哪个offer",其他服务器可以回收IP
  2. 此时客户端还没有正式的IP,使用单播可能有问题

Q2:如果有多个DHCP服务器,会发生什么?

A:

  • 客户端会收到多个Offer
  • 客户端通常选择第一个收到的Offer
  • 其他服务器看到Request后,会回收它们提供的IP

Q3:DHCP能跨网段工作吗?

A:

  • 直接不能(广播无法跨越路由器)
  • 需要配置DHCP Relay(中继代理)
  • 路由器将广播转换为单播转发

Q4:租约到期后没有续约会怎样?

A:

  • IP地址被释放
  • 客户端失去网络连接
  • 需要重新发起DORA获取新IP
  • 通常客户端会在到期前自动续约

Q5:为什么有时候IP地址会变化?

A:可能原因:

  • 租约到期后获得不同的IP
  • DHCP服务器重启,地址池重置
  • 长时间离线,原IP被分配给其他设备
  • 更换了网络(连接不同的WiFi)

10. 总结

今天我们学习了:

核心知识点

  1. DHCP基础

    • 动态主机配置协议
    • 自动分配IP和网络参数
    • 简化网络管理
  2. DORA过程

    • Discover:寻找DHCP服务器
    • Offer:服务器提供IP
    • Request:客户端请求IP
    • Ack:服务器确认分配
  3. 租约管理

    • 租约生命周期
    • T1续约(50%)、T2重绑(87.5%)
    • 租约到期处理
  4. DHCP报文

    • 基于BOOTP协议
    • UDP端口67/68
    • 丰富的Options字段
  5. 高级特性

    • DHCP中继(跨网段)
    • 安全问题(欺骗、饿死攻击)
    • 地址保留

重点回顾

DHCP = 自动网络配置
过程 = DORA(4次握手)
管理 = 租约机制
安全 = DHCP Snooping

好处:
✅ 自动化配置
✅ 避免IP冲突
✅ 集中管理
✅ 提高效率

明天预告

第14天:第二周总结与实战

内容预览:

  • 本周知识串讲(Day 8-13)
  • IP、子网、MAC、端口、DNS、DHCP综合应用
  • 综合项目:网络配置助手
  • 知识测验

继续加油!🚀

今天我们深入学习了DHCP协议,理解了网络设备如何自动获取IP地址和配置。DHCP极大地简化了网络管理,是现代网络不可或缺的基础服务。掌握DHCP不仅能帮你理解网络自动化配置,还能在排查网络问题时快速定位。