概述
IETF于1993年发布了DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)。DHCP实现了网络参数配置的自动化,降低客户端的配置和维护成本。
DHCP采用C/S(Client/Server,客户端/服务器)通信模式,协议报文基于UDP的方式进行交互,采用67(DHCP服务器)和68(DHCP客户端)两个端口号。
相关命令
开启DHCP功能
[R1]dhcp enable
创建全局DHCP地址池
[R1]ip pool dhcp1
配置全局DHCP地址池范围
[R1-ip-pool-dhcp1]network 192.168.1.0 mask 24
配置全局DHCP网关
[R1-ip-pool-dhcp1]gateway-list 192.168.1.254
配置全局DHCP地址池中不参与分配的地址范围
[R1-ip-pool-dhcp1]excluded-ip-address 192.168.1.1 192.168.1.99
[R1-ip-pool-dhcp1]excluded-ip-address 192.168.1.201 192.168.1.253
配置全局DHCP可分配地址范围中为指定客户端分配固定IP地址
[R1-ip-pool-dhcp1]static-bind ip-address 192.168.1.101 mac-address 5489-987d-4e8f
在接口下应用全局DHCP配置
[R1-GigabitEthernet0/0/0]dhcp select global
在接口下启用接口的DHCP配置
[R1-GigabitEthernet0/0/1]dhcp select interface
配置接口DHCP地址池范围和网关
[R1-GigabitEthernet0/0/1]ip address 192.168.1.254 24
配置接口DHCP地址池中不参与分配的地址范围
[R1-GigabitEthernet0/0/1]dhcp server excluded-ip-address 192.168.1.1 192.168.1.99
配置接口DHCP可分配地址范围中为指定客户端分配固定IP地址
[R1-GigabitEthernet0/0/1]dhcp server static-bind ip-address 192.168.1.101 mac-address 5489-987d-4e8f
DHCP客户端首次接入网络的工作原理
1 发现阶段,即DHCP客户端发现DHCP服务器的阶段。
DHCP客户端发送DHCP DISCOVER报文来发现DHCP服务器。DHCP DISCOVER报文中携带了客户端的MAC地址、需要请求的参数列表选项、广播标志位等信息。
2 提供阶段,即DHCP服务器提供网络配置信息的阶段。
服务器接收到DHCP DISCOVER报文后,选择跟接收DHCP DISCOVER报文接口的IP地址处于同一网段的地址池,并且从中选择一个可用的IP地址(给客户端分配IP地址前会发送Ping探测,如果能Ping通则标识该地址不可用,并选择其他IP地址分配给客户端),然后通过DHCP OFFER报文发送给DHCP客户端。
3 选择阶段,即DHCP客户端选择IP地址的阶段。
如果有多个DHCP服务器向DHCP客户端回应DHCP OFFER报文,则DHCP客户端一般只接收第一个收到的DHCP OFFER报文,然后以广播方式发送DHCP REQUEST报文,该报文中包含客户端想选择的DHCP服务器标识符和客户端IP地址。
4 确认阶段,即DHCP服务器确认所分配IP地址的阶段。
DHCP客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址(如果收到响应,则发送DHCP DECLINE报文通知DHCP服务器该IP地址冲突,DHCP服务器标识该地址不可用,客户端发送DHCP DISCOVER报文重新申请IP地址)。
用找工作比喻DHCP工作原理
笔者发现可以用找工作来比喻DHCP的工作原理。
1 发现阶段
求职者海投简历给所有用人单位,简历中包含了个人信息和期望就职的职能范围。
2 提供阶段
用人单位确认相应职能的岗位有空缺,需要招人,于是发送offer给求职者,offer中包含了可提供的岗位信息。
3 选择阶段
求职者选择了第一个收到的offer中的期望岗位,选择其中的期望岗位并发送信息给用人单位。
4 确认阶段
用人单位给求职者发送确认需求的信息,求职者到用人单位后确认该岗位是否真的空缺,如果有人、就重新开始投简历。
预知两个术语概念
DHCP Relay
DHCP Relay指DHCP中继。当DHCP服务器和客户端在不同的三层网络中时,报文无法通过广播到达,此时就需要有设备作为DHCP中继,确保DHCP服务器和客户端之间的正常通信。
DHCP Snooping
DHCP Snooping是在DHCP协议的安全机制。用于在DHCP服务器和客户端之间建立一道防火墙,以抵御网络中针对DHCP的各种攻击。例如当网络中出现另一个DHCP服务器,会造成客户端频繁切换网关地址等现象,导致客户端的网络瘫痪,如果启用了DHCP Snooping,就可以避免发生这种情况。
DHCP报文格式
Op(op code):表示报文的类型,取值为1(客户端请求报)或者2(服务器响应报文)
Htype (hardware type): 表示硬件地址的类型。
Hlen(hardware length): 表示硬件地址的长度。
Hops(hops): 表示当前DHCP报文经过的DHCP Relay数目。该字段由客户端设置为0,每经过一个DHCP Relay时,该字段加1。此字段的作用是限制DHCP报文所经过的DHCP Relay数目。服务器和客户端之间的DHCP中继数目不能超过16个,也就是Hops值不能大于16,否则DHCP报文将被丢弃。
Xid:表示DHCP客户端选取的随机数,使DHCP服务器的回复与DHCP客户端的报文相关联。
Secs(seconds):由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数,缺省值为3600s。
Flags:客户端请求服务器发送响应报文的形式,只有最高位有意义,其余15位置0。最高位为0时请求发送单播响应,最高位为1时请求发送广播响应。
Yiaddr(your client ip address):表示服务器分配给客户端的IP地址。当服务器进行DHCP响应时,将分配给客户端的IP地址填入此字段。
Siaddr(server ip address):DHCP服务器的IP地址。
Giaddr(gateway ip address):表示第一个DHCP中继的IP地址。当客户端发出DHCP请求时,第一个DHCP中继在将DHCP请求报文转发给DHCP服务器时,会把自己的IP地址填入此字段。DHCP服务器会根据此字段来判断出客户端所在的网段地址,从而选择合适的地址池,为客户端分配该网段的IP地址。服务器还会根据此地址将响应报文发送给此DHCP中继,再由DHCP中继将此报文转发给客户端。
Chaddr(client hardware address):客户端的MAC地址。
Sname(server host name): 表示客户端获取配置信息的服务器名字。此字段由DHCP服务器填写,是可选的。如果填写,必须是一个以0结尾的字符串。
File(file name): 表示客户端启动DHCP相关配置的文件名。此字段由DHCP服务器填写,随着DHCP地址分配的同时下发至客户端。本字段是可选的,如果填写,必须是一个以0结尾的字符串。
Options:DHCP通过此字段包含了服务器分配给终端的配置信息。
Options预定义选项字段介绍
DHCP报文中Options字段为可变长度字段,最多为312Byte,此字段包含了DHCP报文类型,服务器分配给终端的配置信息,如网关IP地址,DNS服务器的IP地址,客户端可以使用IP地址的有效租期等信息。
Options字段由Type、Length和Value三部分组成。其中Type字段取值范围1~255。
Type | Length (Byte) | Value | 作用 |
1 | 4 | Subnet Mask | 设置子网掩码选项。 |
3 | 4 | Router(网关) | 设置网关地址选项。 |
43 | 厂商特定信息选项。 | ||
50 | 4 | Requested IP Address | 设置请求IP地址选项。 |
51 | 4 | IP Address Lease Time | 设置IP地址租约时间选项。 |
53 | 1 | Message Type | 设置DHCP消息类型。 |
54 | 4 | DHCP Server Identifier | 设置服务器标识。 |
55 | 9 | Parameter Request List | 设置请求选项列表。客户端利用该选项指明需要从服务器获取哪些网络配置参数。 |
58 | 4 | Rebinding Time Value | 设置续约T1时间,一般是租期时间的50%。 |
59 | 4 | Renewal Time Value | 设置续约T2时间。一般是租期时间的87.5%。 |
82 | 中继代理信息选项。 |
Type=53(DHCP的消息类型)
DHCP报文通过Options选项中的Type=53来表示DHCP的报文类型。当Type=53,Length=1,Value取值从01到08分别表示不同的DHCP报文类型。
1-DHCP DISCOVER:DHCP客户端首次登录网络时进行DHCP交互过程发送的第一个消息,用来寻找DHCP服务器。
2-DHCP OFFER:DHCP服务器用来响应DHCP DISCOVER消息,此消息携带了各种配置信息。
3-DHCP REQUEST:DHCP客户端广播请求回应DHCP服务器OFFER消息;DHCP客户端重启广播确认之前的IP地址等配置信息;续租。
4-DHCP DECLINE:当客户端发现服务器分配给它的IP地址发生冲突时会通过发送此消息来通知服务器。
5-DHCP ACK:DHCP服务器对客户端的DHCP REQUEST消息的确认响应消息。
6-DHCP NAK:服务器对客户端的DHCP REQUEST消息的拒绝响应消息。
7-DHCP RELEASE:客户端可通过发送此消息主动释放服务器分配给它的IP地址。
8-DHCP INFORM:DHCP客户端获取IP地址后,如果需要向DHCP服务器获取更为详细的配置信息(网关地址、DNS服务器地址),则向DHCP服务器发送DHCP INFORM请求消息。
Type=82(中继代理信息选项)
Option 82中可以包含最多255个Sub-Option,若定义了Option 82,至少要定义一个Sub-Option。
DHCP中继或DHCP Snooping设备接收到DHCP客户端发送给DHCP服务器的请求报文后,在该报文中添加Option 82,并转发给DHCP服务器。管理员可以从Option 82中获得DHCP客户端的信息,例如DHCP客户端所连接交换机端口的VLAN ID、二层端口号、中继设备的MAC地址等。
常用的Sub-Option如下:
Sub-Option 1:为代理电路id(即circuit id)子项。子选项通常在DHCP中继设备上配置,定义了在传输报文的时候要携带DHCP客户端所连接交换机端口的vlan-id及二层端口号。通常Sub-Option 1与Sub-Option 2子选项要共同使用来标识DHCP源端的信息。
Sub-Option 2:代理远程id(即remote id)子项。该子选项也通常在DHCP中继设备上配置,定义了在传输报文的时候要携带中继设备的mac地址信息。
和Sub-Option 5:为链路选择(link selection)子项,该选项中包含了DHCP中继添加的ip地址。这样DHCP server在分配ip地址给DHCP客户端的时候就可以分配与该地址同网段的ip地址。
Type=43(厂商特定信息选项)
DHCP服务器和DHCP客户端通过Option 43交换厂商特定的信息。当DHCP服务器接收到请求Option 43信息的DHCP请求报文(Option 55中带有Option 43参数)后,将在回复报文中携带Option 43,为DHCP客户端分配厂商指定的信息。
例如:在WLAN组网中,AP作为DHCP客户端,DHCP服务器通过option 43选项字段向AP通告AC的IP地址,以方便AP与AC建立连接。
抓包观察
1 报文类型:2(服务器响应报文)
2 硬件地址的类型:以太网
3 硬件地址的长度:6字节
4 经过的DHCP 中继数目:0个
5 DHCP客户端选取的随机数:0x00004e33
6 IP地址使用时间:0秒
7 报文响应形式:单播
8 服务器分配给客户端的IP地址:192.168.1.254
9 第一个中继IP地址:192.168.1.1
10 客户端MAC地址:54:89:98:94:1e:41
11 没有配置服务器名
12 没有配置文件名
13 DHCP消息类型:Offer
14 DHCP子网掩码:255.255.255.0
15 DHCP网关选项
16 DHCP租期选项
17 DHCP续约T2时间选项
18 DHCP续约T1时间选项
19 DHCP服务器标识:10.1.0.2
DHCP分配IP地址顺序
1 DHCP服务器的数据库中与客户端MAC地址静态绑定的IP地址。
2 客户端以前曾经使用过的IP地址,即客户端发送的请求报文中请求IP地址选项的地址。
3 在DHCP地址池中,顺序查找可供分配的空闲IP地址,最先找到的IP地址。
4 如果在DHCP地址池中未找到可供分配的空闲IP地址,则依次查询超过租期、发生冲突的IP地址,如果找到可用的IP地址,则进行分配,否则报告错误。
DHCP地址租期与续租
DHCP服务器给每个分配给客户端的IP地址定义一个使用期限,该使用期限被称为租期。
客户端在租期时间到之前,如果用户不想使用分配的IP地址(例如客户端网络位置需要变更),会触发DHCP客户端向DHCP服务器发送DHCP RELEASE报文,通知DHCP服务器释放IP地址的租期。DHCP服务器会保留这个DHCP客户端的配置信息,将IP地址列为曾经分配过的IP地址中,以便后续重新分配给该客户端或其他客户端。客户端可以通过发送DHCP INFORM报文向服务器请求更新配置信息。
DHCP客户端根据IP地址的剩余租期的不同而产生不同形式的续租请求。
当租期达到50%时(T1时间),DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功。
当租期达到87.5%时(T2时间),如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功。
如果租期时间到时都没有收到服务器的回应,或者收到DHCP NAK报文,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。
相关命令
配置全局DHCP地址租期
[R1-ip-pool-dhcp1]lease day 0 hour 0 minute 30
配置接口DHCP地址租期
[R1-GigabitEthernet0/0/1]dhcp server lease day 0 hour 0 minute 30
主机主动释放获得的DHCP地址
PC>ipconfig /release
主机获取新的DHCP地址
PC>ipconfig /renew
DHCP客户端重用曾经使用过的地址
DHCP客户端非首次接入网络时,可以重用曾经使用过的地址。
选择阶段
客户端广播发送包含前一次分配的IP地址的DHCP REQUEST报文,报文中的Option 50(请求的IP地址选项)字段填入曾经使用过的IP地址。
确认阶段
DHCP服务器收到DHCP REQUEST报文后,根据DHCP REQUEST报文中携带的MAC地址来查找有没有相应的租约记录。如果有则返回DHCP ACK报文,通知DHCP客户端可以继续使用这个IP地址,如果没有租约记录,则不响应。
DHCP Relay
DHCP Relay指DHCP中继。当DHCP服务器和客户端在不同的三层网络中时,报文无法通过广播到达,此时就需要有设备作为DHCP中继,确保DHCP服务器和客户端之间的正常通信。
DHCP Relay工作原理
选择阶段和确认阶段工作基本相同。
1 发现阶段
DHCP中继收到DHCP DISCOVER报文后,处理规则为:
检查DHCP报文中的Hops字段,如果大于16,则丢弃DHCP报文;否则,将Hops字段加1(表明经过一次DHCP中继),并继续下面的操作。
检查是否为第一中继:检查DHCP报文中的Giaddr字段。如果是0,将Giaddr字段设置为接收DHCP DISCOVER报文的接口IP地址。如果不是0,则不修改该字段,继续下面的操作。
将DHCP报文的目的IP地址改为DHCP服务器或下一跳中继的IP地址,源地址改为中继连接客户端的接口地址,通过路由转发将DHCP报文单播发送到DHCP服务器或下一跳中继。
2 提供阶段
DHCP服务器接收到DHCP DISCOVER报文后,选择与报文中Giaddr字段为同一网段的地址池,并为客户端分配IP地址等参数,然后向Giaddr字段标识的DHCP中继单播发送DHCP OFFER报文,DHCP中继收到DHCP OFFER报文后,会进行如下处理:
确认是否为中继OFFER:检查报文中的Giaddr字段,如果不是接口的地址,则丢弃该报文;否则,继续下面的操作。
确认是单播还是广播:DHCP中继检查报文的广播标志位。如果广播标志位为1,则将DHCP OFFER报文广播发送给DHCP客户端;否则将DHCP OFFER报文单播发送给DHCP客户端。
相关命令
在接口下启用DHCP中继功能
[R2-GigabitEthernet0/0/1]dhcp select relay
配置服务器IP地址
[R2-GigabitEthernet0/0/1]dhcp relay server-ip 192.168.2.254
创建DHCP服务器组
[R2]dhcp server group mid
在DHCP服务器组中配置DHCP服务器成员
[R2-dhcp-server-group-mid]dhcp-server 10.1.0.2
[R2-dhcp-server-group-mid]dhcp-server 10.2.0.2
[R2-dhcp-server-group-mid]dhcp-server 10.3.0.2
在接口应用服务器组
[R2-GigabitEthernet0/0/1]dhcp relay server-select mid
开启接口下的DHCP Client功能
[R2-GigabitEthernet0/0/1]ip address dhcp-alloc
查看DHCP配置
查看地址池情况
[R2]display ip pool IP address StatisticTotal :0 Used :0 Idle :0 Expired :0 Conflict :0 Disable :0
Used:表示此IP地址已使用。
Idle:表示此IP地址处于空闲状态。
Expired:表示此IP地址租期已过,处于空闲状态。
Conflict:表示此IP地址与网络上其他地址冲突。
Disable:表示此IP地址无法使用。
查看DHCP客户端信息
[R2]display DHCP client
查看DHCP relay信息
[R2]display dhcp relay all
配置举例
DHCP 中继配置
#
dhcp enable
#
interface GigabitEthernet0/0/0ip address 10.1.0.1 255.255.255.0
#
interface GigabitEthernet0/0/1ip address 192.168.1.1 255.255.255.0 dhcp select relaydhcp relay server-ip 10.1.0.2
#
DHCP 服务器配置
#
dhcp enable
#
ip pool dhcp1gateway-list 192.168.1.1 network 192.168.1.0 mask 255.255.255.0
#
interface GigabitEthernet0/0/0ip address 10.1.0.2 255.255.255.0 dhcp select global
#
DHCP Snooping
为了增强网络安全,防止DHCP受到攻击,一种称为DHCP Snooping的技术应运而生。DHCP Snooping不是一种标准技术,尚未有统一的标准规范,不同的网络设备制造商在DHCP Snooping的实现上也不尽相同。
相关命令
开启DHCP Snooping功能(开启DHCP Snooping功能之前,必须已使用命令dhcp enable开启了全局DHCP功能。开启DHCP Snooping功能的顺序是先开启全局下的DHCP Snooping功能,再开启接口或VLAN下的DHCP Snooping功能)
//全局下开启
[SW1]dhcp snooping enable //接口下开启
[SW1-GigabitEthernet0/0/1]dhcp snooping enable//vlan下开启
[SW1-vlan10]dhcp snooping enable//批量开启vlan
[SW1]dhcp snooping enable vlan 10 to 20
查看接口下的DHCP Snooping状态
<SW1>display dhcp snooping interface GigabitEthernet 0/0/1
DHCP Snooping绑定表
二层接入设备使能了DHCP Snooping功能后,从收到DHCP ACK报文中提取关键信息(包括PC的MAC地址以及获取到的IP地址、地址租期),并获取与PC连接的使能了DHCP Snooping功能的接口信息(包括接口编号及该接口所属的VLAN),根据这些信息生成DHCP Snooping绑定表。
由于DHCP Snooping绑定表记录了DHCP客户端IP地址与MAC地址等参数的对应关系,故通过对报文与DHCP Snooping绑定表进行匹配检查,能够有效防范非法用户的攻击。
注意:在连接用户的接口或VLAN下使能DHCP Snooping功能之后,需要使用命令dhcp snooping trusted将连接DHCP服务器的接口配置为“信任”模式,两者配合使用才能生成绑定表。
相关命令
查看绑定表
<SW1>display dhcp snooping user-bind all
四种DHCP攻击
DHCP Snooping可以针对三种主要的攻击进行防御:1 DHCP饿死攻击-改变CHADDR 2 饿死攻击-同时改变CHADDR和MAC 3 仿冒DHCP Server攻击 4 DHCP中间人攻击
针对DHCP饿死攻击-改变CHADDR进行防御
攻击方法:饿死攻击-改变CHADDR
防御方法:开启dhcp-chaddr检查
DHCP Snooping技术支持在端口下对DHCP Request报文的源MAC地址与CHADDR进行一致性检查:如果二者相同,则转发报文;如果二者不相同,则丢弃。
相关命令
开启dhcp-chaddr检查
//在全局下配置批量vlan
[SW1]dhcp snooping check dhcp-chaddr enable vlan 10 to 20//在接口下配置
[SW1-GigabitEthernet0/0/1]dhcp snooping check dhcp-chaddr enable //在vlan下配置
[SW1-vlan10]dhcp snooping check dhcp-chaddr enable
针对饿死攻击-同时改变CHADDR和MAC进行防御
攻击方法:饿死攻击-同时改变CHADDR和MAC
防御方法:限制交换机接口学习MAC地址数量
可以通过DHCP Snooping的MAC地址限制功能来防止。该功能通过限制交换机接口上允许学习到的最多MAC地址数目,防止通过变换MAC地址,大量发送DHCP请求。
相关命令
配置允许学习的DHCP Snooping绑定表项的最大个数
//在全局下配置(可以批量配置vlan)
[SW1]dhcp snooping max-user-number ?INTEGER<1-1024> Max user number value//在接口下配置
[SW1-GigabitEthernet0/0/1]dhcp snooping max-user-number ?INTEGER<1-1024> Max user number value//在vlan下配置
[SW1-vlan10]dhcp snooping max-user-number ?INTEGER<1-1024> Max user number value
针对仿冒DHCP Server攻击进行防御
攻击方法:仿冒DHCP Server
防御方法:开启Trusted端口
DHCP Snooping将交换机上的端口分为两种类型,即信任端口(Trusted端口)和非信任端口(Untrusted端口);与合法的DHCP Server相连接的端口应配置为Trusted端口,其他端口应配置为Untrusted端口。
交换机从Trusted端口接收到DHCP响应报文(例如DHCP Offer报文、DHCP Ack报文等等)后,会转发这些报文,从而保证合法的DHCP Server可以正常地分配IP地址及提供其他网络参数;交换机从Untrusted端口接收到DHCP响应报文(例如DHCP Offer报文、DHCP Ack报文等等)后,会丢弃这些报文,从而阻止仿冒的DHCP Server分配IP地址及提供其他网络参数。
相关命令
配置接口为信任状态(缺省情况下,设备接口为非信任状态。配置dhcp snooping enable命令的接口,收到DHCP请求报文后,转发给所有的信任接口;收到DHCP响应报文后丢弃。 配置dhcp snooping trusted命令的接口,收到DHCP请求报文后,转发给所有的信任接口,如果没有其他信任接口,则丢弃该DHCP请求报文;收到DHCP响应报文后,只转发给连接对应客户端的并且配置命令dhcp snooping enable的接口,如果查不到上述接口,则丢弃该DHCP响应报文。
也就是说:连接客户端的接口配置了dhcp snooping enable命令后,连接服务器的接口必须同时配置dhcp snooping enable命令和dhcp snooping trusted命令,相互之间才能正常运行DHCP。)
//在接口下配置
[SW1-GigabitEthernet0/0/1]dhcp snooping trusted //在VLAN下配置
[SW1-vlan10]dhcp snooping trusted interface GigabitEthernet 0/0/1
针对DHCP中间人攻击进行防御
攻击方法:DHCP中间人攻击(利用ARP机制)
防御方法:开启ARP与DHCP Snooping的联动功能
运行了DHCP Snooping的交换机会“侦听(Snooping)”往来于用户与DHCP Server之间的DHCP消息,并从中收集用户的MAC地址(这里的MAC地址是指DHCP消息中CHADDR字段的值)、用户的IP地址(这里的IP地址是指DHCP Server分配给相应CHADDR的IP地址)等信息,这些信息会集中存放在一个数据库中,该数据库也被称为DHCP Snooping绑定表。运行了DHCP Snooping的交换机会建立并动态维护DHCP Snooping绑定表,绑定表中除了包含了用户的MAC地址、用户的IP地址外,还包括IP地址租用期、VLAN-ID等等信息。
相关命令
开启ARP与DHCP Snooping的联动功能
[SW1]arp dhcp-snooping-detect enable