DHCP 协议分析与实践
1. 概述
1.1 简介
- Dynamic Host Configuration Protocol 用于取代 RARP 和 Bootp 协议,主要用于集中管理和自动分配 IP 地址,帮助网络内的主机获取 IP 地址、子网掩码、网关和 DNS 服务器地址。
- DHCP 用于取代 Bootp 协议,但引用了租约和续租的概念
- 基于 UDP 协议实现,位于应用层,使用 67 (DHCP服务器) 和 68 (DHCP客户端) 端口
1.2 地址分配方式
方式 | 说明 |
---|---|
静态分配 | 即手工配置 IP、网关、子网掩码和 DNS 服务器 |
动态分配 | 主机向 DHCP 服务器申请 IP 地址,获取后就使用该地址 |
零配置 | 当使用动态分配失败时,如果 DHCP 服务器故障,有些操作系统会使用零配置为自己 分配一个私有地址(169.254.0.0 ~ 169.254.255.255),确保自己有 IP 地址 |
1.3 DHCP 工作流程
1.4 DHCP 网络拓扑图
1.5 报文格式
- 报文类型 : 1 表示请求报文(client to server), 2 表示响应报文(server to client)
- 硬件地址类型 : 即网络类型,1 表示以太网
- 硬件地址长度 : 以太网地址为 6 字节
- 跳数 : DHCP 报文经过的中继数量,每经过一个路由器值加 1
- 事件 ID : 用于标识一次地址请求过程,客户端请求时随机生成
- 使用时长 : 获取到 IP 成功或续租成功到现在的时长,单位秒
- 标志 : [0]=0 表示服务器应答通过单播发送(续租时使用),[0]=1 表示服务器应答通过广播发送(申请时使用)
- 最终分配的 IP : 客户端最终分配到的 IP 地址,仅用于 ACK 报文中, 此时才真正分配了 IP 地址
- 预分配的 IP : 服务器给客户端分配的 IP 地址,仅用于 Offer 和 ACK 报文中
- 下一阶段服务器 IP 地址 : 用于 Bootp 协议中,通常是存放系统镜像服务器,仅用于 Offer 和 ACK 报文中
- 第一个 DHCP 中继的 IP 地址 : 用于跨网段分配地址, DHCP 中继会将客户端发出 DHCP请求(广播包) 转发到另一个网段,并将自己的 IP 填入该字段,DHCP 服务器根据该字段选择相应的地址池分配 IP 地址
- 客户端硬件地址 : 即客户端的 MAC 地址,每个报文中都存在
- 服务器名称 : 服务器的域名,仅用于 Offer 和 ACK 报文中
- 启动配置文件 : 用于 Bootp 协议中,客户端启动的配置文件,仅用于 Offer 报文
- 选项 : 可选项,格式为 Code + Length + Data
struct dhcp_hdr {
uint8_t opcode; /* opcode */
uint8_t htype; /* hardware address type */
uint8_t hlen; /* hardware address length */
uint8_t hopcount; /* used by proxy servers */
uint32_t xid; /* transaction ID */
uint16_t secs; /* number of seconds since trying to bootstrap */
uint16_t flags; /* flags for DHCP, unused for BOOTP */
uint32_t cip; /* client's IP */
uint32_t yip; /* your IP */
uint32_t sip; /* server's IP */
uint32_t gip; /* gateway IP */
uint8_t chaddr[16]; /* client hardware address, len is dhcp_hlen */
char sname[64]; /* server host name, null terminated string */
char file[128]; /* boot file name, null terminated string */
char opt[0];
};
2. DHCP 实践
2.1 DHCP 服务器安装
# 安装
192.168.2.3> sudo apt install -y isc-dhcp-server
# 配置
sudo sed -i 's/^INTERFACESv4=.*$/INTERFACESv4="eth0"/' /etc/default/isc-dhcp-server
sudo sed -i 's/^INTERFACESv6=.*$/INTERFACESv6="eth0"/' /etc/default/isc-dhcp-server
cat << "EOF" | sudo tee -a /etc/dhcp/dhcpd.conf
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.130 192.168.2.140; # 地址池
option subnet-mask 255.255.255.0; # 子网掩码
option routers 192.168.2.3; # 默认网关
option broadcast-address 192.168.2.255; # 广播地址
default-lease-time 600; # 默认租赁时长
max-lease-time 7200; # 最大租赁时长
option domain-name "example.org"; # DNS 域名
option domain-name-servers 119.29.29.29, 223.5.5.5; # DNS 服务器
}
EOF
# 重启
sudo service isc-dhcp-server restart
sudo netstat -anup | grep dhcp
udp 0 0 0.0.0.0:67 0.0.0.0:* 1476/dhcpd
udp 0 0 0.0.0.0:28199 0.0.0.0:* 1476/dhcpd
udp6 0 0 :::13577 :::* 1476/dhcpd
2.2 DHCP 报文分析
# 测试
192.168.2.3> tail -f /var/lib/dhcp/dhcpd.leases # 监听分配的 IP
192.168.2.200> sudo dhclient -d # 分配 IP
192.168.2.200> sudo tcpdump -nt -XX 'udp and port 67 or port 68'
IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 0:d:d:d:d:d, length 300
0x0000: ffff ffff ffff 000d 0d0d 0d0d 0800 4510 ..............E.
0x0010: 0148 0000 0000 8011 3996 0000 0000 ffff .H......9.......
0x0020: ffff 0044 0043 0134 5900 0101 0600 0ba8 ...D.C.4Y.......
0x0030: 5216 0000 0000 0000 0000 0000 0000 0000 R...............
0x0040: 0000 0000 0000 000d 0d0d 0d0d 0000 0000 ................
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0110: 0000 0000 0000 6382 5363 3501 0132 04c0 ......c.Sc5..2..
0x0120: a802 780c 0567 686f 7374 370d 011c 0203 ..x..ghost7.....
0x0130: 0f06 770c 2c2f 1a79 2aff 0000 0000 0000 ..w.,/.y*.......
0x0140: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0150: 0000 0000 0000 ......
IP 192.168.2.3.67 > 192.168.2.120.68: BOOTP/DHCP, Reply, length 300
0x0000: 000d 0d0d 0d0d 000b 0b0b 0b0b 0800 4510 ..............E.
0x0010: 0148 0000 0000 8011 b3c9 c0a8 0203 c0a8 .H..............
0x0020: 0278 0043 0044 0134 9af5 0201 0600 0ba8 .x.C.D.4........
0x0030: 5216 0000 0000 0000 0000 c0a8 0278 c0a8 R............x..
0x0040: 0203 0000 0000 000d 0d0d 0d0d 0000 0000 ................
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0110: 0000 0000 0000 6382 5363 3501 0236 04c0 ......c.Sc5..6..
0x0120: a802 0333 0400 0002 5801 04ff ffff 001c ...3....X.......
0x0130: 04c0 a802 ff03 04c0 a802 030f 0b65 7861 .............exa
0x0140: 6d70 6c65 2e6f 7267 0608 771d 1d1d df05 mple.org..w.....
0x0150: 0505 ff00 0000 ......
IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 0:d:d:d:d:d, length 300
0x0000: ffff ffff ffff 000d 0d0d 0d0d 0800 4510 ..............E.
0x0010: 0148 0000 0000 8011 3996 0000 0000 ffff .H......9.......
0x0020: ffff 0044 0043 0134 a707 0101 0600 0ba8 ...D.C.4........
0x0030: 5216 0000 0000 0000 0000 0000 0000 0000 R...............
0x0040: 0000 0000 0000 000d 0d0d 0d0d 0000 0000 ................
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0110: 0000 0000 0000 6382 5363 3501 0336 04c0 ......c.Sc5..6..
0x0120: a802 0332 04c0 a802 780c 0567 686f 7374 ...2....x..ghost
0x0130: 370d 011c 0203 0f06 770c 2c2f 1a79 2aff 7.......w.,/.y*.
0x0140: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0150: 0000 0000 0000 ......
IP 192.168.2.3.67 > 192.168.2.120.68: BOOTP/DHCP, Reply, length 300
0x0000: 000d 0d0d 0d0d 000b 0b0b 0b0b 0800 4510 ..............E.
0x0010: 0148 0000 0000 8011 b3c9 c0a8 0203 c0a8 .H..............
0x0020: 0278 0043 0044 0134 97f5 0201 0600 0ba8 .x.C.D.4........
0x0030: 5216 0000 0000 0000 0000 c0a8 0278 c0a8 R............x..
0x0040: 0203 0000 0000 000d 0d0d 0d0d 0000 0000 ................
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0110: 0000 0000 0000 6382 5363 3501 0536 04c0 ......c.Sc5..6..
0x0120: a802 0333 0400 0002 5801 04ff ffff 001c ...3....X.......
0x0130: 04c0 a802 ff03 04c0 a802 030f 0b65 7861 .............exa
0x0140: 6d70 6c65 2e6f 7267 0608 771d 1d1d df05 mple.org..w.....
0x0150: 0505 ff00 0000 ......
参考链接
https://tools.ietf.org/html/rfc2131
https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
来源:CSDN
作者:百里奔跑
链接:https://blog.csdn.net/zhishenluo/article/details/103729091