DHCP概念
DHCP(Dynamic Host Configuration Protocol)动态主机分配协议,针对TCP/IP网络中主机系统启动后网络无法自动进行配置定制的网络管理协议,用于集中对用户IP地址进行动态分配和管理。
前身为BOOTP协议。
BOOTP协议是一种引导程序协议,主要用于无盘工作站环境中,通过引导程序使无盘工作站从服务器上获取地址,和DHCP区别在于DHCP消息中包含客户机的网络配置数据。
DHCP协议位于应用层,采用UDP协议作为传输协议,采用C/S架构。常用端口号67(服务器端)和68(客户端)。
为什么需要DHCP及使用DHCP优势
DHCP采用动态分配和租约概念,对于分配出去的IP地址限制使用租期,简化大型园区网中网络管理员手工分配和配置地址工作,降低了发生分配和配置错误的可能性;也方便使用者灵活使用网络,尤其是在无线应用环境;避免地址被占用等问题。
使用DHCP优势
- 解决地址资源紧张问题:在地址资源紧张的网络环境中,手动分配地址因为无法释放原因会因为网络规模扩大导致地址资源不够使用。解决地址冲突,静态环境使用人员随意修改IP地址导致IP地址冲突。解决配置错误,手动输入过程中很容易马虎导致配置错误。使用灵活:使用网络位置变更,例如原来财务部在192.168.1.0地址段交换机下,但是变更办公室后在192.168.2.0地址段交换机下,就需要再次手动进行配置变更地址信息,同时也要同步更改原始记录信息。安全及隐私防护,例如之前文章提到的针对ARP欺骗的问题,在动态环境下解决方案有很多,但是对与静态环境下采用方式比较被动和费人。
另外,地址分配表不小心泄露会导致不法分子获取领导地址信息。
DHCP工作原理
DHCP采用C/S(客户端/服务器)工作模式,使用UDP协议。在客户端使用68端口号向服务器请求地址分配,服务器使用67端口号回应客户端的DHCP请求。

根据客户端是否和DHCP服务器在同一广播域,DHCP通信机制可分为无中继环境下DHCP分配和有中继环境下DHCP地址分配。
无中继环境DHCP报文交互过程

DHCP常见四个报文
DHCP报文交互的常见四个报文:Discover(Client发出)、Offer(服务器发出)、Requuest(Client发出)、ACK(服务器发出)。

- Didscover报文(广播报文)-发现阶段
Discover报文由客户端发起,主要目的向网络中服务器请求地址分配。
第一次接入网络的客户端不知道服务器的IP地址,所以客户端采用广播方式发送DHCP DISCOVER报文,寻找可用的DHCP服务器。DHCP DISCOVER报文中携带了客户端的MAC地址等信息。

- Offer报文(广播报文)-预提供阶段
Offer报文为服务器的给客户端响应报文,主要目的就是从自己地址池中找出一个可用的地址,询客户端意见,是否觉得该地址符合客户端气质。
如上图,网络环境中存在两个DHCP服务器,客户端因为发起的广播报文,所以收到Discover报文的两个服务器都会向客户端发送响应Offer信息。
但实际工作中客户端采用的先到先答的方式,即先收到哪个Offer报文就先向哪个服务器发出请求租定请求。

DHCP Offer报文中“Your(Client) IP Address”字段就是DHCP 服务器将要提供给DHCP 客户端使用的IP地址,且DHCP 服务器会将自己的IP地址放在“option”字段中以便DHCP 客户端区分不同的DHCP 服务器。DHCP 服务器在发出此报文后标记一个已分配IP地址的纪录,并绑定申请者的MAC信息。
思考:为什么服务器回应的Offer报文仍然是广播报文,是否会有单播Offer报文?
- Request报文(广播报文)-选择阶段
Request报文是由客户端发起,仍然是广播报文,主要目的就是告知服务器,我同意接收你分配的地址,并其他服务器分停止地址分配服务(多服务器环境)。
这里Request报文仍然以广播方式回答原因,一是为了通知其他服务器自己所选的服务器,而是让其他服务器收回分配地址。

Request报文不仅仅在地址获取阶段会有,在租期达到50%时候,客户端会以单播形式向服务器发送Request报文请求续租正在使用地址(租期在Offer报文和ACK报文的Option字段会有包含),如果客户端收到DHCP 服务器发送的ACK报文,则客户端更新自己的“Seconds elapsed”时间为服务器的租约时间,重新计时,并继续使用现有地址。
如果租期超过87%时,客户端仍然使用的是广播形式向服务器发送Request报文,使用广播报文的目的防止原服务器没有ACK,导致租期到了后无地址可用,同时也是告知其他服务器,可以准备给我分配地址了。
如果客户端在DHCP租约到期前收到服务器的ACK确认报文,则会按照租约时间重新计时,并继续使用原有地址。
如果没有收到ACK确认信息,当租期结束,客户端向服务器发送Release报文请求服务器释放这个IP地址,并开始重新申请过程。
这里面需要注意的是,租期在服务器端也会倒计时,如果在租约快到期后,服务器向客户端ping没有得到响应后,会把该地址标记为“Expired”超期。等待下次客户端请求后重新分配,或者重新分配给其他终端。
- ACK报文(可以广播可以单播)-确认阶段
ACK报文是由服务器发给客户端,目的是确认Reuqest报文中请求的IP可以分配客户端使用。(本例中使用的广播)

DHCP服务器会检测收到Request报文中“Client MAC address”与发送的Offer报文时绑定的MAC地址信息是否一致,如果一致则向客户端发送包含他提供的IP地址、租约、DNS、网关等配置的ACK报文。
如果DHCP服务器此时收到的Requeset报文MAC地址和之前绑定不一致,服务器会回复一个NAK报文,通知终端重新申请。
客户端收到ACK报文后不会使用,而是会先发送一个免费的ARP报文,校验服务器给的IP地址是否可用。如果发现有IP地址冲突,会发送decline报文,请求服务器重新挑选一个地址分配。
如果没有冲突,将会把服务器分配的地址记录到网卡上,通过该地址进行通信。
有中继环境下的DHCP报文交互过程
为什么需要DHCP中继
在一个小型的园区网络中,用户不需要多个地址段进行业务或者管理上区分,这时候采用一个DHCP服务器可以满足业务应用需求。但是在大型网络中或者业务有区分和管理比较严格场景下,一个网段一个DHCP服务器即增加成本浪费资源,又不利于管理。
当客户端和服务器不在一个网段,客户端DHCP广播包无法跨越不同网段时候,就需要不同网段下中介结构,代理不同网段客户端和唯一服务器帮忙传话,在多网段环境下只需要一台服务器就可以满足DHCP下发分配和管理任务。
中继环境下DHCP报文交互过程

在有中继场景环境中,客户端和DHCP服务器工作原理和无中继场景下客户端和DHCP服务器工作原理相同。
主要区别DHCP中继在DHCP服务器和DHCP客户端之间转发DHCP报文,以保证DHCP服务器和DHCP客户端可以正常交互。
中继代理场景下与无中继场景DHCP报文区别
中继场景下与无中继场景,DHCP报文有以下变化:
- DHCP报文头部修改:DHCP服务器和客户端在同一网段环境中,DHCP报文头部DST为广播地址,IP协议地址为全零IP地址。
但是当DHCP Discover报文到达中继设备后,DHCP Disconver报文源目IP地址和MAC地址改变为收到Discover报文接口的地址,目的地址为DHCP服务器的地址。即原来的Discover广播报文经过中继设备后变为单播报文。

- DHCP报文中hops字段,客户端和服务器在同一网段情况下,数值为0,但是在存在中继场景下,数值是根据中继的跳数决定。最小为1,最大为15,大于16(DHCP防环机制)的数值DHCP报文将被丢弃。
- DHCP报文中“Relay agent Ip address”字段(即giaddr)由0修改为接收DHCP Discover报文接口IP地址。如果收到的报文该字段包含了非0的数据,不做修改。
- 服务器端收到Discover报文后,地址分配选用哪个段的地址池参看giaddr字段。
- 中继在收到服务器的Offer报文也会检查giaddr字段,如果是自己接口的地址,就转发,如果不是接口地址,就丢弃该报文。
DHCP中其他报文
上文我们介绍了常见四种常见的DHCP报文,在文中也穿插了一些其他报文内容,DHCP总共有几种报文,这些报文的作用是什么呢?
我们可以通过这个表格看下:
报文名称 | 说明 |
DHCP DISCOVER | 客户端进行DHCP交互过程发送的第一个报文,用来寻找DHCP服务器。 |
DHCP OFFER | 服务器用来响应客户端的Discover报文,此报文携带了fags和yiaddr以及Opiton相关信息。 |
DHCP REQUEST | 该报文有三种用途。
|
DHCP ACK | 服务器对客户端的DHCP REQUEST报文的确认响应报文,客户端收到此报文后,才真正获得了IP地址和相关的配置信息。 |
DHCP NAK | 服务器对客户端的DHCP REQUEST报文的拒绝响应报文,例如DHCP服务器收到DHCP REQUEST报文后,没有找到相应的租约记录,则发送DHCP NAK报文作为应答,告知DHCP客户端无法分配合适IP地址。 |
DHCP DECLINE | 当客户端发现服务器分配给它的IP地址发生冲突时会通过发送此报文来通知服务器,并且会重新向服务器申请地址。 |
DHCP RELEASE | 客户端可通过发送此报文主动释放服务器分配给它的IP地址,当服务器收到此报文后,可将这个IP地址分配给其它的客户端。 |
DHCP INFORM | DHCP客户端获取IP地址后,如果需要向DHCP服务器获取更为详细的配置信息(网关地址、DNS服务器地址),则向DHCP服务器发送DHCP INFORM请求报文。 |
DHCP报文中Flags字段的含义
为什么在同一个DHCP环境下,有的客户端收到的Offer和ACK是单播,有的客户端收到的Offer和ACK广播呢?
这是因为,有些IP协议栈在IP地址配置前可以接收dst IP为任意的IP报文,包括广播,单播和组播,而有的IP协议栈规定在IP地址配置前仅且只能接收广播报文。
但是DHCP协议为了增强协议的健壮性,给王八的屁股做了如下规定:“如果协议栈在初始化过程中,不接收单播IP报文,请在DHCP Discovery / Request报文的Flags里明确告知服务器,通过设置“BROADCAST flag = 1”,服务器就使用广播来和客户端通信。如果协议栈在初始化过程中,可以接收单播IP报文,请在DHCP Discovery / Request报文的Flags里明确告知服务器,通过设置“BROADCAST flag = 0”,服务器就使用单播来和客户端通信。”
也就是说,Offer报文和ACK报文是单播通信和广播通信,是卡终端网卡的需求,是把DHCP Discover和Request报文中Flags字段置为“0”还是“1”。
DHCP报文中Option字段
DHCP Option字段除了指明分配地址的一些信息外,例如Opiton54表明DHCP服务器的身份信息(IP地址),Option51指明DHCP分配的地址池的租期预定义选项等。
DHCP Option字段还支持用户自定义配置,实现不同终端的对接。例如华为和锐捷AC和AP隧道建立,采用Opiton43(华为)和Option138(锐捷)参数,指定AP获取到的 Option43和Option138字段携带地址,通过单播方式和AC建立CAPWAP隧道关系。
DHCP报文分配优先级
服务器已配置静态绑定地址>Discover报文Option 50字段指定地址>曾经分配超租期IP地址>地址池中顺序未分配Idle地址>租约过期或曾发生冲突地址。
DHCP分配地址除了查找自己数据库表中未被分配地址外,还会对要分配的地址进行ping进行探测(源地址为服务器地址,目的地址为预分配地址),只有在规定时间多次没有应答后,才会分配出来,如果探测到要分配的地址存在冲突可能性,会记录该地址冲突,重新选择地址池中未分配地址分配。
DHCP地址分配机制
DHCP提供两种地址分配机制。
动态分配:通过DHCP服务器为指定主机分配有使用期限的IP地址。
动态分配可以限制用户使用地址段哪些地址,即排除地址池外的地址都可以下发给客户端。
动态分配可以限定用户在规定时间内获取地址。
静态分配:所谓的静态分配不是指手动在客户端配置IP地址,而是通过在服务器上绑定IP地址和MAC地址,使使用该MAC的用户固定分配对应地址。
DHCP环境下缺陷及安全问题
DHCP协议方便了网络管理及运维人员,但同时因为DHCP协议没有安全校验机制,同样也会存在针对DHCP漏洞的攻击行为,例如DHCP欺骗和DHCP泛洪攻击。
而且多DHCP服务器网络环境中,两台DHCP服务器缺乏同步机制,不能及时同步服务器租出去IP地址,会导致两台不同终端同时获取相同地址情况。
DHCP安全漏洞解决方法
上次我们去搞防诈骗宣传还是在ARP协议。
这次我们也是要针对偷袭招式进行研究,进行反诈骗工作。
既然DHCP攻击原因是服务器端和客户端之间无认证机制,攻击者也会伪装一个业务需求者(也有可能是服务者),不讲武德对服务器(客户端)进行欺骗、偷袭。
所以如何对于DHCP报文的可靠性真实性安全性验证,是运维管理者需要思考的问题。
这就不得不再次提到之前 “ARP安全防范”文章中DHCP Snoooping(DHCP窥探)。
DHCP Snooping
DHCP Snooping通过监听(窥探)DHCP报文,拦截网络中不合法的流量,可以针对DHCP的攻击和伪造进行防护。
DHCP工作原理
通过上面文章我们可以知道DHCP工作机制。
- Client通过DHCP Discover报文向网络中DHCP服务器请求服务。
- DHCP Server 根据自身的配置向客户端发送Offer报文应答Client的请求。
- Client收到Offer报文通过Request报文进行确认。
- 最终Server通过一个ACK确认报文把Client认可的地址分配给网卡。
DHCP Snooping工作原理
开启DHCP Snooping交换机默认所有端口为非信任端口(untrust),对接收到的DHCP服务器响应的ACK、NAK和Offer报文进行拦截。
只有在信任端口(trust)接口才能正常接收和转发ACK、NAK和Offer报文。
DHCP Snooping是根据ACK报文生成DHCP Snooping绑定表。
DHCP Snooping绑定内容:IP地址、MAC地址、交换机接口编号、所属VLAN等信息。
DHCP Snooping表项删除:根据DHCP服务器和客户端协商的租期进行老化或者客户端主动释放IP地址时,收到DHCP Releas报文后,DHCP Snooping表项自动删除。
DHCP Snooping配置在二层接入交换机或者开启DHCP Relay设备上。
DHCP Snooping开启后产生故障:大多数情况下,在二层接入交换机上或者DHCP Relay设备上开启DHCP Snooping忘记在上联口或者中继接口开启trust,导致用户无法正常获取地址。