1、DHCP简介
动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或网络服务供应商自动分配IP地址;给用户用于内部网管理员作为对所有计算机作中央管理的手段。
DHCP是一个典型的Client/Server模型的协议,使用UDP传输
DHCP Server端,使用UDP端口:67
DHCP Server可以在很多设备上部署,如Cisco、H3C、Juniper、Windows、Linux……都可以
DHCP Client端,使用UDP端口:68
客户端(主机、路由器、交换机、网络打印机、网络摄像头……都可以作为DHCP客户端)
DHCP有三种机制分配IP地址:
自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。
2、DHCP状态机
如下图所示是比较常见的DHCP状态机
DHCP的实现分为4步,分别是:
第一步:Client端在局域网内发起一个DHCP Discover包,目的是想发现能够给它提供IP的DHCP Server。
第二步:可用的DHCP Server接收到Discover包之后,通过发送DHCP Offer包给予Client端应答,意在告诉Client端它可以提供IP地址。
第三步:Client端接收到Offer包之后,发送DHCP Request包请求分配IP。
第四步:DHCP Server发送ACK数据包,确认信息。
第五步:重新请求获取
第六步:重新发送ack包,确认信息
3、wireshake抓包分析
正常来说,一次DHCP过程只需要上面状态机的前四步,后面的续约是在DHCP的租期到达1/2和7/8的时候进行的。
打开任意一个数据包,我们可以看到wireshark已经把里面的数据分层显示。
从上到下依次为物理层、数据链路层、网络层、传输层和应用层。
tcpdump抓包命令:
tcpdump -i eth0 -c 8 -s 0 -w /mnt/sdcard/dhcp.pcap ‘udp and port 67 and port 68’ &
-i 选择网卡
-c 数据包个数
-s 数据包长度,默认只抓包头,0代表完整数据包
-w 写入文件
udp and port 67 and port 68:dhcp报文的过滤条件,udp协议,端口67和68
&使进程后台运行
3.1 发现阶段——DHCP Discover(广播)
3.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。
3.1.2 DHCP Discover 物理层
物理层给出的有用信息并不多,但是我们能够看到网卡相关信息和这个是DHCP的数据包且使用了UDP协议。
3.1.3 DHCP Discover 数据链路层
数据链路层中我们可以看到本机的MAC地址和目标MAC地址(广播)。
3.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协议客户端进行广播
3.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)等信息
3.2 提供阶段——DHCP Offer(单播/广播)
3.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报文。
3.2.2 DHCP Offer 数据链路层
这时可以看到根据之前的DHCP报文,这里使用了单播的形式。而源MAC地址就是DHCP服务器的MAC地址且目的MAC地址是之前发送DHCP Discover报文的客户端MAC地址。
3.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报文的转发。
3.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地址
3.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
3.3.2 DHCP Request 数据链路层
这时候又变回了广播。
3.3.3 DHCP Request 网络层
由于是广播,所以目标IP地址是255.255.255.255,而源IP地址还是0.0.0.0是因为还没有完成整个DHCP过程,本机尚未获取到IP地址。
3.3.4 DHCP Request 应用层
Bootp flags:0表示单播,1表示广播,这里为0,即DHCP服务端回复的报文应为单播形式
Ciaddr、Yiaddr、Siaddr、Giaddr 字段的地址均为0.0.0.0
3.4 确认阶段——DHCP Ack(单播/广播)
3.4.1 DHCP Ack 理论分析
确认阶段,即DHCP服务器确认分配级DHCP客户端IP地址的阶段。
某个DHCP服务器在收到DHCP客户端发来的DHCP REOUEST报文后,只有DHCP客户端选择的服务器会进行如下操作:如果确认将地址分配给该客户端,则以单播/广播方式返回DHCP ACK报文;否则返回DHCP NAK报文,表明地址不能分配给该客户端。
3.4.2 DHCP Ack 数据链路层
可以看到这里是单播,源MAC地址是DHCP服务器(此处为中继代理)的MAC地址,目标MAC地址是DHCP客户端的MAC地址。
3.4.3 DHCP Ack 网络层
10.22.25.118就是即将要分配的IP地址,而10.22.25.254就是DHCP服务器的地址(此处为DHCP中继代理服务器)
3.4.4 DHCP Ack 应用层
在DHCPACK报文中Yiaddr字段包含要分配给客户端的IP地址,而Chaddr和DHCP:Client Identifier字段是发出请求的客户端中网卡的MAC地址。
同时,在选项部分也会把在DHCPOFFER报文中所分配的IP地址的子网掩码、默认网关、DNS服务器、租约期、续约时间等信息加上。
4、DHCP的IP地址租约更新
3.1 DHCP服务IP地址租约更新原理
如果采用动态IP地址分配策略,则DHCP服务器分配给客户端的IP地址都是有一定租约期限的,当租约期满后DHCP服务器又会收回原来分配的这个IP地址。
如果DHCP客户端希望继续使用该地址,则需要向DHCP服务器提出更新IP地址租约的申请,也就是前面所说到的“续约”。
IP地址租约更新或者IP地址续约也就是更新服务器端对IP地址的租约信息,使其恢复为初始状态。
3.2 申请续约的方法
在DHCP客户端的IP地址租约期限达到1/2时,由DHCP客户端向为它分配IP地址的DHCP服务器以单播方式发送DHCP REOUEST请求报文,以期进行IP租约的更新。
如果DHCP服务器同意续约,则DHCP服务器向客户端以单播方式返回DHCP ACK报文,通知DHCP客户端已经获得新IP租约,可以继续使用此IP地址;相反,如果DHCP服务器不同意续约,则DHCP服务器以单播方式返回DHCP NAK报文,通知DHCP客户端不能获得新的租约,此IP地址不可以再分配给该客户端。
如果上面的续约申请失败,则DHCP客户端还会在租约期限达到7/8时再次以广播方式发送DHCP REQUEST请求报文进行续约。DHCP服务器的处理方式同上,不再赘述。
如果第二次续约请求还是失败,则原来租约的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分配。
ref:
https://tinychen.com/20190609-wireshark-dhcp/
https://developer.aliyun.com/article/278172
https://blog.csdn.net/qq_24421591/article/details/50936469