Wireshark抓包分析DHCP以及路由干扰过程

本文最后更新于:June 9, 2019 pm

使用Wireshark抓包分析DHCP过程,并分析在同一广播域中存在多个DHCP服务器的产生的路由干扰过程。

1、DHCP简介

动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或网络服务供应商自动分配IP地址;给用户用于内部网管理员作为对所有计算机作中央管理的手段。

DHCP有三种机制分配IP地址:

  1. 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
  2. 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
  3. 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。

三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。

2、DHCP状态机

2.0 DHCP状态机

如下图所示是比较常见的DHCP状态机,下面我们结合Wireshark抓到的数据包来进行分析。

2.0.1 如何抓取数据包

在windows下,使网卡重新发出DHCP请求获取IP地址比较简单的方法就是使用ipconfig命令。

1
2
3
4
# 释放IP地址
ipconfig -realease
# 重新获取IP地址
ipconfig -renew

需要注意的是要确定网卡配置中是使用了DHCP而不是手动指定IP地址。

2.0.2 一次DHCP过程的四个数据包

正常来说,一次DHCP过程只需要上面状态机的前四步,后面的续约是在DHCP的租期到达1/2和7/8的时候进行的。

打开任意一个数据包,我们可以看到wireshark已经把里面的数据分层显示。

从上到下依次为物理层、数据链路层、网络层、传输层和应用层。

接下来我们对这四个数据包进行分析。

2.1 发现阶段——DHCP Discover(广播)

2.1.1 DHCP Discover 理论分析

DHCP Discover(广播)是第一个阶段即DHCP客户端寻找DHCP服务端的阶段。

由于DHCP服务端的IP地址等信息对于DHCP客户端来说是未知,此时就需要使用广播的方式进行发送消息,基于UDP的源端口号68,目的端口号67来发送DHCP Discover发现信息来寻找DHCP服务器。

由于是广播包,在同一个广播域中的每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。

在二层中,广播地址是12个f即ff:ff:ff:ff:ff:ff

在三层中,广播地址是4个255(IPv4)即255.255.255.255

换算成二进制,即全为1。

2.1.2 DHCP Discover 物理层

物理层给出的有用信息并不多,但是我们能够看到网卡相关信息和这个是DHCP的数据包且使用了UDP协议。

2.1.3 DHCP Discover 数据链路层

数据链路层中我们可以看到本机的MAC地址和目标MAC地址(广播)。

2.1.4 DHCP Discover 网络层

网络层的参数较多,我们对其进行一一解析:

  • 版本(Version):4,表明这里使用IPv4

  • 头部长度(Header Length):20 bytes,即20个字节

  • 区分服务字段(Differentiated Services Field):0x00,十六进制,换算成二进制正好是下面的8个0,表明当前的IP数据报中没有使用服务类型字段,采用默认的“尽力传输”优先级别

  • 总长度(Total Lenth):328,表明该数据报的总长度是328个字节

  • 标识(Identification):0xe752,十六进制,换算成十进制正好是括号中的59218,表明该数据报的标识为0xe752

  • 分段标识(Flags):
    保留位(Reserved bit)为0,Don’t fragment为0表示该数据报可以被分段,More fragments为0表明后面没有分段

  • 分段偏移(Fragment offset):0,表明没有被分段

  • 生存时间(Time to live):128,表明该数据报最多可以经过128个路由

  • 上层协议(Protocol): UDP,值为17

  • 头部校验(Header checksum): validation disabled,表示没有进行校验

  • 校验状态(Header checksum status):Unverified,同上,没有进行校验

  • 源IP地址(Source):0.0.0.0,表明当前尚未获得DHCP服务端分配的IP地址,只能使用0.0.0.0

  • 目标IP地址(Destination):255.255.255.255,广播IP地址,对同一广播域内的所有TCP/IP协议客户端进行广播

2.1.5 DHCP Discover 传输层

传输层这里可以看到源端口为68,目的端口为67,且校验状态为未校验。

2.1.6 DHCP Discover 应用层

应用层的报文也有很多重要数据,我们截取重要的进行分析。

  • Bootp flags:0表示单播,1表示广播,这里为0,即DHCP服务端回复的DHCP Offer报文应为单播形式

部分书上讲述的DHCP四个包都是使用广播的方式进行,实际上DHCP Offer和DHCP Ack这两个数据包是广播还是单播是由DHCP的客户端发送的数据包来决定的。

  • Ciaddr即客户端IP地址(Client IP address)、

    Yiaddr即被分配的DHCP客户端IP地址( Your(client) IP address)、

    Siaddr即下一个为DHCP客户端分配IP地址的DHCP服务器地址(Next server IP address )、

    Giaddr即DHCP中继IP地址(Relay agent IP address)、

    这四个IP地址均为0.0.0.0,因为此时还处于DHCP的发现阶段,DHCP客户端对这些信息还是一无所知。

  • 我们还可以看到请求信息里面需要请求获取包括子网掩码(Subnet Mask)、路由网关(Router)、 DNS服务器(Domain Name Server) 、以及域名(Domain Name)等信息

2.2 提供阶段——DHCP Offer(单播/广播)

2.2.1 DHCP Offer 理论分析

提供阶段,即DHCP服务器向DHCP客户端提供预分配IP地址的阶段。网络中的所有DHCP服务器接收到客户端的DHCP Discover报文后都会根据自己的DHCP地址池中IP地址分配的优先次序选出一个IP地址,然后与其他参数一起通过传输层的UDP67号端口在DHCP Offer报文中以单播/广播方式发送给客户端的UDP68号端口。

DHCP服务器在分配这个地址之间会ping一下这个分配的ip地址,如果没有Response就才会预分配这个地址

客户端通过封装在帧中的目的MAC地址(也就是DHCP Discover报文中的CHADDR字段值)的比对来确定是否接收该帧。但这样以来,理论上DHCP客户端可能会收到多个DHCP Offer报文(当网络中存在多个DHCP服务器时),但DHCP客户端只接收第一个到来的DHCP Offer报文。

2.2.2 DHCP Offer 数据链路层

这时可以看到根据之前的DHCP报文,这里使用了单播的形式。而源MAC地址就是DHCP服务器的MAC地址且目的MAC地址是之前发送DHCP Discover报文的客户端MAC地址。

2.2.3 DHCP Offer 网络层

网络层报文中我们可以看到这时候目的IP地址和源IP地址都已经有了数据,10.22.25.118就是即将要分配的IP地址,而10.22.25.254就是DHCP服务器的地址又或者是DHCP中继代理服务器的IP地址,具体要看应用层的报文。

通过DHCP中继代理服务,与DHCP服务器不在同一子网的DHCP客户端可以通过DHCP中继代理(通常是路由器或三层交换机设备开启DHCP中继功能)与位于其他网段的DHCP服务器通信,最终是DHCP客户端获取到从DHCP服务器上分配而来的IP地址。

此时的DHCP中继代理就位于DHCP客户端和DHCP服务器之间,负责广播DHCP报文的转发。

2.2.4 DHCP Offer 应用层

这个时候我们再看应用层的报文:

  • Ciaddr即客户端IP地址(Client IP address):此时还没有分配,所以还是0.0.0.0
  • Yiaddr即被分配的DHCP客户端IP地址( Your(client) IP address):10.22.25.118,这个IP即将分配给该客户端
  • Siaddr即下一个为DHCP客户端分配IP地址的DHCP服务器地址(Next server IP address ):192.168.112.240,这个是分配IP地址的DHCP服务器
  • Giaddr即DHCP中继IP地址(Relay agent IP address):10.22.25.254,这个是DHCP的中继代理服务器的IP地址,在这里应该是一个开启了DHCP中继的三层交换机
  • 子网掩码(Subnet Mask)、路由网关(Router)、 DNS服务器(Domain Name Server) 、以及域名(Domain Name)等信息均已经包含在里面
  • 租约时间是需要注意的一个问题,这里我们可以看到DHCP租约时间(IP Address Lease Time)实际上是8天,单位是s,wieshark换算成了天方便我们查看
  • 而Renewal Time Value就是初次续约的时间,这个时间是租约时间的1/2,这里就是4天,这个时候一般客户端会以单播的方式向DHCP服务器发送报文请求续约
  • 而Rebinding Time Value就是第二次续约时间,这个时间是租约时间的7/8,这里也就是7天,只有在初次续约失败之后,才会在这个时间以广播的方式向网络中的DHCP服务器再次申请IP地址

2.3 选择阶段——DHCP Request(广播)

2.3.1 DHCP Request 理论分析

选择阶段,即DHCP客户端选择IP地址的阶段。

如果有多台DHCP服务器向该客户端发来DHCPOFFER报文,客户端只接收第一个收到的DHCP Offer报文,然后以广播方式发送DHCP Request报文。在该报文的Requested Address选项中包含DHCP服务器在DHCP Offer报文中预分配的IP地址、对应的DHCP服务器IP地址等。

这样也就相当于同时告诉其他DHCP服务器,它们可以释放已提供的地址并将这些地址返回到可用的地址池中。

在DHCP REQUEST报文封装的IP协议头部中,客户端的Source Address仍然是0.0.0.0,数据包的Destination仍然是255.255.255.255。但在DHCP Request报文中Ciaddr、Yiaddr、Siaddr、Giaddr 字段的地址均为0.0.0.0

2.3.2 DHCP Request 数据链路层

这时候又变回了广播。

2.3.3 DHCP Request 网络层

由于是广播,所以目标IP地址是255.255.255.255,而源IP地址还是0.0.0.0是因为还没有完成整个DHCP过程,本机尚未获取到IP地址。

2.3.4 DHCP Request 应用层

  • Bootp flags:0表示单播,1表示广播,这里为0,即DHCP服务端回复的报文应为单播形式
  • Ciaddr、Yiaddr、Siaddr、Giaddr 字段的地址均为0.0.0.0

2.4 确认阶段——DHCP Ack(单播/广播)

2.4.1 DHCP Ack 理论分析

确认阶段,即DHCP服务器确认分配级DHCP客户端IP地址的阶段。

某个DHCP服务器在收到DHCP客户端发来的DHCP REOUEST报文后,只有DHCP客户端选择的服务器会进行如下操作:如果确认将地址分配给该客户端,则以单播/广播方式返回DHCP ACK报文;否则返回DHCP NAK报文,表明地址不能分配给该客户端。

2.4.2 DHCP Ack 数据链路层

可以看到这里是单播,源MAC地址是DHCP服务器(此处为中继代理)的MAC地址,目标MAC地址是DHCP客户端的MAC地址。

2.4.3 DHCP Ack 网络层

10.22.25.118就是即将要分配的IP地址,而10.22.25.254就是DHCP服务器的地址(此处为DHCP中继代理服务器)

2.4.4 DHCP Ack 应用层

在DHCPACK报文中Yiaddr字段包含要分配给客户端的IP地址,而Chaddr和DHCP:Client Identifier字段是发出请求的客户端中网卡的MAC地址。

同时,在选项部分也会把在DHCPOFFER报文中所分配的IP地址的子网掩码、默认网关、DNS服务器、租约期、续约时间等信息加上。

3、DHCP的IP地址租约更新

3.1 DHCP服务IP地址租约更新原理

如果采用动态IP地址分配策略,则DHCP服务器分配给客户端的IP地址都是有一定租约期限的,当租约期满后DHCP服务器又会收回原来分配的这个IP地址。

如果DHCP客户端希望继续使用该地址,则需要向DHCP服务器提出更新IP地址租约的申请,也就是前面所说到的“续约”。

IP地址租约更新或者IP地址续约也就是更新服务器端对IP地址的租约信息,使其恢复为初始状态。

3.2 申请续约的方法

  1. 在DHCP客户端的IP地址租约期限达到1/2时,由DHCP客户端向为它分配IP地址的DHCP服务器以单播方式发送DHCP REOUEST请求报文,以期进行IP租约的更新。
  2. 如果DHCP服务器同意续约,则DHCP服务器向客户端以单播方式返回DHCP ACK报文,通知DHCP客户端已经获得新IP租约,可以继续使用此IP地址;相反,如果DHCP服务器不同意续约,则DHCP服务器以单播方式返回DHCP NAK报文,通知DHCP客户端不能获得新的租约,此IP地址不可以再分配给该客户端。
  3. 如果上面的续约申请失败,则DHCP客户端还会在租约期限达到7/8时再次以广播方式发送DHCP REQUEST请求报文进行续约。DHCP服务器的处理方式同上,不再赘述。
  4. 如果第二次续约请求还是失败,则原来租约的IP地址将被释放。

4、DHCP中继代理服务

在前面我们已经说过,在DHCP客户端初次从DHCP服务器获取IP地址的过程中,所有从DHCP客户端发出的请求报文均是以广播方式(目的地址为255.255.255.255)进行发送的,所以DHCP服务只适用于DHCP客户端和DHCP服务器处于同一个子网(也就是DHCP服务器至少有一个端口与DHCP客户端所在的子网是直接连接的)的情况,因为广播包是不能穿越子网的。

基于DHCP服务的以上限制,这样一来,如果DHCP客户端与DHCP服务器之间隔了路由器设备,不在同一子网,就不能直接通过这台DHCP服务器获取IP地址,即使DHCP服务器上已配置了对应的地址池。这也就意味着,如果想要让多个子网中的主机进行动态IP地址分配,就需要在网络中的所有子网中都设置一个DHCP服务器。这显然是很不经济的,也是没有必要的。

DHCP中继功能可以很好地解决DHCP服务的以上难题。通过DHCP中继代理服务,与DHCP服务器不在同一子网的DHCP客户端可以通过DHCP中继代理(通常也是由路由器或三层交换机设备担当,但需要开启DHCP中继功能)与位于其他网段的DHCP服务器通信,最终使DHCP客户端获取到从DHCP服务器上分配而来的IP地址。此时的DHCP中继代理就位于DHCP客户端和DHCP服务器之间,负责广播DHCP报文的转发。

从前面的报文分析我们可以轻松的看出10.22.25.118和192.168.112.240是明显不属于同一个子网的,他们之间通信肯定需要使用路由器进行路由,而10.22.25.254就是担任着DHCP中继代理的角色。

至于和DHCP服务器之间经过了多少个路由,我们可以tracert一下。

从图中我们可以看到,从10.22.25.254这个DHCP中继代理到DHCP服务器之间需要经过5个路由节点。

而实际上,在很多的大型园区网络中,都会使用一个DHCP服务器集群+多个DHCP中继代理这样的方式进行DHCP分配。

5、路由干扰

5.1 路由干扰原理

路由干扰是园区网络中经常出现的问题,主要体现在用户无法获取到正确的IP地址/网关地址/DNS服务器地址等信息而无法上网。

主要原因则是因为其他用户私接路由器且配置不当,导致私接的路由器成为所在的局域网中的第二个DHCP服务器,这时其他用户使用DHCP获取IP地址的时候就会有不只一个DHCP服务器提供IP地址。不幸的是,私接的路由器虽然能正确提供DHCP服务和IP地址等信息,却往往无法提供上网功能,这就会造成所谓的路由干扰。

从上面的解释我们可以知道,路由干扰只可能发生在使用DHCP协议的客户端,如果是使用静态IP地址,是可以避免路由干扰的。

因为这时候当客户端接入网络之后,会直接发送ARP请求来查询设置的网关IP地址的MAC地址信息,而根本不会去发送DHCP Discover报文。

但是,大型网络中使用静态网络地址往往容易产生管理混乱,IP地址冲突等问题。

5.2 路由干扰模拟

下面我们在一个局域网内接入两个DHCP服务器,进行路由干扰的模拟。

从本文前面我们可以知道,由于DHCP Discover是以广播的方式进行发送,因此局域网内的所有DHCP服务器都会进行回应,而客户端只会选择最快回应的那一个DHCP服务器,其他的DHCP服务器则会被拒绝,如果此时我们的局域网中出现了一个能提供DHCP服务而不能提供上网服务的设备,就会对其产生路由干扰。

5.2.1 模拟1

第一次模拟中我们可以看到,在客户端发送了DHCP Discover报文之后,10.22.25.254和192.168.100.1两个DHCP服务器都进行了回应,不同的是这时10.22.25.254的回应显然要快得多,因此客户端选择了10.22.25.254这个DHCP服务器而192.168.100.1这个DHCP服务器则是发送了DHCP NAK报文来表示DHCP失败。

5.2.2 模拟2

这次我们调整192.168.100.1这个路由器对于DHCP报文的查询频率(加快),再次进行模拟。

这次我们可以看到是192.168.100.1这个DHCP服务器先建立了连接。

5.2.3 实例分析

从上图的IPv4地址和对应的子网掩码,我们可以计算出对应的默认网关应该是10.27.26.254,而这里则是显示10.27.26.59,显然是错误的,很可能就是受到了路由干扰。

这种IP地址在接了路由器的情况下是很常见的,但是如果是接入的分配10开头的IP地址的网络中出现这种IP地址信息,也是很有可能受到了路由干扰。

5.2.4 定位干扰源

定位干扰源最简单的方法就是查询arp缓存表。

1
2
# 在cmd中输入下列命令查询arp缓存
arp -a

再根据IP信息中的默认网关(或者是DHCP服务器等其他异常信息)对应的IP地址找到干扰源的MAC地址,在交换机后台查询该MAC地址对应的交换机端口(往往需要网络管理员协助),即可定位干扰源。

5.3 路由干扰解决方案

5.3.1 用户合理配置路由器

  1. 将墙上端口接出来的网线插到用户自己的路由器的wan口上,这时候相当于在该网络中下接了一层网络,即又建立了一个小型的局域网;
  2. 关闭路由器的DHCP功能,将网线插到路由器的lan口上,此时路由器相当于一个傻瓜交换机,只能起到增加网络接口和提供无线接入(如果路由器有无线功能的话)的作用;

这种方法的弊端是很多用户并不知道如何合理的配置路由器,因此可行性不大。

5.3.2 DHCP Snooping

DHCP Snooping技术是DHCP安全特性,通过建立和维护DHCP Snooping绑定表过滤不可信任的DHCP信息,这些信息是指来自不信任区域的DHCP信息。DHCP Snooping绑定表包含不信任区域的用户MAC地址、IP地址、租用期、VLAN-ID 接口等信息。

当交换机开启了 DHCP-Snooping后,会对DHCP报文进行侦听,并可以从接收到的DHCP Request或DHCP Ack报文中提取并记录IP地址和MAC地址信息。另外,DHCP-Snooping允许将某个物理端口设置为信任端口或不信任端口。信任端口可以正常接收并转发DHCP Offer报文,而不信任端口会将接收到的DHCP Offer报文丢弃。这样,可以完成交换机对假冒DHCP Server的屏蔽作用,确保客户端从合法的DHCP Server获取IP地址。

DHCP Snooping可以非常有效地防止园区网中的路由干扰现象发生,但是需要网络管理员对每台路由网关进行配置,考虑到大型网络中可能会使用多种品牌和型号的交换机,这样子的工作量会比较大。