DHCP(Dynamic Host Configuration Procotol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作。DHCP的前身是BOOTP,属于TCP/IP的应用层协议。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546端口用于GHCP v6 Client,而不用于DHCPv4,是为DHCP failover服务。该服务是需要特别开启的服务,用来做双机热备的。
DHCP为互联网上主机提供地址和配置参数。DHCP是基于Client/Server工作模式,DHCP服务为主机分配IP地址和提供主机配置参数。DHCP主要作用如下所示:
(1)保证任何IP地址在同一时刻只能由一台DHCP客户机使用。
(2)DHCP可以给用户分配永久固定的IP地址。
(3)DHCP允许用其他方法获得IP地址的主机共存,如手动配置IP地址的主机。
(4)DHCP服务器向现有的BOOTP客户端提供服务。
DHCP有3种分配IP地址方式,分别是自动分配、动态分配和手工配置。它们的区别如下:
自动分配(Automatic Allocation):DHCP给客户端分配永久性的IP地址。
动态分配(Dynamic Allocation):DHCP给客户端分配的IP地址过一段时间后会过期,或者客户端可以主动释放该地址。
手动配置(Manual Allocation):由用户手动为客户端指定IP地址。
使用DHCP时,网络上首先必须有一台DHCP服务器,而其他计算机则是DHCP客户端。当DHCP客户端程序发出一个消息,要求一个动态IP地址时,DHCP服务器将根据目前配置的IP地址池,从中提供一个可供使用的IP地址和子网掩码给客户端。下面将介绍下DHCP的工作流程。
DHCP工作流程如下图:
从上图中,可以看出DHCP的工作过程分为4个阶段。分别表示发现阶段(DHCP Discover)、提供阶段(DHCP Offer)、选择阶段(DHCP Request)和确认阶段(DHCP Ack)。下面详细介绍这四个阶段:
(1)发现阶段,即DHCP客户端寻找DHCP服务器的阶段。DHCP客户端以广播方式(因为客户端不知道DHCP服务器的IP地址)发送DHCP Discover包,来寻找DHCP服务器,即向地址255.255.255.255发送特定的广播信息。网络上每一台安装了TCP/IP协议的主机都会接收到该广播信息,但只有DHCP服务器才会做出响应,如下:
上图表示本局域网中有3台DHCP服务器,都收到了客户端发送的DHCP Discover包。接下来就是服务器响应客户端了,即提供阶段。
(2)提供阶段,即DHCP服务器提供IP地址的阶段。在网络中收到DHCP Discover包的DHCP服务器,都会做出响应。这些DHCP服务器从尚未出租的IP地址中挑选一个给客户端,向客户端发送一个包含IP地址和其他设置的DHCP Offer包,如下图。
下面图中,局域网中的3个DHCP服务器都向客户端发送了DHCP Offer包。但是客户端只能接收一个服务器提供的信息,所以需要选择要接收的数据包信息。
(3)选择阶段,即DHCP客户机选择某台DHCP服务器提供的IP地址阶段。从上面图中可以看到,3台DHCP服务器都向客户端发送了DHCP Offer包。此时,DHCP客户机只接收第一个收到的DHCP Offer包。然后,以广播方式回答一个DHCP Request请求信息,该信息中包含向它所选定的DHCP服务器请求的IP地址的内容。这里使用广播方式回答,就是通知所有的DHCP服务器,它选择了某台DHCP服务器所提供的IP地址,如下图:
这时候,局域网中的所有DHCP服务器,都会收到DHCP客户端发送的DHCP Request信息。通过查看包信息,可以确定客户端是否选择了自己提供的IP地址。如果选择的是自己的,则发送一个确认包。否则,不进行响应。
(4)确认阶段,即DHCP服务器确认所提供的IP地址阶段。当DHCP服务器收到客户端发送的DHCP Request请求信息之后,便向DHCP客户端发送一个包含它提供的IP地址和其他设置的DHCP Ack信息,告诉DHCP客户端可以使用它所提供的IP地址,如下图。然后DHCP客户端将其TCP/IP协议与网卡绑定。另外,除了客户端选择的DHCP服务器外,其他的DHCP服务器都将收回曾提供的IP地址。
从上图中,也可以看出,只有一台DHCP服务器向客户端发送了DHCP Ack包。表示客户端选择了该服务器提供的IP地址及其他配置信息。
1)熟悉并掌握Wireshark的基本操作。
2)加深对常用网络协议的理解,提高就业机会。
3)培养学生理论联系实践的研究兴趣。
测试者:windows系统,IP地址:随机。
实验中,我们使用一台PC机器和路由器,即可产生DHCP数据包。现在的路由器都自带了DHCP功能,这样可以通过直接连接路由器来获取DHCP包。
在windows平台上,可以使用两种简单的方法实现,其原理一样。
(1)在cmd上,使用ipconfig命令来获取。
执行完上述命令后,将释放当前使用的地址信息。重新获取地址信息,执行命令如下:
执行完上面的命令后,将重新获取地址信息。在获取地址时,将会经过上面讲述的DHCP的4个阶段。这样,我们就能获取到DHCP数据包了。
(2)通过禁用和启用网卡获取DHCP数据包:
在windows平台上,也可以通过禁用和启用网卡获取DHCP数据包。其中,禁用网卡,相当于上面的“ipconfig /release”命令,启用网卡相当于上面的“ipconfig /renew”命令。禁用和启动网卡属于操作系统基本操作,这里就不解释了。
在linux下,可以通过使用ifdown和ifup命令来重新启动网卡。命令如下:
ifdown eth0 #禁用网卡
ifup eth0 #启用网卡
实验环境,没有涉及linux系统,这里就简单介绍下了。
分析之前,我们先来学习下DHCP报文格式:
在DHCP获取IP地址及其他网络配置参数的过程中,DHCP客户端和服务器之间要交换很多的消息报文,这些DHCP报文共有8种类型。每种报文的格式相同,只是某些字段的取值不同。DHCP报文格式如下:
DHCP报文格式:
各字段解释如下:
op:报文的操作类型。分为请求报文和响应报文,1是请求报文,2是响应报文。具体的报文类型在option字段中标识。
htype:DHCP客户端的硬件地址类型。1表示ethernet地址。
hlen:DHCP客户端的硬件地址长度。ethernet为6。
hops:DHCP报文经过的DHCP中继的数据。初始化为0,报文每经过一个DHCP中继,该字段就会增加1。
xid:客户端发起一次请求时选择的随机数,用来标识一次地址请求过程。
secs:DHCP客户端开始DHCP请求后所经过的时间,目前尚未使用,固定其0。
flags:DHCP服务器响应报文是采用单播还是广播方式发送。只使用第0比特位,0表示采用单播方式,1表示使用广播方式,其他比特保留不用。
ciaddr:DHCP客户端的IP地址。
yiaddr:DHCP服务器分配给客户端的IP地址。
siaddr:DHCP客户端获取IP地址等信息的服务器IP地址。
giaddr:DHCP客户端发出请求报文后经过的第一个DHCP中继的IP地址。
chaddr:DHCP客户端的硬件地址。
sname:DHCP客户端获取IP地址等信息的服务器名称。
file:DHCP服务器为DHCP客户端指定的启动配置文件名称及路径信息。
option:可选变长选项字段,包括报文的类型、有效租期、DNS服务器的IP地址和WINS服务器的IP地址等配置信息。
需要注意的是,上表DHCP报文格式中,每一个字段后的数字表示该字段在报文中占用的字节数。其中,option字段的长度要根据服务器所提供参数的多少而定,是可变的。
DHCP有8种类型的报文,每种报文的格式相同,只是报文中的某些字段取值不同。具体如下:
介绍完这些知识点后,我们来真正的分析下抓到的数据包。由于获取DHCP的特殊性(实验环境在使用ipconfig /Release后无法连接),实验环境已经有了抓完保存好的数据包,请学习者在自己的机器上抓取,并分析对照。本次实验将介绍下流程中常见的四个格式,其他的,小伙伴学完之后,自己分析是一样的。
打开dhcp.pcapng包,在Filter中输入bootp(输入DHCP是无效的),可以看到下面的DHCP协议数据:
在输入“ipconfig /Release”后,会出现DHCP Release数据包。在使用“ipconfig /renew”后,或出现Discover至ACK的数据包。下面,我们来分析DHCP Discover数据包:
其他的协议,我们不做分析,有兴趣的同学,可以看其他的实验,我们来看DHCP协议。
由于Wireshark在处理DHCP时,使用的是BOOTP协议,所以在Packet Detail面板中看到的是Bootstrap Protocol,而不是DHCP。
Bootstrap Protocol (Discover)
Message type: Boot Request (1) #DHCP消息类型,1表示请求包
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Hardware address length: 6 #硬件地址长度为6
Hops: 0 #经过DHCP中继数为0
Transaction ID: 0xe007659f #事务ID为0xe007659f
Seconds elapsed: 0 #客户端启动时间
Bootp flags: 0x0000 (Unicast) #BOOTP标志字段,此处是单播
0... .... .... .... = Broadcast flag: Unicast
.000 0000 0000 0000 = Reserved flags: 0x0000
Client IP address: 0.0.0.0 (0.0.0.0) #客户端IP地址
Your (client) IP address: 0.0.0.0 (0.0.0.0) #自己的(客户端)IP地址
Next server IP address: 0.0.0.0 (0.0.0.0) #下一阶段使用的DHCP服务器的IP地址
Relay agent IP address: 0.0.0.0 (0.0.0.0) #DHCP中继器的IP地址
Client MAC address: 02:00:04:78:01:7b (02:00:04:78:01:7b) #客户端的MAC地址
Client hardware address padding: 00000000000000000000 #客户端硬件地址填充
Server host name not given #服务器主机名
Boot file name not given #启动文件名
Magic cookie: DHCP #与BOOTP兼容
Option: (53) DHCP Message Type (Discover) #DHCP消息类型为53
Length: 1 #长度为1
DHCP: Discover (1) #发现包
Option: (61) Client identifier #客户端标识符
Length: 7 #长度为7
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Client MAC address: 02:00:04:78:01:7b (02:00:04:78:01:7b) #客户端MAC地址
Option: (50) Requested IP Address #请求IP地址
Length: 4 #长度为4
Requested IP Address: 10.1.1.142 (10.1.1.142) #请求的IP地址
Option: (12) Host Name #客户端主机名
Length: 10 #长度为10
Host Name: heetian-PC #主机名为heetian-PC
Option: (60) Vendor class identifier #供应商类标识符
Length: 8 #长度为8
Vendor class identifier: MSFT 5.0 #供应商标识符为MSFT 5.0
Option: (55) Parameter Request List #参数请求列表
Length: 12 #长度是12
Parameter Request List Item: (1) Subnet Mask #子网掩码
Parameter Request List Item: (15) Domain Name #域名
Parameter Request List Item: (3) Router #路由
Parameter Request List Item: (6) Domain Name Server #域名服务
Parameter Request List Item: (44) NetBIOS over TCP/IP Name Server #NetBIOS名称服务
Parameter Request List Item: (46) NetBIOS over TCP/IP Node Type #NetBIOS节点类型
Parameter Request List Item: (47) NetBIOS over TCP/IP Scope #NetBIOS作用范围
Parameter Request List Item: (31) Perform Router Discover #完成路由发现
Parameter Request List Item: (33) Static Route #静态路由
Parameter Request List Item: (121) Classless Static Route #无类静态路由
Parameter Request List Item: (249) Private/Classless Static Route (Microsoft) #私有静态路由
Parameter Request List Item: (43) Vendor-Specific Information #供应商特定信息
Option: (255) End
Option End: 255
Padding
通过对展开内容的介绍,每条信息的值都可以对应到DHCP报文格式中,如下表:
DHCP Discover报文格式:
在上表中,填写了DHCP Discover包的报文信息。在上表中,没有填的内容表示空值,由于该包中的选项值太多了,所以将该部分内容省略了。
响应数据是dhcp.pcapng包中的第1540帧,如下图,我们来看下,和发现数据包有什么不同。
Bootstrap Protocol (Offer)
Message type: Boot Reply (2) #DHCP消息类型,2表示响应包
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Hardware address length: 6 #硬件地址长度为6
Hops: 0 #经过DHCP中继数为0
Transaction ID: 0xe007659f #事务ID为0xe007659f
Seconds elapsed: 0 #客户端启动时间
Bootp flags: 0x0000 (Unicast) #BOOTP标志字段,此处是单播
0... .... .... .... = Broadcast flag: Unicast
.000 0000 0000 0000 = Reserved flags: 0x0000
Client IP address: 0.0.0.0 (0.0.0.0) #客户端IP地址
Your (client) IP address: 10.1.1.142 (10.1.1.142) #自己的(客户端)IP地址
Next server IP address: 10.1.1.1 (10.1.1.1) #下一阶段使用的DHCP服务器的IP地址
Relay agent IP address: 0.0.0.0 (0.0.0.0) #DHCP中继器的IP地址
Client MAC address: 02:00:04:78:01:7b (02:00:04:78:01:7b) #客户端的MAC地址
Client hardware address padding: 00000000000000000000 #客户端硬件地址填充
Server host name not given #服务器主机名
Boot file name not given #启动文件名
Magic cookie: DHCP #与BOOTP兼容
Option: (53) DHCP Message Type (Discover) #DHCP消息类型为53
Length: 1 #长度为1
DHCP: Offer (2) #响应包
Option: (54) DHCP Server Identifier #DHCP服务标识符
Length: 4 #长度为4
DHCP Server Identifier: 10.1.1.1 (10.1.1.1) #DHCP服务标识符
Option: (51) IP Address Lease Time #IP地址租约的最短时间
Length: 4 #长度为4
IP Address Lease Time: (4294967295s) infinity #IP地址租约的最短时间为无限期
Option: (1) Subnet Mask #子网掩码
Length: 4 #长度为4
Subnet Mask: 255.255.255.0 (255.255.255.0) #子网掩码值是255.255.255.0
Option: (28) Broadcast Address #广播地址
Length: 4 #长度为4
Broadcast Address: 10.1.1.255 (10.1.1.255) #广播地址值为10.1.1.255
Option: (6) Domain Name Server #域名服务
Length: 12 #长度为12
Domain Name Server: 10.1.1.1 (10.1.1.1) #域名服务地址为10.1.1.1
Domain Name Server: 8.8.8.8 (8.8.8.8) #域名服务地址为8.8.8.8
Domain Name Server: 8.8.8.8 (8.8.8.8) #域名服务地址为8.8.8.8
Option: (3) Router #路由
Length: 4
Router: 10.1.1.1 (10.1.1.1) #路由器地址为10.1.1.1
Option: (15) Domain Name #域名
Length: 17
Domain Name: cs2cloud.internal #域名为cs2cloud.internal
Option: (43) Vendor-Specific Information #供应商特定信息
Length: 7
Value: 020400000001ff
Option: (60) Vendor class identifier #供应商类标识符
Length: 8
Vendor class identifier: MSFT 5.0
Option: (255) End
Option End: 255
Padding
通过上面的信息,我们可以清楚的了解到DHCP服务器提供的详细信息。例如,提供给客户端的IP地址为10.1.1.142,DHCP服务标识符是10.1.1.1,子网掩码是255.255.255.0,IP地址的租约是无期限等。这里就不在列举其他的信息了,将每条信息的值对应到DHCP报文中,如下:
DHCP Offer报文格式:
下面我们来看下请求数据包,第1541帧:
学习就是枯燥的,请大家坐着板凳。
Bootstrap Protocol (Request)
Message type: Boot Request (1) #DHCP消息类型,1表示请求包
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Hardware address length: 6 #硬件地址长度为6
Hops: 0 #经过DHCP中继数为0
Transaction ID: 0xe007659f #事务ID为0xe007659f
Seconds elapsed: 0 #客户端启动时间
Bootp flags: 0x0000 (Unicast) #BOOTP标志字段,此处是单播
0... .... .... .... = Broadcast flag: Unicast
.000 0000 0000 0000 = Reserved flags: 0x0000
Client IP address: 0.0.0.0 (0.0.0.0) #客户端IP地址
Your (client) IP address: 0.0.0.0 (0.0.0.0) #自己的(客户端)IP地址
Next server IP address: 0.0.0.0 (0.0.0.0) #下一阶段使用的DHCP服务器的IP地址
Relay agent IP address: 0.0.0.0 (0.0.0.0) #DHCP中继器的IP地址
Client MAC address: 02:00:04:78:01:7b (02:00:04:78:01:7b) #客户端的MAC地址
Client hardware address padding: 00000000000000000000 #客户端硬件地址填充
Server host name not given #服务器主机名
Boot file name not given #启动文件名
Magic cookie: DHCP #与BOOTP兼容
Option: (53) DHCP Message Type (Request) #DHCP消息类型为53
Length: 1 #长度为1
DHCP: Discover (3) #请求包
Option: (61) Client identifier #客户端标识符
Length: 7 #长度为7
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Client MAC address: 02:00:04:78:01:7b (02:00:04:78:01:7b) #客户端MAC地址
Option: (50) Requested IP Address #请求IP地址
Length: 4 #长度为4
Requested IP Address: 10.1.1.142 (10.1.1.142) #请求的IP地址
Option: (54) DHCP Server Identifier #DHCP服务器标识符
Length: 4
DHCP Server Identifier: 10.1.1.1 (10.1.1.1) #DHCP标识符为10.1.1.1
Option: (12) Host Name #客户端主机名
Length: 10 #长度为10
Host Name: heetian-PC #主机名为heetian-PC
Option: (81) Client Fully Qualified Domain Name #客户端完全合格域名
Length: 13
Flags: 0x00 #标志位
0000 .... = Reserved flags: 0x00 #保留标志位
.... 0... = Server DDNS: Some server updates #服务器DDNS
.... .0.. = Encoding: ASCII encoding #编码格式
.... ..0. = Server overrides: No override #服务重写
.... ...0 = Server: Client
A-RR result: 0
PTR-RR result: 0
Client name: heetian-PC #客户端名称
Option: (60) Vendor class identifier #供应商类标识符
Length: 8 #长度为8
Vendor class identifier: MSFT 5.0 #供应商标识符为MSFT 5.0
Option: (55) Parameter Request List #参数请求列表
Length: 12 #长度是12
Parameter Request List Item: (1) Subnet Mask #子网掩码
Parameter Request List Item: (15) Domain Name #域名
Parameter Request List Item: (3) Router #路由
Parameter Request List Item: (6) Domain Name Server #域名服务
Parameter Request List Item: (44) NetBIOS over TCP/IP Name Server #NetBIOS名称服务
Parameter Request List Item: (46) NetBIOS over TCP/IP Node Type #NetBIOS节点类型
Parameter Request List Item: (47) NetBIOS over TCP/IP Scope #NetBIOS作用范围
Parameter Request List Item: (31) Perform Router Discover #完成路由发现
Parameter Request List Item: (33) Static Route #静态路由
Parameter Request List Item: (121) Classless Static Route #无类静态路由
Parameter Request List Item: (249) Private/Classless Static Route (Microsoft) #私有静态路由
Parameter Request List Item: (43) Vendor-Specific Information #供应商特定信息
Option: (255) End
Option End: 255
Padding
通过对展开内容的介绍,每条信息的值都可以对应到DHCP报文中,如下:
DHCP Request报文格式:
确认报文,第1542帧,如下:
该包是DHCP工作流程的最后一步,通过该包就可以获取到所请求的IP地址,并在其数据库中记录相关的信息,下面对该行的展开信息进行详细介绍:
Bootstrap Protocol (ACK)
Message type: Boot Reply (2) #DHCP消息类型,2表示响应包
Hardware type: Ethernet (0x01) #硬件类型为Ethernet
Hardware address length: 6 #硬件地址长度为6
Hops: 0 #经过DHCP中继数为0
Transaction ID: 0xe007659f #事务ID为0xe007659f
Seconds elapsed: 0 #客户端启动时间
Bootp flags: 0x0000 (Unicast) #BOOTP标志字段,此处是单播
0... .... .... .... = Broadcast flag: Unicast
.000 0000 0000 0000 = Reserved flags: 0x0000
Client IP address: 0.0.0.0 (0.0.0.0) #客户端IP地址
Your (client) IP address: 10.1.1.142 (10.1.1.142) #自己的(客户端)IP地址
Next server IP address: 10.1.1.1 (10.1.1.1) #下一阶段使用的DHCP服务器的IP地址
Relay agent IP address: 0.0.0.0 (0.0.0.0) #DHCP中继器的IP地址
Client MAC address: 02:00:04:78:01:7b (02:00:04:78:01:7b) #客户端的MAC地址
Client hardware address padding: 00000000000000000000 #客户端硬件地址填充
Server host name not given #服务器主机名
Boot file name not given #启动文件名
Magic cookie: DHCP #与BOOTP兼容
Option: (53) DHCP Message Type (ACK) #DHCP消息类型为53
Length: 1 #长度为1
DHCP: ACK (5) #确认包
Option: (54) DHCP Server Identifier #DHCP服务标识符
Length: 4 #长度为4
DHCP Server Identifier: 10.1.1.1 (10.1.1.1) #DHCP服务标识符
Option: (51) IP Address Lease Time #IP地址租约的最短时间
Length: 4 #长度为4
IP Address Lease Time: (4294967295s) infinity #IP地址租约的最短时间为无限期
Option: (1) Subnet Mask #子网掩码
Length: 4 #长度为4
Subnet Mask: 255.255.255.0 (255.255.255.0) #子网掩码值是255.255.255.0
Option: (28) Broadcast Address #广播地址
Length: 4 #长度为4
Broadcast Address: 10.1.1.255 (10.1.1.255) #广播地址值为10.1.1.255
Option: (81) Client Fully Qualified Domain Name #客户端完全合格域名
Length: 30
Flags: 0x03 #标志位
0000 .... = Reserved flags: 0x00 #保留标志位
.... 0... = Server DDNS: Some server updates #服务器DDNS
.... .0.. = Encoding: ASCII encoding #编码格式
.... ..1. = Server overrides: No override #服务重写
.... ...1 = Server: Client
A-RR result: 255
PTR-RR result: 255
Client name: Client name: win7-64-1.cs2cloud.internal #客户端名称
Option: (6) Domain Name Server #域名服务
Length: 12 #长度为12
Domain Name Server: 10.1.1.1 (10.1.1.1) #域名服务地址为10.1.1.1
Domain Name Server: 8.8.8.8 (8.8.8.8) #域名服务地址为8.8.8.8
Domain Name Server: 8.8.8.8 (8.8.8.8) #域名服务地址为8.8.8.8
Option: (3) Router #路由
Length: 4
Router: 10.1.1.1 (10.1.1.1) #路由器地址为10.1.1.1
Option: (15) Domain Name #域名
Length: 17
Domain Name: cs2cloud.internal #域名为cs2cloud.internal
Option: (43) Vendor-Specific Information #供应商特定信息
Length: 7
Value: 020400000001ff
Option: (60) Vendor class identifier #供应商类标识符
Length: 8
Vendor class identifier: MSFT 5.0
Option: (255) End
Option End: 255
Padding
报文格式表格如下:
DHCP ACK报文格式:
到这里,我们简单的分析完了四个流程,有兴趣的同学,可以看看分析其他的报文,方法类似。