DHCP Snooping
DHCP监听(DHCP Snooping)是一种DHCP安全特性,通常在接入层交换机上采用。Cisco交换机支持在每个VLAN基础上启用DHCP监听,通过这种特性,交换机能够拦截第二层VLAN域内的所有DHCP报文。DHCP监听通过建立和维护DHCP Snooping Binding Table(DHCP监听绑定表)过滤来自不信任区域的DHCP信息。DHCP Snooping绑定表包含不信任区域用户的MAC地址、IP地址、租用期、VlanID、接口等信息,但是不保存信任区域设备的信息。
DHCP Snooping
DHCP监听将交换机端口划分为两类:
信任端口(Trust):连接合法DHCP服务器的端口或者连接汇聚交换机的上行端口;
非信任端口(Untrusted):通常为连接终端设备的端口,如PC,网络打印机等。
通过开启DHCP监听特性,交换机限制用户端口(非信任端口)只能够发送DHCP请求,丢弃来自用户端口的所有其它DHCP报文,例如DHCP Offer报文等。而且,并非所有来自用户端口的DHCP请求都被允许通过,交换机还会比较DHCP请求报文的(报文头里的)源MAC地址和(报文内容里的)DHCP客户机的硬件地址(即CHADDR字段),只有这两者相同的请求报文才会被转发,否则将被丢弃,这样就防止了DHCP耗竭攻击。信任端口可以接收并转发所有的DHCP报文。通过只将交换机连接到合法DHCP服务器的端口设置为信任端口,其他端口设置为非信任端口,就可以防止用户伪造DHCP服务器来攻击网络。DHCP监听特性还可以对端口的DHCP报文进行限速,超过速率的接口将被关闭。通过在每个非信任端口下进行限速,将可以阻止合法DHCP请求报文的广播攻击。DHCP监听还有一个非常重要的作用就是建立一张DHCP监听绑定表,这张表一是通过DHCP Request或Ack包中的IP和MAC地址生成的,二是可以手工指定。一旦一个连接在非信任端口的客户端获得一个合法的DHCP Offer,交换机就会自动在DHCP监听绑定表里添加一个绑定条目,内容包括了该非信任端口的客户端的MAC地址、IP地址、租用期、VlanID、接口等信息。
说明:
①非信任端口只允许客户端的DHCP请求报文通过,这里只是相对于DHCP报文来说的。其他非DHCP报文还是可以正
常转发的。这就表示客户端可以静态指定IP地址的方式通过非信任端口接入网络。由于静态客户端不会发送
DHCP报文,所以DHCP监听绑定表里也不会有该静态客户端的记录。信任端口的客户端信息不会被记录到DHCP监
听绑定表里。如果有一客户端连接到了一个信任端口,即使它是通过正常的DHCP方式获得IP地址,DHCP监听绑
定表里也不有该客户端的记录。如果要求客户端只能以动态获得IP的方式接入网络,则必须借助于IPSG和DAI
技术。
②交换机为了获得高速转发,通常只检查报文的二层帧头,获得目标MAC地址后直接转发,不会去检查报文的内
容。而DHCP监听本质上就是开启交换机对DHCP报文的内容部分的检查,DHCP报文不再只是被检查帧头了。
③DHCP监听绑定表不仅用于防御DHCP攻击,还为后续的DAI和IPSG技术提供动态数据库支持。
④DHCP监听绑定表里的Lease列就是每个客户端对应的DHCP租约时间。当客户端离开网络后,该条目并不会立即
消失。当客户端再次接入网络,重新发起DHCP请求以后,相应的条目内容就会被更新。
例如:下面的000F.1FC5.1008这个客户端原本插在Fa0/1端口,现在插在Fa0/3端口,相应的记录在它再次发送
DHCP请求并获得地址后会更新为:
⑤当交换机收到一个DHCP Decline或DHCP Release广播报文,并且报文头的源MAC地址存在于DHCP监听绑定表的
一个条目中。但是报文的实际接收端口与绑定表条目中的端口字段不一致时,该报文将被丢弃。
DHCP Release报文:此报文是客户端主动释放IP地址(如Windows客户端使用ipconfig/release),当DHCP服务
器收到此报文后就可以收回IP地址,分配给其他的客户端了;
DHCP Decline报文:当客户端发现DHCP服务器分配给它的IP地址无法使用(如IP地址发生冲突)时,将发出此报
文让DHCP服务器禁止使用这次分配的IP地址。
⑥DHCP监听绑定表中的条目可以手工添加。
⑦DHCP监听绑定表在设备重启后会丢失,需要重新绑定,但可以通过设置将绑定表保存在Flash或TFTP/FTP服务
器上,待设备重启后直接读取,而不需要客户端再次进行绑定。
⑧当前主流的Cisco交换机基本都支持DHCP Snooping功能。
DHCP Snooping的作用:
1.DHCP Snooping的主要作用就是通过配置非信任端口,隔绝非法的DHCP Server;
2.DHCP Snooping与交换机DAI的配合,防止ARP病毒的传播;
3.DHCP Snooping建立和维护一张DHCP Snooping监听绑定表,这张表是后续DAI(Dynamic Arp Inspect)和IPSG
(IP Source Guard)的基础。这两种类似的技术,是通过这张表来判定IP或者MAC地址是否合法,来限制用户连
接到网络的。
Cisco开启DHCP Snooping后的一些默认值:
1.默认关闭,所有端口都为非信任端口,“no ip dhcp snooping trust”;
2.默认关闭,汇聚交换机丢弃从非信任端口收到的接入交换机发来的带有Option-82 Information的DHCP报文,
“no ip dhcp snooping information option allow-untrusted”;
①开启后,汇聚交换机接收从非信任端口收到的接入交换机发来的带有Option-82 Information的DHCP报文。
3.默认开启,为非信任端口收到的DHCP包插入Option 82,“ip dhcp snooping information option”;
①关闭后,汇聚交换机接收从非信任端口收到的接入交换机发来的不带Option-82 Information的DHCP报文。
4.默认开启,限制对非信任接口DHCP包的转发速率为15个/s,“ip dhcp snooping limit rate 15”;
5.默认开启,检测源MAC地址和CHADD字段是否相同,“ip dhcp snooping verify mac-address”;
6.默认开启,DHCP监听绑定表发生更新后,默认等待300s后再写入文件,
“ip dhcp snooping database write-delay 300”;
7.默认开启,DHCP监听绑定表尝试写入操作失败后,默认直到300s后停止尝试,
“ip dhcp snooping database timeout 300”。
Option 82
它被称为DHCP Relay Agent Information Option(DHCP中继代理信息选项),选项号为82,故被称为Option 82,相关标准文档为RFC3046。当DHCP服务器和客户端不在同一个子网内时,客户端要想从DHCP服务器上分配到IP地址,就必须由DHCP中继代理(DHCP Relay Agent)来转发DHCP请求包。DHCP中继代理将客户端的DHCP报文转发到DHCP服务器之前,可以插入一些选项信息,以便DHCP服务器能更精确的得知客户端的信息,从而能更灵活地按相应的策略分配IP地址和其他参数。
DHCP中继代理(Option 82、DHCP Snooping)和DHCP Server之间的关系:
1.交换机开启了DHCP Snooping功能后,默认情况下,将对从非信任端口收到的DHCP请求报文插入选项82信息;
1>默认时SW2(上行交换机)从Untrusted端口到带有Option 82的DHCP请求报文时会将这个报文丢弃;
①可以在SW2上配置“ip dhcp snooping information allow-untrusted”全局命令,将不丢弃该报文;
②可以在SW2的Untrusted接口配置“ip dhcp snooping trust”接口命令,这样SW2就能接收带有Option 82
的DHCP请求报文了,但是不建议这样做,因为这样将不建立该接口的DHCP监听绑定表,会降低安全性。
2>DHCP Srver和DHCP Client在同一个子网的情况下,交换机会把Option 82的值填为0(即0.0.0.0)。
2.以Windows Server 2003为DHCP的服务器不认为Option 82的值为0的DHCP请求报文是错误的;
以Cisco IOS为DHCP的服务器默认时会认为Option 82的值为0的DHCP请求报文是错误的,它将丢弃这个报文。
1>可在SW1上配置“no ip dhcp snooping information option”命令,不插入Option 82;
2>可在R1上选择配置以下命令,允许Option 82的值为0的DHCP请求报文通过:
①接口命令:“ip dhcp relay information trust”,仅对路由器当前接口有效;
②全局命令:“ip dhcp relay information trust-all”,对路由器所有接口有效。
说明:
当一台开启DHCP监听的汇聚交换机和一台插入了选项82信息的边界交换机(接入交换机)相连时:
①如果边界交换机是连接到汇聚交换机的信任端口,那么汇聚交换机会接收从信任端口收到的插入选项82的DHCP
报文信息,但是汇聚交换机不会为这些信息建立DHCP监听绑定表条目;
②如果边界交换机是连接到汇聚交换机的非信任端口,那么汇聚交换机会丢弃从该非信任端口收到的插入了选项
82的DHCP报文信息。但在IOS12.2(25)SE版本之后,汇聚交换机可以通过在全局模式下配置一条:“ip dhcp
snooping information allow-untrusted:命令。这样汇聚交换机就会接收从边界交换机发来的插入选项82的
DHCP报文信息,并且也为这些信息建立DHCP监听绑定表条目;
③在配置汇聚交换机下联口时,将根据从边界交换机发送过来的数据能否被信任而设置为信任或者非信任端口。
总之:要想支持选项82的扩展应用,则DHCP服务器本身必须支持选项82以及收到的DHCP报文必须被插入选项82信息。一般二层交换机都支持选项82功能,通常只支持一部分,完全支持的很少。
DHCP Snooping实验
配置命令
说明:“ip dhcp snooping binding 000f.1fc5.1008 vlan 10 192.168.10.131 int f1/2 expiry 692000”条
目中“expiry”参数为4294967295时表示绑定永不过期。
1、单机交换(DHCP服务器和DHCP客户端位于同一VLAN)
环境:Windows2003 DHCP服务器和客户端都位于Vlan 10;服务器接在F0/1,客户端接在F0/2。
2960交换机相关配置:
①本例中交换机对于客户端的DHCP请求报文将插入选项82信息,也可以通过配置“no ip dhcp snooping
information option”命令选择不插入选项82信息,两种情况都可以。
②客户端端口推荐配置“spanning-tree portfast”命令,使得该端口不参与生成数计算,节省端口启动时间,
防止可能因为端口启动时间过长导致客户端得不到IP地址。
③开启DHCP监听特性的VLAN并不需要该VLAN的三层接口被创建。
2、单交换机(DHCP服务器和DHCP客户端位于同一VLAN)
环境:Cisco IOS DHCP服务器(2821路由器)和PC客户端都位于Vlan 10;路由器接在F0/1,客户端接在F0/2。
2960交换机相关配置:
①需要注意的是路由器连接到交换机的端口需要配置“ip dhcp relay information trusted”命令,否则客户
端将无法得到IP地址。这是因为交换机配置了(默认情况)“ip dhcp snooping information option”命令,
此时交换机会在客户端发出的DHCP请求报文中插入选项82信息。另一方面由于DHCP服务器(这里指Cisco IOS
DHCP服务器)与客户端处于同一个VLAN中,所以请求实际上并没有经过DHCP中继代理。
②对于Cisco IOS DHCP服务器来说,如果它收到的DHCP请求被插入了选项82信息,那么它会认为这是一个从DHCP
中继代理过来的请求报文,但是它检查了该报文的giaddr字段却发现是0.0.0.0,而不是一个有效的IP地址
(DHCP请求报文中的giaddr字段是该报文经过的第一个DHCP中继代理的IP地址,具体请参考DHCP报文格式),因
此该报文被认为“非法”,所以将被丢弃。可以参考路由器上的DHCP的debug过程。
③Cisco IOS里有一个命令,专门用来处理这类DHCP请求报文“ip dhcp relay information trusted”(接口命
令)或者“ip dhcp relay information trust-all”(全局命令,对所有路由器接口都有效);这两条命令的作
用就是允许被插入了选项82信息,但其giaddr字段为0.0.0.0的DHCP请求报文通过。
④如果交换机不插入选项82信息,即配置了“no ip dhcp snooping information option”命令,那么就不会出
现客户端无法得到IP地址的情况,路由器也不需要配置“ip dhcp relay information trusted”命令。
⑤Windows DHCP服务器则不认为Option 82的值为0.0.0.0的DHCP报文是错误的,所以上一个实例中不论交换机是
否插入选项82信息,客户端总是可以得到IP地址。
3、单交换机(DHCP服务器和DHCP客户端位于不同VLAN)
环境:Cisco IOS DHCP服务器(2821路由器)的IP地址为192.168.2.2,位于Vlan 2;DHCP客户端位于Vlan 10;交换机为3560,路由器接在F0/1,客户端接在F0/2。
①本例中的路由器不需要配置“ip dhcp relay information trusted”命令,因为从交换机过来的DHCP请求经
过了中继代理,其报文中的giaddr字段为192.168.10.1,而不是0.0.0.0,是默认正常的DHCP请求报文。
4、多交换机环境(DHCP服务器和DHCP客户端位于不同VLAN)
环境:2611路由器作为DHCP服务器,IP地址为192.168.2.2,位于Vlan 2;PC位于Vlan 10;路由器接在3560的G0/2,PC接2960的F0/1口,两交换机互连口都是G0/1。
3560交换机相关配置:
2960交换机相关配置:
2611路由器相关配置:
说明:
①本例中3560没有开启DHCP监听功能,2960开启了该功能。需要注意的是int vlan 10需要配置“ip dhcp
relay information trusted”命令,理由如同实例2。
5、多交换机(DHCP服务器和DHCP客户端位于同一VLAN)
环境:3560交换机自身作为DHCP服务器;PC1和PC2都位于Vlan 10;PC1接3560的F0/1口,PC2接2960的F0/1口;两交换机互连口都是G0/1。
①本例中3560和2960同时开启了DHCP监听功能。从2960过来的DHCP请求报文是已经被插入了选项82信息,如果将
3560的G0/1设置为信任端口,那么插入了82选项的DHCP请求报文是允许通过的,但不会为其建立DHCP监听绑定
表。即3560上只有PC1的绑定条目,而没有PC2的绑定条目。
②如果此时同时部署DAI,IPSG,由于2960不支持这两项功能,对于3560来说,从2960上过来的数据可能存在IP
欺骗和ARP欺骗等攻击,是不安全的。另一方面,由于3560没有PC2的绑定条目,而DAI和IPSG必须依赖DHCP监
听绑定表。因此如果需要在3560上再部署DAI或者IPSG,就不能将3560的G0/1设置为信任端口。
③但是将3560的G0/1口设置为非信任端口以后,默认情况下,非信任端口将会丢弃收到的插入了82选项的DHCP请
求报文。而从2960过来的DHCP请求报文又正好是被插入了选项82信息的。因此必须配置“ip dhcp
snooping information option allow-untrusted”命令,否则3560将丢弃这些DHCP请求报文,接在2960上的
PC2将得不到IP地址。只有配置了该命令以后,3560才会接收从2960发送的插入了选项82的DHCP报文,并为这
些信息建立绑定条目。
④3560下联的G0/1口由于是非信任端口,默认限速为每秒15个DHCP请求报文,如果2960上的所有PC都同时发起
DHCP请求,可能此端口会被errdisable掉。这里假设2960为24口,因此简单的设置限速为24*15=360。
⑤2960上联的G0/1口必须被配置为信任端口,否则将丢弃从3560过来的DHCP应答报文,PC2将无法得到IP地址。
6、多交换机环境(DHCP服务器和DHCP客户端位于同一VLAN)
环境:4503交换机自身作为DHCP服务器;PC1和PC2都位于Vlan 10;PC1接4503的G2/1口,PC2接3560的F0/1口;两交换机互连口是4503 G1/1 -- 3560 G0/1。
3560交换机相关配置:
①本例中4503和3560同时开启了DHCP监听功能。由于4503的下联口被设置为信任端口,所以从3560过来的DHCP请
求报文即使已经被插入了选项82信息,也允许通过的,但不会为其建立DHCP监听绑定表。所以4503上只有PC1
的绑定条目,而没有PC2的绑定条目。
②作为接入层交换机的3560支持DAI,IPSG,如果同时配置这两项功能,那么有理由相信从3560过来的数据是已
经经过检验的安全数据,因此将4503的下联口设置为信任端口是可行的。另外,4503没有PC2的绑定条目,也