DHCP监听将交换机端口划分为两类:
●非信任端口:通常为连接终端设备的端口,如PC,网络打印机等
●信任端口:连接合法DHCP服务器的端口或者连接汇聚交换机的上行端口
一、DHCP snooping 技术介绍
DHCP监听(DHCP Snooping)是一种DHCP安全特性。Cisco交换机支持在每个VLAN基础上启用DHCP监听特性。通过这种特性,交换机能够拦截第二层VLAN域内的所有DHCP报文。
通过开启DHCP监听特性,交换机限制用户端口(非信任端口)只能够发送DHCP请求,丢弃来自用户端口的所有其它DHCP报文,例如DHCP Offer报文等。而且,并非所有来自用户端口的DHCP请求都被允许通过,交换机还会比较DHCP 请求报文的(报文头里的)源MAC地址和(报文内容里的)DHCP客户机的硬件地址(即CHADDR字段),只有这两者相同的请求报文才会被转发,否则将被丢弃。这样就防止了DHCP耗竭攻击。信任端口可以接收所有的DHCP报文。通过只将交换机连接到合法DHCP服务器的端口设置为信任端口,其他端口设置为非信任端口,就可以防止用户伪造DHCP服务器来攻击网络。DHCP监听特性还可以对端口的DHCP报文进行限速。通过在每个非信任端口下进行限速,将可以阻止合法DHCP请求报文的广播攻击。DHCP监听还有一个非常重要的作用就是建立一张DHCP监听绑定表(DHCP Snooping Binding)。一旦一个连接在非信任端口的客户端获得一个合法的DHCP Offer,交换机就会自动在DHCP监听绑定表里添加一个绑定条目,内容包括了该非信任端口的客户端IP地址、MAC地址、端口号、VLAN编号、租期等信息。
二、DHCP snooping 配置
Switch(config)#ip dhcp snooping //打开DHCP Snooping功能
Switch(config)#ip dhcp snooping vlan 10 //设置DHCP Snooping功能将作用于哪些VLAN
Switch(config)#ip dhcp snooping verify mac-adress
//检测非信任端口收到的DHCP请求报文的源MAC和CHADDR字段是否相同,以防止DHCP耗竭攻击,该功能默认即为开启
Switch(config-if)#ip dhcp snooping trust
//配置接口为DHCP监听特性的信任接口,所有接口默认为非信任接口
Switch(config-if)#ip dhcp snooping limit rate 15
//限制非信任端口的DHCP报文速率为每秒15个包(默认即为每秒15个包)如果不配该语句,则show ip dhcp snooping的结果里将不列出没有该语句的端口,可选速率范围为1-2048
建议:在配置了端口的DHCP报文限速之后,最好配置以下两条命令
Switch(config)#errdisable recovery cause dhcp-rate-limit
//使由于DHCP报文限速原因而被禁用的端口能自动从err-disable状态恢复
Switch(config)#errdisable recovery interval 30
//设置恢复时间;端口被置为err-disable状态后,经过30秒时间才能恢复
Switch(config)#ip dhcp snooping information option
//设置交换机是否为非信任端口收到的DHCP报文插入Option 82,默认即为开启状态
Switch(config)#ip dhcp snooping information option allow-untrusted
//设置汇聚交换机将接收从非信任端口收到的接入交换机发来的带有选项82的DHCP报文
Switch#ip dhcp snooping binding 000f.1fc5.1008 vlan 10 192.168.10.131 interface fa0/2 expiry 692000 //特权模式命令;手工添加一条DHCP监听绑定条目;expiry为时间值,即为监听绑定表中的lease(租期)
Switch(config)#ip dhcp snooping database
flash:dhcp_snooping.db
//将DHCP监听绑定表保存在flash中,文件名为dhcp_snooping.db
Switch(config)#ip dhcp snooping database
tftp://192.168.2.5/Switch/dhcp_snooping.db
//将DHCP监听绑定表保存到tftp服务器;192.168.2.5为tftp服务器地址,必须事先确定可达。URL中的Switch是tftp服务器下一个文件夹;保存后的文件名为dhcp_snooping.db,当更改保存位置后会立即执行“写”操作。
Switch(config)#ip dhcp snooping database write-delay 30
//指DHCP监听绑定表发生更新后,等待30秒,再写入文件,默认为300秒;可选范围为15-86400秒
Switch(config)#ip dhcp snooping database timeout 60
//指DHCP监听绑定表尝试写入操作失败后,重新尝试写入操作,直到60秒后停止尝试。默认为300秒;可选范围为0-86400秒
说明:实际上当DHCP监听绑定表发生改变时会先等待write-delay的时间,然后执行写入操作,如果写入操作失败(比如tftp服务器不可达),接着就等待timeout的时间,在此时间段内不断重试。在timeout时间过后,停止写入尝试。但由于监听绑定表已经发生了改变,因此重新开始等待write-delay时间执行写入操作……不断循环,直到写入操作成功。
Switch#renew ip dhcp snooping database flash:dhcp_snooping.db
/特权级命令;立即从保存好的数据库文件中读取DHCP监听绑定表。
下面我们看看DAI:动态ARP检测。
这个特性关心的就只是ARP类型的包。它是一种验证网络中ARP包的安全特性,可以阻止、记录并丢弃非法IP和MAC地址绑定的ARP包。
DAI保证只有合法的ARP请求和回应可以进行传播。交换机会进行如下的处理:截取所有来自非信任端口的ARP请求和相应,在更新ARP缓存或者传输数据包的时之前验证所截取的数据包的IP-MAC地址绑定是否合法,并丢弃非法的ARP包。这样一来的话,我们通过这种特性就可以实现:防止中间人攻击,防止用户修改IP地址和MAC地址,防止用户静态指定IP地址。我们分别来分析是如何实现这几个功能的。如果一个数据包是ARP的请求包,那么DAI肯定就会检查源MAC和IP了,看看这个地址对是不是和绑定表中的一样,如果一样就OK 了,放过;如果不一样,就丢弃。这样一来就可以防止用户随便的修改IP地址或者MAC地址了,如果是用户都修改了,并且没有和其他的地址对产生冲突,那么也不会通过的,因为这个特性的判断的依据是DHCP的合法绑定表。你自己修改的,根本在哪个表中就 不存在啊~~!所以更得把你给干掉了。这样一来呢,我们就达到了防止用户修改IP地址或者MAC地址的问题了。并且,通过认识到这一点,我们会达到防止用户私自静态指定Ip地址,因为个人指定的那些IP地址在DHCP的绑定表中也是不存在的,所以静态指定了后,还是不可以进行通信的。如果你进行绑定的时候,用的是你自动获取的IP地址的话,一段时间内还是可以正常上网的。这个时间段就是说的IP地址的租赁时间,等时间到了后,DHCP绑定表中的内容相应的IP地址的对应条目就没有了。那么下面的这个使用静态的IP地址的还是上不去了啊,因为他上网的时候要经过这个DAI特性的检测的,且恰恰这个特性进行检测的依据中没有相关的地址条目了。以上的这俩个功能的实现都是从ARP请求包来实现的,下面就看看从ARP回应包来分析:其实,我们从路的这端来看一个数据包是请求包的时候,那么我们站在路的那端的角度上来思考这个问题的话,这个包就是回应包了,回应包到达的第一个使用这个特性的端口也会进行和我们起初说的那种对待ARP包的方式一样的,也是检测那个包的源IP地址和MAC地址。这样的话,也就可以保证IP地址和MAC地址的合法性。正是因为使用了这个特性后,PC不可以随便的修改IP地址和MAC地址,即使同时修改,并且成功了,也是不行的。所以也就达到了避免中间人攻击。到现在为止,我们看到了,使用了DHCP Snooping +DAI后,我们就可以达到:避免非法DHCP服务器的冒充;避免用户私自修改IP地址或者MAC地址;避免用户私自指定静态的IP地址;避免中间人攻击。其实,除了第一个DHCP服务器的冒充,后面的这3个,都是基于ARP欺骗的招数。我们都搞定了!
对于这两种特性来说:都是有信任端口和非信任端口的角色。并且在这些接口上都可以进行速度的限制的。默认的情况下,都是非信任端口,并且速度方面都是不限制的―unlimited。并且如果出现违背端口速度的话,这个端口就进入到errdisable状态。这样的话,我们还得需要牵涉到errdisable特性。在上面我们已经提到过了。
下面就看具体的配置实例:
1. 设备全局开启:server dhcp
2. 设置DHCP服务器:ip dhcp pool [name]
进来后,我们就可以进行详细的设置一个地址池的内容。
3.排除出不允许自动分配的IP地址:ip dhcp excluded-address ;
4.要把DHCP 数据库保存到一个硬件设备上,而非只是设备的内存中,这样的话,断电的话就没有了,到时候重新启动设备的时候,就得重新获取IP地址了,还会浪费很多的资源:ip dhcp database [url],这个时候,俩个地方的信息会进行同步的。我们还可以进一步的设置具体的同步时间。
5.开启支持DHCP中继的功能: 使用命令:ip dhcp relay information option ,这样就OK 了。并且得开启命令:ip dhcp relay information trust-all ,也就相信所有包含这个relay option的DHCP包。
6.设置DHCP服务器的地址,全局配置模式下:ip dhcp-server [ip].
并且在每个交换机的全局配置模式下都可以进行DHCP服务器的指定。
7.全局设置DHCP 的 Snooping特性。Ip dhcp snooping
Ip dhcp snooping vlan [id ]
Ip dhcp database [url]
8.设置该特性中的信任端口(默认是非信任的)和各种类型端口的速度限制。
9.清楚当出现问题的时候,端口是如何来处理的,是否进入errdisable?我们可以手动设置成这样的处理方式,同时我们还得注意设置好errdisable的恢复方法。基于具体原因或者基于时间。
10.如果我们使用DHCP中继的时候,那么我们就得在中间的3层设备上开启那个dhcp relay information option 。并且得在下面的交换机上设置命令:ip helper-address [the ip of DHCP]。因为开启了这个特性后,这个3层设备不单单是转发DHCP报文到这个IP地址,只要是UDP的包他就会转发到这个DHCP IP的,所以呢,这也是一个弊端,会严重增加CPU的利用率。我们得进行限制:
全局配置模式下:no ip forward-protocol udp [具体的服务的名称] .
这样一来的话,就可以限制这些无谓的UDP的转发了。
到这里,应该说是DHCP服务器的配置搞定了~~~但是还得配加上DAI。
全局配置模式下:ip arp inspection vlan [id]
定义DAI检查数据包的那些部分:ip arp inspection validate [ ]
进入端口,设置成信任的或者是非信任的,同时设置速度的限制。
默认的情况下是不限速的,且是不信任的端口。
这个时候,DHCP+DAI就设置完毕了啊~~~但是呢,DAI的支持只有3560以上才可以。
对于我们静态指定的那些合法的Ip地址,我们需要手动添加到ip dhcp snooping binding表中。得通过使用mac-accesslist 来实现。具体如下:
就是这样的一个设置添加静态指定的IP地址的过程!也就是说这个指定的IP地址是合法的。这个地址对也是在这个绑定表中的。就会让这样的ARP包进行发送了。
看看snooping和DAI,都是为数据的传输提供一个可靠的前提,一个安全的环境,因为他们都是分别针对的DHCP包和ARP包。而不是针对一般的数据包。但是经过对DHCP包和ARP包的严格把关,就可以建立那些完全正确、可靠的表,这样也就保证了以后的数据包传输的时候不会被欺骗。
在这里用到了mac access-list ,第二层的访问控制列表。得好好看看~~~打算通过那几个设备做个试验。
俩个不同的命令的输出的不同结果:
说的就是:show ip dhcp binding 和show ip dhcp snooping binding 。命令的输出中,包含的表项是不一样的,并且这俩个命令的描述也是不一样的。
我们在启用了DHCP服务的CORE2上不可以使用命令:show ip dhcp snooping,也不可以使用命令:ip dhcp snooping vlan [id]
因为他已经是DHCP服务器了。这个上面不用启用DHCP的监控特性了吗?就是因为这样的吗?如果不启用的话,那么那个合法的绑定表又该如何建立呢? 但是,下面的设备上得启用这个特性,防止非法的DHCP服务器的入侵。