查看原文
其他

【技术】DHCP 原理及抓包分析

汪清远 清远的梦呓 2021-12-21

1. DHCP 简介

1.1 DHCP 作用

DHCP(Dynamic Host Configurations Protocol),动态主机配置协议,前身是 BOOTP 协议,是一个局域网的网络协议,使用 UDP 协议工作。

 

DHCP 通常被用于局域网环境,主要作用是集中的管理、分配 IP 地址,使 Client 动态的获得IP地址、Gateway 地址、DNS 服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP 就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。

 

DHCP 涉及客户端和服务端。在使用 DHCP 之前,必须要架设一台 DHCP 服务器(很多时候使用该网段的路由器充当 DHCP 服务器)。

 

DHCP 客户端一般来说是局域网中独立的 PC 主机。DHCP 客户端发出的DHCP DISCOVER 包是 DHCP 协议的开始。延续租期、发现、释放IP地址等大多数 DHCP 中的行为都是由 DHCP 客户端主动发起。

 

DHCP 服务器端,在路由器上体现的就是给 LAN 端动态分配IP的功能。DHCP SERVER 负责接收客户端的 DHCP 请求,管理 LAN 端所有的网络IP信息,DHCP 通过“租约”来实现动态分配IP的功能,实现IP 的时分复用,从而解决 IP 资源短缺的问题。

 

DHCP 服务器管理IP的方式有三种:

1)   人工配置(由管理员对每台具体的计算机指定一个地址)

2)   自动配置(服务器为第一次连接网络的计算机分配一个永久地址)

3)   动态配置(在一定的期限内将地址租给计算机,租期结束后客户必须续租或者停用该地址),路由器经常使用的是动态配置。

 

1.2 DHCP 工作机制

DHCP 维护了两个租约表:静态租约表及动态租约表。


静态租约表:对应一个静态租约存储文件, Server 运行时从文件中读取静态租约表。


动态租约表:对应一个周期存储文件, Server 周期性将租约表存进该文件,在程序开始时将会读取上次存放的租约表。(租约表记录了当前所有分配的租约,包括静态链接的)。

 

客户端发起请求,服务器读取客户端信息,并在租约表中进行检索找到相应的表项,再根据客户端的状态执行不同的回复。当收到客户端的首次请求时,DHCP 服务器先查找静态租约表;若存在请求的表项,返回这个客户的静态 IP 地址;否则,从 IP 地址池中选择可用的 IP 分配给客户,并添加信息到动态数据库中。此外,服务器将会周期性的刷新租约表写入文件存档,在这个过程中会顺便对动态租约表进行租期检查。

 

2.  DHCP 交互流程

2.1 正常交互流程

DHCP 正常交互流程如图 1所示:

图 1 客户端服务器正常交互流程

        

1)   客户端请求 DHCP 服务器:发送 DHCP DISCOVER 包


当 DHCP 客户端第一次登录网络的时候(也就是客户端上没有任何IP地址数据时),它会通过 UDP 67 端口向网络上发出一个 DHCP DISCOVER 数据包(包中包含客户端的 MAC 地址和计算机名等信息)。因为客户端还不知道自己属于哪一个网络,所以封包的源地址为0.0.0.0,目标地址为 255.255.255.255,然后再附上 DHCP DISCOVER 的信息,向网络进行广播。

 

DHCP DISCOVER 的等待时间预设为 1 秒,也就是当客户端将第一个DHCP DISCOVER 封包送出去之后,在 1 秒之内没有得到回应的话,就会进行第二次 DHCP DISCOVER 广播。若一直没有得到回应,客户端会将这一广播包重新发送四次(以 2,4,8,16 秒为间隔,加上 1-1000 毫秒之间随机长度的时间)。如果都没有得到DHCP Server的回应,客户端会从 169.254.0.0/16 这个自动保留的私有 IP 地址中选用一个IP地址。并且每隔 5 分钟重新广播一次,如果收到某个服务器的响应,则继续IP租用过程。 

 

2)   服务端提供 IP 地址租用:发送 DHCP OFFER 包


当 DHCP Server 监听到客户端发出的 DHCP DISCOVER 广播包后,它会从那些还没有租出去的地址中,按照一定的规则选择一个空置 IP ,通过 UDP 68 端口发送 DHCP OFFER 广播包(包中包含IP地址、子网掩码、地址租期等信息)。DHCP Server 为此客户保留它提供的 IP 地址,从而不会为其他DHCP客户分配此IP地址。

 

静态租用:首先匹配 MAC 地址,看是否能在静态租约表中找到对应的项,若能找到就把 IP 分配给他。静态表中的IP不能被其他客户使用。 

 

动态租用:

a)   Server 试图分配给 Client 上次分配过的IP,在这之前检查这个 IP 是否正在使用


b)   DISCOVER 中含有 Request IP  时,检查该IP是否在地址池范围,是否正在使用,是否到期,是否是静态 IP,网络上是否已经存在


c)   DISCOVER 不含 Request IP,从地址池上寻找一个最小的可用 IP 分配

 

3)   接受 IP 租约::发送 DHCP REQUEST 包


如果客户端收到网络上多台 DHC P服务器的响应,按照一定的规则挑选其中一个 DHCP OFFER (一般是最先到达的那个),并且会向网络发送一个 DHCP REQUEST 广播数据包(包中包含客户端的 MAC 地址、接受的租约中的IP地址、提供此租约的 DHCP 服务器地址等),告诉所有 DHCP Server 它将接受哪一台服务器提供的IP地址,其他的 DHCP 服务器撤销它们未被采用的 IP。

 

4)   租约确认:ACK


当 DHCP Server 接收到客户端的 DHCP REQUEST 之后,会广播返回给客户端一个 DHCP ACK 消息包,表明已经接受客户端的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户端。

 

客户端在接收到 DHCP ACK 广播后,会向网络发送三个针对此 IP 地址的 ARP 解析请求以执行冲突检测,查询网络上有没有其它端器使用该 IP 地址;如果发现该 IP 地址已经被使用,客户端会发出一个 DHCP DECLINE 数据包给 DHCP Server,拒绝此IP地址租约,并重新发送 DHCP DISCOVER 信息。此时,在 DHCP 服务器管理控制台中,会显示此 IP 地址为 BAD_ADDRESS。

 

如果网络上没有其它主机使用此IP地址,则客户端的 TCP/IP 使用租约中提供的 IP 地址完成初始化,从而可以和其他网络中的主机进行通讯。

 

5)   租约 NAK


REQUEST 失败,出现此种问题有如下两种原因:

a)   请求的 IP 是静态 IP,但是 MAC 地址无法与其对应。

b)   DHCP ACK 中验证失败。

  

2.2 租约

租约生命周期分为如下几个阶段

a)   分配(Allocation:):客户端没有租约,没有IP地址,通过“分配”阶段请求租约


b)   重新分配(Reallocation:):客户端已经有了租约,因此有了 IP 地址,但是重启了。于是向授权其租约的服务器确认租约以及获取操作参数


c)   正常操作(Normal Operation):租约有效,客户端使用其分配的IP地址和其他参数进行业务


d)   更新(Renewal):在租约快过期时,客户端向授予其租约的服务器请求更新租约


e)   重新绑定(Rebinding):如果更新失败,那么客户端向任意有效的服务器请求重新绑定租约


f)   释放(Release):客户端不在使用被分配的IP地址,因此释放该IP。

 

租约生命周期如图 2所示:

图 2 租约生命周期示意图

 

租约分配流程如图 3所示:

图 3 租约分配流程

 

租约重新分配流程如图 4所示:

图 4 租约重新分配过程

 

租约更新和重新绑定如图 5所示:

图 5 租约更新和重新绑定过程


2.3 客户端状态机

客户端的有限状态机如图 6、图 7、图 8所示:

图 6 客户端状态机图1

图 7 客户端状态机图2

图 8 客户端状态机图3

 

客户端状态机切换如图 9所示:

图 9 客户端状态机变化


2.4 参数配置

参数配置流程如下图 10所示:

图 10 参数配置过程

 

路由器上的 DHCP 服务器配置信息如图 11所示:

图 11 路由器上DHCP服务器配置信息


3.  DHCP 报文

3.1 报文类型

DHCP 涉及报文如下:

 下文对主要的报文格式进行介绍。

 

3.2 报文格式

报文格式如图 12所示:

图 12 报文格式

 

各字段含义如图 13、图 14、图 15所示:

图 13 报文字段含义图1

图 14报文字段含义图2 

图 15报文字段含义图3


Op:操作码,客户端发包是1,服务端回复是2

HType:用于本地网络的硬件类型

HLen:硬件地址长度,对于用 MAC 地址的网络,该值为6(6字节,48位)

XID: 随机生成的一段字符串,两个数据包拥有相同的XID说明他们属于同一次会话

CIAddr:客户端会在发送请求时将自己的 IP 地址放在此处(更新租约时用)

YIAddr:服务器会将想要分配给客户端的 IP 地址放在此处

SIAddr:一般来说是服务器的 IP 地址.

Chaddr:客户端的 MAC 地址

GIAddr:如果需要跨子网进行 DHCP 地址发放,则在此处填入经过的路由器的 IP 地址

SName:服务器主域名

Options:可以自由添加的部分,用于存放客户端向服务器请求信息和服务器的应答信息


Options 字段格式如图 16所示:

图 16 Options字段格式

 

Option 格式如图 17所示:

图 17 Option格式

 

DHCP Option 类别如下图 18所示:

图 18 Option类别

 

3.3 抓包

说了那么多,通过 Wireshark 抓包实战,看一下 DHCP 交互的具体流程及报文信息。

 

首先查看一下电脑的网络配置,如图 19所示

图 19 DHCP使能

        

1) 通过 Wireshark 抓包

2) 通过命令 ipconfig /renew 更新网络信息

 

通过 udp.port==67 过滤报文,只看到了两个报文,一个是 REQUEST,另一个是 ACK ,具体信息如下:

图 20 Request报文


由于之前电脑已经被分配了 192.168.0.100 的 IP 地址,因此在图 20中的 Client IP 地址的值是 192.168.0.100。


ACK 报文如图21所示:

图 21 ACK报文

 

可以看到,电脑又被分配了 192.168.0.100 的地址(租约重新分配)。

 

如果想看一下 DISCOVER 及 OFFER 报文,该怎么办?通过如下命令:

1)   ipconfig  /release

2)   ipconfig  /renew

 

通过 udp.port==67 过滤报文,结果如图 22 所示:

图 22 DHCP操作过程

 

DISCOVER 报文格式如图 23 所示:

图 23 Discover 报文格式


OFFER 报文格式如图 24 所示:

图 24 Offer报文格式


INFORM 报文格式如图 25 所示:

图 25 Inform报文格式


RELEASE 报文格式如图 26 所示:

图 26 Release报文格式


4. DHCP 中继代理

家庭网络大多只有一个以太网的网段,与其连接的主机台数也不会太多。因此,一台 DHCP 服务器即可满足 IP 地址分配的需求,而大多情况下都由宽带路由器充当这个 DHCP 的角色。

 

但是,对于企业或者学校等大规模组织机构的网络环境,一般会有多个以太网网段。这种情况下,如果为每个网段都设置 DHCP 服务器将会很繁琐,并且容易出错。即使路由器可以分担 DHCP 的概念,但是如果网络中有 10 个路由器,就要为路由器设置它们各自可分配 IP 地址的范围,并且对这些范围进行后续的变更维护,这样就很耗时和难以管理了。

 

于是,DHCP 中继代理器应运而生。有了中继代理器后,对不同网段的IP地址分配可以由一个 DHCP 服务器统一进行管理和运维。

 

在每个网段设置一个 DHCP 中继代理(可以用路由器或者直接在主机上配置),它可以设置 DHCP 服务器的IP地址,这样就可以在 DHCP 服务器上为每个网段注册IP地址的分配范围。

 

DHCP 客户端向 DHCP 中继代理发送 DHCP 请求包,DHCP 中继代理在收到这个广播包后,再以单播的形式发送给 DHCP 服务器。服务器收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包转发给 DHCP 客户端( DHCP 包中包含发出请求的主机的 MAC 地址。DHCP 代理正是利用这个 MAC 地址将包返回给 DHCP 客户端)。由此,即使 DHCP 服务器不在同一个链路上也可以实现统一分配和管理 IP 地址

  

参考资料

1. 《 The TCP/IP Guide 》

2.《 图解 TCP/IP 》

3. https://www.cnblogs.com/

happygirl-zjj/p/5976526.html

4. http://www.blog.chinaunix.net/uid-20530497

-id-2203830.html

5. http://blog.51cto.com/tonyguo

/163475 


如果文章有触动你

就给我一个“好看”


脚踏实地

诗与远方

清远的梦呓

长按二维码关注


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存