前言
要做好运维工作,对协议的深入理解至关重要,今天我们为大家带来DHCP协议,一起从流量分析角度来学习一下DHCP协议。本篇文章给大家讲解DHCP的概念、原理、数据包解码及简单的分析方法。后续还会为大家带来更多的常见应用层协议讲解。希望通过本篇系列文章,对大家在DHCP相关的业务运维中有所帮助。
DHCP协议的概念
DHCP全称Dynamic Host Configuration Protocol,动态主机配置协议,前身是BOOTP协议(若你使用的是很古老的网络分析软件,设置过滤条件时需要设为protocol=bootp)。简单的说DHCP协议就是服务器向客户端动态分配IP地址等配置信息。
DHCP是常用的应用层协议,它帮助电脑终端在访问因特网时自动获取IP地址。采用UDP作为传输协议,客户端发送消息到DHCP服务器的的67号端口,服务器返回消息给客户端的68号端口。
DHCP原理
DHCP基于C/S架构(客户端/服务器架构):
1、DHCP客户端:通常为PC等终端设备,向DHCP服务器请求IP地址、DNS等信息。
2、DHCP服务器:集中管理所有的IP网络设定信息,接收并处理客户端的DHCP请求,为客户端分配IP地址等。
一次完整的通过DHCP协议获取网络配置信息的过程如下图:

如上图,DHCP过程分为四个主要阶段,简称为DORA(每个步骤名称的首字母连在一起):
(1)Discover(发现):
客户端设备在网内广播“发现”请求(初始时,不知道网络中服务器的位置),寻找可用的DHCP服务器。
(2)Offer(提供):
DHCP服务器(网内可能存在多台DHCP服务器)收到客户端请求后,做出响应,提供一个可用的IP地址和相关配置信息给客户端。
(3)Request(请求):
若存在多台服务器作出响应,客户端只选择其中一台DHCP服务器提供的地址(常常是最先响应的那一个),并发送DHCP请求,来确认使用该地址(Request也是广播,让所有服务器都知道客户端选择了哪台服务器的Offer)。
(4)ACK(确认):
DHCP服务器确认分配信息,并通知客户端,可以开始使用该IP地址。
以上4步即是DHCP的基本工作步骤,更详细的过程在下文DHCP数据包解码中配合数据包解码进行讲解。
因为IP通常不是永久分配(能够使用的时间被称为“租约”),因此除了基础4步,还会出现“续约”(只包含第三步和第四步)、IP地址释放(发送上图中的DHCP release包)、释放后重新获取(再次进行DORA过程)等。
DHCP协议解码
在清楚了DHCP的基本概念和简单原理后,我们从流量角度来深入看看DHCP是怎么工作的。
(1) DHCP数据包解码
如下图所示,左边是RFC文档中的图示,右侧是科来专家分析工具CSNAS对应的解码:

从CSNAS数据包的解码视图中,已经清晰明了的看到各个字段的中文含义。下面对各字段和取值再补充说明一下:
i.OP字段:报文的操作类型。是DHCP报文中最基础的字段,用于标识报文的类型,一共有2种。客户端发送给服务器的包为请求报文,其值为1;而服务器发送给客户端的包为响应报文,其值为2(类型只有2种取值,具体是DHCP的哪一种包,需要和OPTION字段一起判断)。
ii.HTYPE:DHCP客户端的MAC地址类型。MAC地址类型实际上是指明网络类型。例如,当HTYPE值为1时,表示是以太网MAC地址类型。
iii.HLEN:硬件地址长度。对于以太网MAC地址,其长度通常为6个字节,因此HLEN的值为6。
iv.HOPS:DHCP报文经过的中继数量(DHCP中继后文会作简单解释)。这个字段用于记录DHCP报文在传输过程中经过的路由器数量。每经过一个路由器,该字段的值就会增加1。如果DHCP报文在同一个网络内传输,没有经过任何路由器中继转发,该字段的值为0。
v.XID(Transaction ID):事务ID。用于标识一次地址请求过程,是客户端在发起一次请求时选择的随机数,在一次完整的DHCP请求过程中,所有报文的XID都是相同的。如下图:

vi.Second:DHCP客户端从获取到IP地址或者续约过程开始到现在所过去的时间,以秒为单位。在客户端还没有获得IP地址之前,该字段的值始终为0。
设计租约时间,主要是为了避免客户端长期占用不释放IP地址,造成服务器IP地址不够分配。如果客户租约到期,需要续租或重新获取地址。(一般租约时间到达50%和87.5%两个条件时,会进行续约)
vii.Flag:最左边的1bit为1时表示server将以广播方式传送封包给 client,其余尚未使用。
什么叫以广播的方式发包给client?那置0就是单播回复?这两种情况有什么区别?
上面DHCP原理第二步时,当服务器端收到Discover包后,要发Offer给客户端。这时候客户端其实并没有IP地址,有些操作系统在这种情况下能收单播包,有些操作系统则认为不能收,服务器就只能广播Offer进行响应(广播会打扰到网内其他主机)。为了能单播回复,在设计时,DHCP客户端根据自己的操作系统能力,在发DHCP Discover阶段把flag (unicast) 的标志位置0,告诉DHCP服务器,支持单播回复,于是DHCP服务器就会在DHCP Offer阶段以单播的形式进行回复(这里使用了unicast技术,不在本篇文章讲解范围内)。
viii.Ciaddr~File字段:
Ciaddr(Client IP Address):用户IP地址,没有地址时为0.0.0.0;
Yiaddr(Your IP Address):客户IP地址,服务器给客户端分配的地址;
Siaddr(Server IP Address):用于bootstrap过程中的服务器IP地址(下一服务器的IP地址);
Giaddr(Gate IP Address):中继代理(网关)IP地址;
Chaddr(Client Hardware Address):client的硬件地址;
Sname(Server Host name):可选server的名称,以0x00结尾;
File(boot File name):启动(引导)文件名;
可以参考上面DHCP字段和CSNAS解码对应的图。通过这些字段,能知晓客户端、中继代理、服务器的IP地址等信息。
ix.OPTIONs:虽然字面看是选项,实际却很重要,它包含了各种客户端和服务器之间传达的信息。
全部选项可参考:
https://www.iana.org/assignments/bootp-DHCP-parameters/bootp-DHCP-parameters.xhtml
下面列出常见选项:
OPTION | 说明 |
1 | 设置子网掩码 |
3 | 设置网关地址选项 |
6 | 设置DNS服务器地址选项 |
50 | 设置请求IP地址 |
51 | 设置IP地址租约时间选项 |
53 | 设置DHCP消息类型 |
54 | 设置服务器标识 |
55 | 设置请求参数列表 |
58 | 设置续约T1时间,一般是租期时间的50% |
59 | 设置续约T2时间,一般是租期时间的87.5% |
…… | …… |
255 | 结束 |
在数据包中解码如下图:

说明:我们在流量分析时,要看DHCP双方交互的具体信息(具体某一步中,客户端请求的内容和服务器响应的内容),应该看DHCP数据包中的OPTION的具体内容。
(2) DHCP数据包类型
选项OPTION53定义了DHCP数据包的类型,常见的有8种类型。说明如下:
主要类型(就是前面说的DORA的四种包,在OPTION53中的类型1-4):
DHCP Discover(发现)、DHCP Offer(提供)、DHCP Request(请求)、DHCP Ack(确认);
其他类型(OPTION53中的类型5-8):
DHCP Nak(拒绝)、DHCP Decline(IP冲突)、DHCP Release(释放)、DHCP Inform(网络配置);
下面具体对这些不同类型的数据包做说明:
①DHCP Discover(发现)包:发现网络中的DHCP服务器
初始阶段,Client端使用IP地址0.0.0.0发送了一个广播包,可以看到此时的目的IP为255.255.255.255。Client想通过这个数据包发现可以给它提供服务的DHCP服务器。解码如下图:

DHCP Discover的等待时间预设为1秒,也就是当客户机将第一个DHCP Discover封包送出去之后,在1秒之内没有得到回应的话,就会进行第二次DHCP Discover广播。若一直没有得到回应,客户机会将广播包重新发送四次(以2,4,8,16秒为间隔,加上1-1000毫秒之间随机长度的时间)。如果都没有得到DHCP Server的回应,客户机会从169.254.0.0/16这个自动保留的私有IP地址中选用一个IP地址。并且每隔5分钟重新广播一次,如果收到某个服务器的响应,则继续DORA过程。
②DHCP Offer(提供)包:提供给客户IP地址、租约信息等。
当DHCP服务器收到一条DHCP Discover数据包时,用DHCP Offer包给客户端响应。DHCP服务器提供了一个可用的IP,在数据包的Your (client) IP Address字段可以看到DHCP服务器提供的可用IP。在Offer包的OPTION选项字段,服务器还发送子网掩码,路由器,DNS,域名,IP地址租用期等信息。如下图:

③DHCP Request(请求)包:客户端确定DHCP信息。
网络内可能不止一台DHCP服务器,因此客户端如果收到多个DHCP的Offer,它会在其中选定一个,并进行通告。客户端正式发送Request数据包,请求分配IP。此时客户端的源IP和目的IP依然是0.0.0.0和255.255.255.255,如下图:

事实上,并不是所有DHCP客户机都会无条件接受DHCP服务器OFFER的所有信息!特别是如果这些主机上安装有其它TCP/IP相关的客户机软件,客户机也可以通过DHCP REQUEST向服务器提出自己的DHCP选择,这些选择会以不同的号码填写在DHCP OPTION里面,这样客户机可以保留自己的一些TCP/IP设定。
④服务器用DHCP ACK(确认)包:对DHCP请求进行响应。
确认分配收到ACK包后,客户端才正式开始使用服务器发给它的配置信息。数据包如下图:

客户机在接收到DHCP ACK后(和前面第2步类似,可能是广播,也可能是单播,要看第三步客户端发包中的FLAG字段),会向网络发送三个针对此IP地址的免费ARP包,进行IP地址冲突检测,查询网络上有没有其它机器已经在使用该IP地址。如果发现该IP地址已经被其他主机使用,客户机会发出一个DHCP DECLINE数据包给DHCP 服务器,拒绝此IP地址租约,并重新发送DHCP DISCOVER。
当执行完DORA过程后,租期开始倒计时:
在租期还有1/2时,向DHCP服务器发送第一次DHCP Request报文(即续租时间T1为50%剩余租期时间):
i.如果收到服务器的DHCP Ack后,客户端的IP地址租期重新回满;
ii.如果未收到Ack,可以继续使用该IP;
在租期还有1/4时,向DHCP服务器发送第二次DHCP Request报文(这一步通常被省略掉,直接跳到租期还有1/8时);
在租期还有1/8时,向DHCP服务器发送第三次DHCP Request报文(所以请求续租时间T2为87.5%剩余租期时间):
i.如果收到Ack,租期回满;
ii.如果未收到Ack,租期结束后IP被回收;
下面再简要说明其他四种类型DHCP包的作用:
⑤DHCP Nak(拒绝)包:服务器对客户端的DHCP REQUEST拒绝响应。
由于某些原因无法正常分配IP地址(例如:服务器对客户端请求分配的IP地址已超过使用租借期限(服务器没有找到相应的租约记录);又如,DHCP地址池耗尽,无法再进行IP分配),服务器发送DHCP NAK数据包作为应答,通知DHCP客户端无法分配合适IP地址。DHCP客户端需要重新发送DHCP Discover来申请新的 IP 地址。
⑥DHCP Decline(IP冲突)包:
当客户端发现服务器分配给它的IP地址发生冲突时,会通过发送此数据包来通知服务器,并且会重新向服务器另行申请地址。
⑦DHCP Release(释放)包:
客户端可通过发送此数据包,主动释放服务器分配给它的IP地址,当服务器收到此报文后,可将这个IP地址分配给其它的客户端。
例如:在windows命令提示符中执行ipconfig/release。即发出DHCP释放包。
⑧DHCP Inform(网络配置)包:
客户端已经获得了IP地址,发送此报文的目的是为了从服务器获得其他的一些网络配置信息,比如网关地址、DNS服务器地址等。
小结:在进行DHCP流量分析时,可以通过分析捕获到的上面8种类型数据包,找出DHCP初始分配、续租和DHCP分配不成功的原因(如:没能正确执行DORA过程、出现DHCP Nak或DHCP Decline等)。
DHCP Relay(DHCP中继)
DHCP Relay(DHCP中继),也叫作DHCP Agent。主要用于DHCP客户端和DHCP服务器不在一个网段时,DHCP客户端又有自动地址分配的需求。
DHCP中继工作示意如下图:

分析数据包时,根据抓包位置不同,略有不同(在客户端和中继服务器间抓包,不一定会有OPTION82信息(和客户端有关系);在中继服务器和DHCP服务器间抓包,一定会看到OPTION82信息)。DHCP代理服务器工作描述如下:
DHCP中继服务器首先根据接收到的报文的op字段判断是请求报文还是响应报文,然后:
(1)收到请求报文(可能来自DHCP客户端也可能是DHCP中继),数据包中如果带有OPTION82字段,则丢弃(来自客户端,单层中继)或者用自己的OPTION82替换(来自DHCP中继,多层中继)。如果没有携带OPTION82,则DHCP Relay需要添加这个选项,并修改giaddr字段为自己的ip地址,hops字段加1。如果DHCP Relay知道DHCP服务器的地址那么就单播出去,否则就广播出去(具体行为和中继配置有关)。DHCP服务器收到请求报文后,解析OPTION82字段得到DHCP中继的信息,同时发送响应报文,响应报文带有给DHCP客户端的配置信息以及OPTION82字段。
(2)如果收到的是响应报文(可能来自DHCP中继也可能是DHCP服务器),那么DHCP中继会剥离OPTION82字段,然后一层层下发到HDCP Client
所以可简单理解为:我们看到有中继的DHCP过程的数据包其实和没有中继是一样的,只是数据包里面存在字段OPTION82(还有SUB-OPT进一步丰满信息),来解决跨网络实现DHCP的问题。关于OPTION82的具体描述,可参考RFC3046。
与DHCP相关的安全问题及解决办法
(1) 常遇见的DHCP安全问题:
i.DHCP服务器伪装
由于DHCP服务器和客户端之间没有认证机制,所以如果在网络上随意添加一台DHCP服务器,它就可以为客户端分配IP地址以及其他网络参数。只要让该DHCP服务器分配错误的IP地址和其他网络参数,那就会对网络造成非常大的危害。
ii.DHCP Starvation拒绝服务攻击
通常DHCP服务器通过检查客户端发送的DHCP请求报文中的Chaddr(也就是Client MAC address)字段来判断客户端的MAC地址。正常情况下该Chaddr字段和发送请求报文的客户端真实的MAC地址是相同的。(这里说明一下,交换机具有一个叫端口安全的特性(Port Security),可以限制每个端口只使用唯一的MAC地址,它检测的是数据包二层的MAC地址。但修改DHCP报文中的Chaddr字段来实施攻击,端口安全就不起作用了。)由于DHCP服务器认为不同的Chaddr值表示请求来自不同的客户端,所以攻击者可以通过大量发送伪造Chaddr的DHCP请求,导致DHCP服务器上的地址池被耗尽,从而无法为其他正常用户提供网络地址,这是一种DOS攻击。
上面两种攻击还可以结合起来,甚至DHCP请求报文的源MAC地址和Chaddr字段都是正确的,但由于DHCP请求报文是广播报文,如果大量发送的话也会耗尽网络带宽,形成另一种拒绝服务攻击。
(2) DHCP安全机制DHCP Snooping
DHCP Snooping(DHCP监听)是一种DHCP安全特性。是交换机为了防止DHCP攻击,设置的一种端口信任机制。简单介绍如下:
DHCP将交换机端口划分为两类:非信任端口(通常为连接终端的端口)和信任端口(连接合法DHCP服务器的端口或者连接汇聚交换机的上行端口)。
信任端口可以接收所有的DHCP报文。通过只将交换机连接到合法DHCP服务器的端口设置为信任端口,其他端口设置为非信任端口,就可以防止上文中的DHCP服务器伪装攻击。
通过开启DHCP Snooping特性,交换机限制用户端口(非信任端口)只能够发送DHCP请求,丢弃来自非信任端口的所有其它DHCP报文,例如DHCP Offer报文等。而且,并非所有来自非信任端口的DHCP请求都被允许通过,交换机还会比较DHCP 请求报文的(报文头里的)源MAC地址和(报文内容里的)DHCP客户机的硬件地址(即Chaddr字段),只有这两者相同的请求报文才会被转发,否则将被丢弃,这样就防止了DHCP耗竭攻击。
DHCP Snooping还有一个非常重要的作用就是建立一张DHCP监听绑定表(DHCP Snooping Binding)。一旦一个连接在非信任端口的客户端获得一个合法的DHCP Offer,交换机就会自动在DHCP监听绑定表里添加一个绑定条目,内容包括了该非信任端口的客户端IP地址、MAC地址、端口号、VLAN编号、租期等信息。这张DHCP监听绑定表为进一步部署IP源防护(IPSG)和动态ARP检测(DAI)提供了依据。
DHCP流量分析举例
例:客户网络中使用DHCP自动获取IP地址,某天开机后发现无法上网,ping服务器不通,通过ipconfig命令查看,发现自己的ip地址为169.254.0.1。现需分析为何主机获取不到IP地址?
分析:复现主机获取IP地址过程,查看DHCP的DORA过程是否正常?是否有DHCP Decline或DHCP Nak?
抓包如下:

发现根本没有正常的DORA过程,全是某一主机的Discover请求。通过查看数据包的源MAC地址,发现是伪造的MAC地址。
是攻击者发送海量伪造源MAC地址的DHCP Discover数据包,对网内DHCP服务器进行DOS攻击,导致DHCP服务器无法执行正常DHCP功能。
解决方法:找出转发海量DHCP Discover数据包的交换机端口并断开连接。后续交换机通过开启端口安全的特性(Port Security)和DHCP Snooping功能,避免类似事件再次发生。
总结
我们从数据包的角度深入介绍了DHCP协议,相信大家对怎么通过流量分析DHCP相关的应用和业务有了新的思路。在今后的工作中,通过不断地分析实践,大家会更深刻地理解DHCP。后面我们还会陆续介绍更多常见应用层协议,请大家持续关注!