###实验环境 • 操作机:Windows XP ###实验目的 1、 熟悉DHCP协议的基本概念 2、 学会利用wireshark捕获含有DHCP协议的数据包 3、 在wireshark中分析DHCP协议提供IP地址的四个步骤 ###实验工具 o wireshark
##实验步骤 ###DHCP的工作原理 DHCP的前身:BOOTP协议(Bootstrap Protocol),属于TCP/IP的应用层协议。BOOTP协议当初被创建出来给连接到网络的设备自动分配地址。直到后来才被更加复杂而完善的DHCP协议所取代。 DHCP在网络配置方面非常_重要_,特别是当一个_网络的规模较大_时,使用DHCP可以极大地减轻网络管理员的工作量。另外,对于移动设备来说,由于使用的环境会经常改变,那么它所处的网络IP地址也就可能随时变动。如果每次都需要通过手工修改来设置它们的IP地址,使用起来就会非常麻烦。那么此时,就可以使用DHCP来减轻负担。这里我们通过下图来分析一下DHCP的工作流程:
在使用DHCP的时候,网络上首先必须有一台DHCP服务器,而其它计算机则是DHCP的客户端。整个DHCP的工作过程分为4个阶段,即**发现阶段(Discover)_、_提供阶段(offer)_、_请求阶段(request)_以及_确认阶段(ACK)**。这里分别简单介绍一下上述四种数据包的类型: ####1、DHCP Discover DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播的形式发送请求数据包。这个数据包就被称作_Discover数据包_,目的是发现网络中的DHCP服务器。所有收到Discover数据包的DHCP服务器都会发送响应数据包,那么客户端就可以知道网络中存在的DHCP服务器的位置。 ####2、DHCP offer 当DHCP服务器收到Discover数据包后,就会在所配置的地址池中寻找一个合适的IP地址,加上相应的租约期限和其它配置信息(如网关、DNS服务器等),构造一个offer数据包,发送给客户端,告知客户端本服务器可以为其提供IP地址。 ####3、DHCP Request DHCP客户端可能会收到很多的offer,所以必须要从中选择一个。一般来说,客户端会选择第一个回应的offer数据包服务器作为自己的目标服务器,并回应一个广播Request数据包,以告诉所有的服务器,自己已经做出了选择。当DHCP客户端成功获取IP地址后,在地址使用租期过去一半的时候,会向DHCP服务器发送_单播Request数据包_,用于延续租期。如果没有收到_DHCP ACK_数据包,那么在租期过去四分之三时,会发送广播Request数据包来延续租期。 ####4、DHCP ACK DHCP服务器收到Request数据包后,根据Request数据包中携带的用户MAC地址来查找有没有相应的租约记录,如果有则发送ACK数据包作为回应,通知用户可以使用分配的IP地址。 ###DHCP数据包的捕获 为了捕获到DHCP数据包,这里我在虚拟机的环境下,首先打开_Wireshark_,在捕获选项中,设置筛选条件为_UDP_,因为DHCP是使用UDP协议工作的。之后开启Wireshark的捕获。现在我们需要让系统产生DHCP的数据包,由于DHCP只有当主机的IP地址过期或者重新启动系统时,才会重新请求IP地址。否则是不能够产生DHCP数据包的。那么我们可以通过重新启动网卡的方法,进行数据包的捕获。 这里我们打开命令提示符,使用_ipconfig_的_release_以及_renew_参数来释放并重新获取地址信息。
此时我们在Wireshark中就可以获取DHCP数据包了。 ###步骤4:DHCP数据包的分析 由于在捕获的文件中还存在有其它的数据包,因此这里我们可以加入一个筛选条件bootp,那么此时剩下的就全都是DHCP协议的数据包了:
在这里我们可以看到DHCP的释放、发现、提供、请求和确认数据包。这里我们分别进行分析。 1、释放数据包 捕获文件的第一个数据包就是释放数据包。当用户不再需要使用分配的IP地址时,就会向DHCP服务器发送 Release数据包,告知服务器,用户已经不再需要分配的IP地址,DHCP服务器就会释放掉被绑定的租约。 2、发现数据包 我们再看一下第二个数据包。它是从0.0.0.0的68号端口发往255.255.255.255的67号端口。_客户端使用0.0.0.0,是因为它目前还没有IP地址_。数据包被_发往255.255.255.255,是因为这是一个独立于网络的广播地址_,这就能够确保这个数据包会被发送到网络中的所有设备上。因为客户端并不知道DHCP服务器的地址,所以这么做就一定可以找到正在监听的DHCP服务器。 接下来我们可以看到_DHCP是基于UDP_作为其传输协议的,因为DHCP客户端对请求响应速度有很高的要求。而DHCP有其内置的保证可靠性的方法,也就意味着UDP是最适合的协议。需要说明的是,由于Wireshark在处理DHCP时,仍然会引用BOOTP,所以我们会在_Packet Details面板中看到Bootstrap Protocol_,而不是DHCP:
这是一个请求数据包,因为在消息类型(Message type)中被标记为1。在这个发现数据包中,还可以看到很多为空的IP地址域。另外还需要我们注意的是选项中的内容,它用来对DHCP数据包进行扩展,以提供更多的功能。这里比较重要的有: _DHCP消息类型(DHCP Message Type)_:这个选项是一个长度和值均为1的53类型。表明它是一个发现数据包。 _客户端标识符(Client identifier)_:这里提供了客户端请求IP地址的额外信息。 _所请求的IP地址(Requested IP Address)_:这里提供了客户端希望得到的IP地址(通常是之前用过的IP地址)。 _请求参数列表(Parameter Request List)_:这里列出了客户端希望从DHCP服务器接收到的不同配置项(其它重要网络设备的IP地址)。 ####3、提供数据包 捕获文件的第三个数据包就是提供数据包。可以看到这个数据包是从192.168.147.254发往192.168.147.129的。尽管目标地址是192.168.147.129,也就是客户端的地址,但事实上,客户端还没有这个地址,所以服务器会首先尝试使用由ARP提供的客户端硬件地址与之通信。如果通信失败,那么它将会直接把提供数据包广播出去,以进行通信。 这里我们看一下它的DHCP部分,它被称为提供数据包,说明这是一个用于响应的消息类型。这个数据包包含了和前一个数据包相同的事务ID,通过这个IP就可以知道这个响应与我们原先的请求相对应。 这个提供数据包由DHCP服务器发出,用于向客户端提供服务。它提供了关于它自己的信息,以及给客户端提供的地址。如下图所示:
在Your(client)IP address中,地址192.168.147.129就是要提供给客户端的地址。而Next server IP address中的192.168.147.254表明我们的DHCP服务器与默认网关共享一个IP地址。 下面列出的第一个选项说明这个数据包是一个DHCP的提供数据包。选项中还需要我们关注的内容有: _IP地址租约时间_(IP Address Lease Time)是30分钟。 _子网掩码_(Subnet Mask)是255.255.255.0。 _路由器_(Router)地址为192.168.147.2。 ####4、请求数据包 在客户端接收到DHCP服务器的提供数据后,它将会以一个DHCP请求数据包作为接收确认:
这个数据包仍然从_IP地址为0.0.0.0_处发出,毕竟我们还没有完成获取IP地址的过程,但是数据包现在知道了DHCP服务器的存在。可以发现,这是一个请求数据包。这个数据包与发现数据包相似,其所有的IP地址信息都是空的。在最后的选项域中,我们看到这是一个DHCP请求。 ####5、确认数据包 整个过程的最后一步就是DHCP在确认数据包中给客户端发送其所请求的IP地址,并在数据库中记录相关信息。那么此时客户端就有了一个IP地址,就可以使用它在网络上通信了。 #####DHCP租约内续租 当DHCP给一台设备分配了一个IP地址时,它同时给客户端定下了一个租约。这就表示着,客户端只能够在有限的时间内使用这个IP地址,到了时间就一定要续租。我们刚才介绍的DHCP数据包的分析过程是出现在客户端第一次获取IP地址或者其租约时间已经过期的情况下,这两种情况就会被视为租约过期。 当一个拥有IP地址的客户端在租约内重新启动,它必须经过一次精简版的DHCP数据包传输过程来重新认领它的IP地址。这个过程就被称为_租约内续租_。 在租约内续租的时候,发现和提供数据包就变得没有必要了,只需要完成请求和确认两个步骤就可以了: