环境:
os:centos7
dnsmasq:version 2.76
一. dhcp工作原理
首先补充几个dhcp相关的基本概念:
1、动态主机配置协议DHCP(Dynamic Host Configuration Protocol)
是一种网络管理协议,用于集中对用户IP地址进行动态管理和配置。
2、DHCP协议采用UDP作为传输协议,DHCP客户端发送请求消息到DHCP服务器的67号端口
,DHCP服务器回应应答消息给DHCP客户端的68号端口
3、在没有部署DHCP中继的场景下,首次接入网络的DHCP客户端与DHCP服务器的报文交互称为DHCP报文四步交互,如下图:
4、当DHCP客户端非首次接入网络时,可以重用曾经使用过的地址。客户端广播发送包含前一次分配的IP地址的DHCP REQUEST报文,报文中的Option50(请求的IP地址选项)字段填入曾经使用过的IP地址。DHCP服务器收到DHCP REQUEST报文后,根据DHCP REQUEST报文中携带的MAC地址来查找有没有相应的租约记录,如果有则返回DHCP ACK报文,通知DHCP客户端可以继续使用这个IP地址。否则,保持沉默,等待客户端重新发送DHCP DISCOVER报文请求新的IP地址
二. 实践
2.1 准备
参考文章《【云计算 | Openstack】KVM虚机通过dhcp自动获取地址》,使用dnsmasq
作为dhcp服务端,使用virsh虚机作为dhcp客户端。
网络架构如下图所示,dnsmasq监听网桥br0的67号端口
2.2 开始dhcp并抓包
当客户端开始dhcp时,对虚机口进行抓包结果如下:
2.3 报文分析
上文提到dhcp的4步交互前提是:dhcp客户端首次接入网络。本次实践dhcp客户端非首次接入,同时修改了dhcp地址池的cidr信息。因此整个dhcp流程大致为:
客户端发送dhcp request——无响应——客户端重新发送dhcp discover——服务端响应dhcp offer——客户端发送dhcp request——服务端响应dhcp ack
1、先看下报文1-2DHCP Request
客户端发送两次dhcp request报文想继续使用之前申请的地址
2、报文3DHCP Discover
,该步是发现阶段
客户端发送的dhcp request收不到响应,因此DHCP客户端以广播方式发送DHCP DISCOVER报文(目的IP地址为255.255.255.255
)给同一网段内的所有设备(包括DHCP服务器或中继)。DHCP DISCOVER报文中携带了客户端的MAC地址
、需要请求的参数列表选项(Option55)、广播标志位(flags字段)等信息。
(Option 55 包含的内容)
3、报文4-7
dhcp服务端收到了discover报文后,连续发送3个arp和一个icmp报文,用来判断地址11.11.1.70是否被其他客户端占用
4、报文8DHCP Offer
,该步是提供阶段
服务端选择一个可用的IP地址,然后通过DHCP OFFER报文发送给DHCP客户端,Option 1包含了该ip地址的掩码位
5、报文9DHCP Request
,该步是选择阶段
如果有多个DHCP服务器向DHCP客户端回应DHCP OFFER报文,则DHCP客户端一般只接收第一个收到的DHCP OFFER报文,然后以广播方式发送DHCP REQUEST报文
,该报文中包含客户端想选择的DHCP服务器标识符(即Option54)和客户端IP地址(即Option50)。
DHCP客户端广播发送DHCP REQUEST报文通知所有的DHCP服务器,它将选择某个DHCP服务器提供的IP地址,其他DHCP服务器可以重新将曾经分配给客户端的IP地址分配给其他客户端。
6、报文10DHCP ACK
,该步是确认阶段
当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文后,DHCP服务器回应DHCP ACK报文,表示DHCP REQUEST报文中请求的IP地址(Option50填充的)分配给客户端使用。
7、报文11-12
DHCP客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址
8、报文13-14
DHCP客户端收到DHCP ACK报文,会广播发送ARP报文,获取网关的MAC信息(网关的ip地址在dhcp offer 和dhcp ack报文的Option 3 中均有体现)