本次博客主要是介绍关于DHCP协议原理与配置。
一个网络如果要正常地运行,则网络中的主机(Host)必需要知道某些重要的网络参数,如IP地址、网络掩码、网关地址、DNS服务器地址(域名解析)、网络打印机地址等等。显然,在每台主机上都采用手工方式来配置这些参数是非常困难的、或是根本不可能的,如果是五台十台,对于公司的管理员来说,这些参数采用静态的手工方式配置的话,完全没有问题,但是如果是上千台的话,对于这上千台的主机都采用手工的方式配置的话,这个管理员他辞职不香吗?
网关:相同网段的主机进行通信的时候,是不需要网关的,但是不同网段的主机在通信的时候,是必须需要通过网关。
为此,IETF于1993年发布了动态主机配置协议(DHCP:Dynamic Host Configuration Protocol)。DHCP的应用,实现了网络参数配置过程的自动化。不需要管理员手工去配置,可以主机可以主机去获取ip地址,那么DHCP技术具体是如何实现的呢?面对网络规模的扩大,DHCP又是如何应对的?面对网络中的攻击, DHCP又是如何防护的呢?
传统的手工配置网络参数 需要每个用户都手动配置IP地址、掩码、网关、DNS等多个参数。
这样就会存在一些问题:
人员素质要求高(主机的使用者需要懂得如何进行网络参数的配置操作方法,这在实际中是难以做到的。)
容易出错 (手工配置过程中非常容易出现人为的误操作情况)
灵活性差 (网络参数发生改变时,需要重新进行配置操作。例如,如果某主机在网络中的位置发生了变化,则该主机的网关地址也可能会发生变化,这时就需要重新配置该主机的网关地址。)
IP地址资源利用率低 (IP地址无法得到重复利用。一个段254个地址,可能只会用掉一百多个,那么剩下的需要做记录,还不能投入使用)
工作量大 (配置工作量会随着主机数量的增加而增大)
在以上问题的推动下,得想办法搞一个比较简单的网络参数配置的技术就是DHCP
随着用户规模的扩大及用户位置的不固定性,传统的静态手工配置方式已经无法满足需求,为了实现网络可以动态合理地分配IP地址给主机使用,需要用到动态主机配置协议DHCP。
DHCP相对于静态手工配置有如下优点:
效率高(这个效率高完全是自动的,网卡可以设置为DHCP获取,不管是小型企业还是家庭办公,最起码都是有路由器的,这个路由器上都是集成了DHCP功能的,平时的生活中,我们的手机在连上wifi上边,是不需要去配置ip地址,全都是自动获取,这样来讲,效率就比较高了,不需要手工获取,不需要管理员手工去配置)
灵活性强
易于管理
在DHCP这个架构里边其实是有两种角色,一个是DHCP Server,叫做dhcp 服务器,服务器的作用就是给客户端去分发网络参数的,在这个网络参数里是有ip地址,网关,dns等等一些参数;另外一个角色就是普通用户终端,主机,相对于dhcp server 来讲,它叫做dhcp client,缺省是没有ip地址的,需要通过dhcp报文的交互向着dhcp server去请求一些网络参数,
DHCP采用了Client/Server模型;DHCP Client需要从DHCP Server那里获得各种网络配置参数,这个过程是通过DHCP Client与DHCP Server之间交互各种DHCP消息来实现的。DHCP消息是封装在UDP报文中的,DHCP Server使用端口号67来接收DHCP消息,DHCP Client使用端口号68来接收DHCP消息。本此博客中,我们主要关心DHCP Client是如何获得自己的IP地址的。
如下图所示,是DHCP Client通过DHCP来申请获取自己的IP地址的基本过程,在这一个过程中需要注意的是,在这个网络环境里边,DHCP Client 和DHCP server一定处在一个二层广播域里边,如果在这个二层广播域里边有一台路由器,那么在这里,这个申请过程的模型就不适用了,这个二层广播域就意味着客户端和服务器是可以直接二层通信的,中间不需要经过三层,所以在这个二层广播域里边可以理解为各种各样的交换机,去连接到一块。
那么在这样一个组网条件下,当客户端插上网线之后,把本地网卡改为dhcp获取之后,那么就开始朝着这个网段里面去发送广播报文,是这一过程包含了四个阶段:
DHCP 配置实现:
如下图所示:
PC2通过DHCP 全局地址池来获取ip地址,PC1通过接口地址池来获取地址,在路由器上配置DHCP 服务器。
AR1上的dhcp 动态地址池的配置如下:
dhcp enable // 使能 DHCP 功能,在配置 DHCP 服务器时必须先执行该命令,才能配置 DHCP 的其他功能并生效ip pool PC2 // 设置一个名为PC2 的全局地址池gateway-list 192.168.2.254 // 设置分配的网关 IPnetwork 192.168.2.0 mask 255.255.255.0 // 设置分配的地址网段excluded- ip -address 192.168.2.1 // 设置不参与自动分配的 IP 地址范围lease day 3 hour 0 minute 0 // 设置地址池中 IP 地址的租用有效期限,默认 1 天dns -list 192.168.2.1 // 设置分配的 DNS 服务器地址interface GigabitEthernet0/0/0ip address 192.168.2.254 255.255.255.0dhcp select global // 接口下使能全局方式分配地址
DHCP接口地址的配置如下:
配置解析:
interface g0/0/0ip address 192.168.1.254 24dhcp select interface // 使能接口分配地址方式且关联接口地址池dhcp server dns -list 192.168.1.1 // 指定分配的 DNS 服务器地址dhcp server excluded- ip -address 192.168.1.1 // 配置接口地址池中不参与自动分配的 IP 地址范围dhcp server lease day 3 hour 0 minute 0 // 配置接口地址池中 IP 地址的租用有效期,默认 1 天
结果验证:
随着网络规模的扩大,网络中就会出现用户处于不同网段的情况:
如下图所示,client A向DHCP 服务器发送DHCP discover 消息,但是对于RTA来讲,DHCP discover 报文没有办法跨越二层广播域传递,所以RTA只能将这个报文丢弃。
从前面的描述中可知,DHCP Client和DHCP Server必须在同一个二层广播域中才能接收到彼此发送的DHCP消息。DHCP消息无法跨越二层广播域传递。
一个实际的IP网络通常都包含了多个二层广播域,如果需要部署DHCP,那么可以有两种方法:
DHCP Relay 是dhcp中继器,就是中间人, 中间人的目的就是当你从用户这边收到了广播的DHCP discover 报文之后,中继器可以把这个广播报文重新封装一下,这个广播报文变成单播报文发给这个DHCP Server,这样的话,dhcp服务器就能收到这个discover报文,dhcp服务器就可以分配ip地址了。
这样的话,随着网段的增加,路由器只需要配置中继就好了,不需要配置server了,把所有的dhcp的服务放在服务器上。
如下图所示,LSW1作为DHCP 中继器且pc1处于vlan 10,pc2处于vlan20
[LSW1]DIS CU
#
sysname LSW1
#
vlan batch 10 20
#
dhcp server group 1
dhcp-server 10.0.12.1 0
dhcp-server 10.0.12.2 1
#
interface Vlanif1
ip address 10.0.123.11 255.255.255.0
#
interface Vlanif10
ip address 10.0.1.254 255.255.255.0
dhcp select relay
dhcp relay server-select 1
#
interface Vlanif20
ip address 10.0.2.254 255.255.255.0
dhcp select relay
dhcp relay server-select 1
#
interface GigabitEthernet0/0/1
port link-type access
port default vlan 10
#
interface GigabitEthernet0/0/2
port link-type access
port default vlan 20
#
dis cu
#
sysname AR1
#
interface GigabitEthernet0/0/0
ip address 10.0.123.1 255.255.255.0
#
interface GigabitEthernet0/0/1
ip address 10.0.12.1 255.255.255.0
#
ip route-static 0.0.0.0 0.0.0.0 10.0.123.11
dis cu
#
sysname DHCP SERVER
#
dhcp enable
#
ip pool VLAN10
gateway-list 10.0.1.254
network 10.0.1.0 mask 255.255.255.0
#
ip pool VLAN20
gateway-list 10.0.2.254
network 10.0.2.0 mask 255.255.255.0
#
interface GigabitEthernet0/0/0
ip address 10.0.12.2 255.255.255.0
dhcp select global
#
ip route-static 0.0.0.0 0.0.0.0 10.0.12.1
#
对于DHCP服务器来说,它怎么区分vlan10和vlan20的主机申请的ip地址是对应的哪一个地址池,可以通过发送这个单播报文的网关地址来区分的。
网络攻击行为无处不在,针对DHCP的攻击行为也不例外。例如,某公司突然出现了大面积用户无法上网的情况,经管理员检查用户终端均未获取到IP地址,且DHCP Server地址池中的地址已经全部被分配出去了,对于这个DHCP server是可以检查,哪些地址已经分配出去了,哪些地址是空闲的,它的统计信息是在路由器上是可以看的,(可以通过DHCP IP POOL NAME VLAN10 去看)这种情况很有可能就是DHCP受到了饿死攻击而导致的。
DHCP在设计上未充分考虑到安全因素,从而留下了许多安全漏洞,使得DHCP很容易受到攻击。实际网络中,针对DHCP的攻击行为主要有以下三种:
DHCP饿死攻击(就是想办法把dhcp服务器的地址全都给获取完,真正的主机在后期想要获取地址的时候,就没得用了。)
仿冒DHCP Server攻击(搞一台设备架在交换机上边,仿造一个dhcp server去攻击你,你拿到我的iP地址,你可能上不了网,或者上网了,得通过我去绕了一圈去上网,那对于你的所有数据都可以抓包了。)
DHCP中间人攻击
攻击原理:攻击者持续大量地向DHCP Server申请IP地址,直到耗尽DHCP Server地址池中的IP地址,导致DHCP Server不能给正常的用户进行分配。
漏洞分析:DHCP Server向申请者分配IP地址时,无法区分正常的申请者与恶意的申请者。
DHCP饿死攻击是攻击者通过持续大量地向DHCP Server申请IP地址来实现的,其目的是耗尽DHCP Server地址池中的IP地址,导致DHCP Server没有IP地址分配给正常的用户。DHCP消息中有一个名叫CHADDR(Client Hardware Address 客户端的mac地址)的字段,该字段是由DHCP客户端填写的,表示的是客户端的硬件地址(也就是客户端的MAC地址)。DHCP Server是针对CHADDR来分配IP地址的,对于不同的CHADDR,DHCP Server会分配不同的IP地址;DHCP Server无法区分什么样的CHADDR是合法的,什么样的CHADDR是非法的。利用这个漏洞,攻击者每申请一个IP地址时,就在DHCP消息的CHADDR字段中填写一个不同的值,以此来冒充是不同的用户在申请IP地址。
攻击原理:攻击者仿冒DHCP Server,向客户端分配错误的IP地址及提供错误的网关地址等参数,导致客户端无法正常访问网络。
漏洞分析:DHCP客户端接收到来自DHCP Server的DHCP消息后,无法区分这些DHCP消息是来自仿冒的DHCP Server,还是来自合法的DHCP Server。
如下图所示:
攻击原理:攻击者利用ARP机制,让PC-A学习到IP-S与MAC-B的映射关系,(这是很容易做到了,比如说搞一个无故ARP出去,攻击者可以往PC-A发一个我的IP地址是S,mac地址是B,那么这个样子的话,PCA上就有了另外一种映射,去往SERVER的mac地址是B),同样的,又让Server学习到IP-A与MAC-B的映射关系。如此一来,PC-A与Server之间交互的IP报文都会经过攻击者中转。
因为PCA和server之间的mac地址都是B的mac地址,所以交换机在转发的时候,都会交给B
无故ARP
主机使用自己的IP地址作为目标地址发送ARP请求。这种ARP请求称为无故ARP,通常用为:
1.无故ARP可以用于检测网络中的重复IP地址。一台设备可以向自己的 IP地址发送ARP请求,如果收到收到ARP响应则表明网络中存在重复地址。
2.无故ARP还可以通告一个新的MAC。当一台设备收到一个ARP请求,如果ARP高速缓存中已有发送者的IP地址,那么此IP地址所对应的硬件地址将会被发送者新的硬件地址所更新。这种无故ARP用途正式基于此。
3.某个子网中运行HSRP协议的路由器如果从其他路由器变成了主路由器,它将会发送一个无故ARP更新该子网内主机的ARP缓存。
漏洞分析:从本质上讲,中间人攻击是一种Spoofing IP/MAC攻击,中间人利用了虚假的IP地址与MAC地址之间的映射关系来同时欺骗DHCP的客户端和服务器。(spoofing 欺骗)
如下图所示
攻击者利用ARP机制,让PC-A学习到IP-S与MAC-B的映射关系,又让Server学习到IP-A与MAC-B的映射关系。当PC-A向DHCP Server发送IP报文时,目的IP地址为IP-S,源IP地址为IP-A,而封装这个IP报文的帧的目的MAC地址为MAC-B,源MAC地址为MAC-A,所以这个帧会首先到达攻击者PC-B。攻击者收到这个帧后,将这个帧的目的MAC地址更换为MAC-S,源MAC地址更换为MAC-B,然后将这个帧发往Server。如此“偷梁换柱”,Server是看不出任何破绽的。另一方面,当DHCP Server向PC-A发送IP报文时,目的IP地址为IP-A,源IP地址为IP-S,而封装这个IP报文的帧的目的MAC地址为MAC-B,源MAC地址为MAC-S,所以这个帧也会首先到达攻击者PC-B。攻击者收到这个帧后,将这个帧的目的MAC地址更换为MAC-A,源MAC地址更换为MAC-B,然后将这个帧发往PC-A。同样,PC-A也是看不出任何破绽的。
由于往来于 PC-A 与 DHCP Server 之间的 IP 报文都会经过攻击者(中间人)进行中转,攻击者便很容易窃取这些 IP 报文中的某些信息,并利用这些信息来进行其他的破坏行为。攻击者也可以很容易对往来于 PC-A 与 DHCP Server 之间的 DHCP 消息(这些消息是封装在 UDP 报文中的,而 UDP 报文又是封装在 IP 报文中的)进行篡改,达到直接攻击 DHCP 的目的。
对于以上的问题,得想办法去解决,那么应用而生的就是dhcp Snooping
为了增强网络安全,防止DHCP受到攻击,一种称为DHCP Snooping的技术应运而生。DHCP Snooping不是一种标准技术,尚未有统一的标准规范,不同的网络设备制造商在DHCP Snooping的实现上也不尽相同。
DHCP Snooping部署在交换机上,其作用类似于在DHCP客户端与DHCP服务器端之间构筑了一道虚拟的防火墙。通过这个虚拟的防火墙,就可以防范刚才提到的攻击,
讲到这个其实还需要有个铺垫,当我们在这里部署了DHCP Snooping以后,真实PC和服务器,进行交互的dhcp报文之后,都会被交换机进行监听,然后利用dhcp报文形成一个绑定表,这个绑定表的内容,要比交换机里的表(mac地址,vlan出接口,)还要更加丰富,通过dhcp snooping形成了一个DHCPsnooping的绑定表,这里的内容会更加丰富,除了有mac地址,vlan接口还有ip地址,租期,还有绑定类型,(绑定类型有两种,一种是动态的(通过dhcp交互形成的,),一种的静态的(手工静态的绑定方式),)加上这些之后,表里的内容就丰富了,后期可以利用这个绑定表去防范一些攻击。
接下来去看一下怎么去防范dhcp饿死攻击的。
当我们在交换机上开启了dhcp snooping 的功能之后,还有第二个作用,第一个作用就是通过截获侦听dhcp报文,形成一个绑定表;第二个功能是在某个vlan里边,去开启了dhcp snooping,(注意,DHCP snooping可以针对某个vlan里边去开的,在交换机上开了,那么多vlan,到底是哪个vlan开snooping,可以有目的性的去开启)当在某个vlan里边去开启了snooping,那么在这个vlan里边的所有接口,都会处于一个untrust 状态,这种端口叫做untrust端口,对于这种untrust的端口,是没有办法去转发dhcp服务器的报文的,比如dhcp服务器的offer,dhcp服务器的ack,如果是被untrust端口收到了,它是不会收也不会发的。这样的话,合法的服务器也不能正常发送offer了,所以当我们在某个vlan开启了dhcp snooping之后,需要将连接合法服务器的端口设置为trust,这个是通过手工去配置的,trust端口是可以接收和发送过来的offer报文,ack报文,其他端口全都是untrust,这样的话,仿冒者服务器在假装服务器发送offer的时候,交换机就不会接收和发送了,
中间人攻击的防范也是通过这个绑定去实现的,之前形成的绑定表,绑定表里边的mac地址a就对应着ip地址a,mac地址b就对应着ip地址b,中间人再去发送无故ARP的时候,交换机收到之后,会检查ARP里边的源IP地址和源mac地址,发现你的IP地址和mac地址的映射关系不能匹配dhcp snooping绑定表的条目,正常来讲,如果是合法的主机去做无故ARP的话,你的mac地址就是你自己的,ip地址也是你自己的,所以这个mac地址和ip地址和绑定表里的一样,如果不一样的话,就意味着你在用别人的ip地址,用你自己的mac地址做ARP,那就是一个攻击,还是通过比对这个表项,如果一样就让你转,如果不一样,就会丢弃这个arp请求报文,这样的话,你想实现中间人攻击就不可能了。
同时这个DHCP Snooping还可以和另外一种技术做联动。
IPSG(ip source guard)叫做ip源保护,ip源保护可以实现针对于虚拟ip地址源的保护,正常来讲,你的ip地址是b,万一你仿冒a的地址去发,当仿冒a的地址去发的时候,ip source guard开启以后,要去检查源地址,和绑定表里边的地址,是不是一个,如果不是一个就认为是一个ip源攻击,就会把他干掉,正常来讲,a发送过来的报文,用的ip地址是a,绑定表的ip的ip地址也是a,那就正常通过,那你b应该是用b发但你是用a发的,就会被干掉了,这个是dhcp snooping和ipsg的一个联动,如果没有这个ipsg,他是不会去检查这个ip地址的,那么做了这个ipsg联动,就会利用这个dhcp绑定表,做一个检查,如果一致,就可以通信,如果不一致,就不能通信。
如下图所示,来模拟dhcp server仿冒者攻击场景
dis cu
#
sysname LSW1
#
vlan batch 10
#
vlan 10
dhcp snooping enable
dhcp snooping trusted interface GigabitEthernet0/0/3
#
interface MEth0/0/1
#
interface GigabitEthernet0/0/1
port link-type access
port default vlan 10
#
interface GigabitEthernet0/0/2
port link-type access
port default vlan 10
ip source check user-bind enable 和ipsg做联动
dhcp snooping check dhcp-chaddr enable 开启检查chaddr的功能,防止饿死攻击
dhcp snooping check dhcp-rate enable 限制dhcp请求的发包速率,防止有人一直给dhcp服务器发送discover报文,破坏dhcp服务器的稳定性
#
interface GigabitEthernet0/0/3
port link-type access
port default vlan 10
#
interface GigabitEthernet0/0/4
port link-type access
port default vlan 10
#
[AR1]dis cu
[V200R003C00]
#
sysname AR1
#
dhcp enable
#
interface GigabitEthernet0/0/0
ip address 10.0.1.254 255.255.255.0
dhcp select interface
dhcp server dns-list 8.8.8.8
dis cu //仿冒者
[V200R003C00]
#
sysname AR2
#
dhcp enable
#
interface GigabitEthernet0/0/0
ip address 10.0.2.254 255.255.255.0
dhcp select interface
dhcp server dns-list 9.9.9.9
#
配置结果验证:
在配置DHCP snooping之前,会发现,用户端会收到两个dhcp服务器的响应报文
在配置完dhcp snooping之后, 没有将交换机上的连接合法服务器的接口改为trust接口,之后,再向服务器申请网络参数的时候,就收不到服务器的响应报文了,如下图所示
那么连接服务器的接口 改为trust状态,再抓取包的时候,就只有合法服务器的响应报文,如下图所示