DHCP Features Overview:

DHCP被广泛应用于LAN内部进行动态的IP地址分发,从而可以大大减少ip地址管理的一个消耗。DHCP还可以实现对特定的IP地址时行保留的目的,因为所有的IP地址都是有选择性的分发的,都是由DHCP SERVER控制管理的。

DHCP Server:用于管理分配IP地址从特定的地址池,它可以是一个PC/ROUTER/SWITCH。如果此DHCP SERVER不能从它的数据库分配一个DHCP Client端请求的配置参数,它会转发这个请求到一个或多个管理员预先设置的其它的DHCP SERVER。

DHCP Relay Agent:一个用于在DHCP SERVER与DHCP Client之间转发DHCP Packets的中间三层设备。它主要应用于DHCP SERVER与Client端在不同的子网时,临时作为一个代理,在它们之间传递数据包。DHCP Relay Agent的中继转发不同与一般的二层转发,它在收到一个DHCP消息时,会生成一个新的DHCP消息同时发送到外出接口。

DHCP Snooping:一种DHCP安全特性,通过建立和维护一个DHCP Snooping Binding Database/Table,来过滤untrusted DHCP消息。DHCP Snooping就像是运行在untrusted hosts与DHCP SERVER之间的一个firewall一样。使用DHCP Snooping可以将连接到end user的untrusted interfaces与连接到DHCP SERVER或其它switch的trusted interfaces区别开来。
注:为了使DHCP Snooping特性正常的工作,首先所有的DHCP SERVERS都必须通过trusted interface连接到switch上。
DHCP Snooping Binding Database中包含关于本地switch的所有untrusted interfaces的MAC address,IP address,lease time,binding type,vlan number及interface消息等。它不存储关于trusted interfaces的任何消息。
当一个switch从一个untrusted interface接收到一个packet,并且此接口所属的VLAN配置了DHCP Snooping时,switch会将这个packet的source MAC address与DHCP Client端的hardware address相比较,默认情况下如果相同,switch就会转发这个packet,如果不相同,此包被丢弃。
当下面几种情况发生时,switch会丢弃DHCP Packets:
1>收到一个外部网络或firewall的DHCP SERVER发来的packet。
2>从一个untrusted interface上接收到一个packet,并且source MAC address与DHCP client的hardware address不匹配。
3>switch接收到一个MAC address在DHCP Snooping Binding Database里的DHCPRELEASE或DHCPDECLINE广播包,但是Binding Dabase里的interface消息与接收到广播的接口的interface消息不匹配。
4>一个DHCP Relay Agent在转发一个DHCP packet的时候没有设置relay-agent ip address字段为0.0.0.0;或是Relay Agent转发了一个包含option-82消息的packets到一个untrusted port。


Option-82 Data Insertion:

当DHCP option-82 feture在switch上启用时,一个用户设备(subscriber device)通过连接到switch的port和它自己的MAC地址被唯一的标识。
DHCP Relay Agent(一般由Catalyst swtich或router来实现)被配置一个helper address命令,进行实现跨网段的转发DHCP消息从clients到server。

                        |————————|
                        | DHCP SERVER  |
                        |————————|
                                 |
                                 |
                        |——————————|
                        | Catalyst Switch | (Access Layer,DHCP Relay Agent)
                        |——————————|
                            /       \
                           /         \  
                          /           \
                   |---------------------------|
                   |     /   vlan10    \       |
                   |    pc1            pc2     |
                   |(DHCP Client) (DHCP Client)|
                   |---------------------------|

当在switch上启用DHCP Snooping option-82后,下列事件会顺序发生:
1>DHCP client产生一个DHCP request包,并广播到网络上。
2>当switch收到DHCP request后,它添加一个option-82信息到这个request包内。option-82消息主要包括:the remote ID suboption(switch MAC address),the circuit ID suboption(接收到DHCP request的port identifier,vlan-mod-port)。同时,如果Relay Agent配置了IP地址,它也会在request包中插入它自己的IP地址。
3>switch转发这个包括了option-82字段的DHCP request包给DHCP server。
4>DHCP server收到这个包后,如果server支持option-82特性的话,它会参考这些remete ID或circuit ID,或全部字段去分配IP地址及实现策略,例如可以限制分给有特定remote ID或circuit ID的设备的IP地址。然后,DHCP server复制收到的request的option-82字段到它的DHCP reply包内,并发送。
5>如果request包是由Relay Agent中转发送过来的,那DHCP server会单播回复这个请求。
6>switch通过检测reply包内的remote ID和circuit ID字段来验证它原来插入的option-82数据,进而决定将reply转发出哪个接口。
7>switch移除option-82字段消息,然后转发这个replay包到原来请求这个reply的client所在的switch port。

Circuit ID Suboption Frame Format:

+----------------------------------------------------------------+
|    1    |    6    |    0    |    4    |  VLAN  | Module | Port |
+----------------------------------------------------------------+
 1byte       1byte     1byte     1byte    2bytes   1byte   1byte
Suboption    Length   Circuit
  type                ID type

Circuit ID suboption内的port字段,port number是从3开始的。例如:Catalyst 3560-24PS switch,port3是FastEthernet0/1,port4是FastEthernet0/2,port5是FastEthernet0/3等……
port27是Small Form-factor pluggable(SFP) module slot0/1,port28是SFP module slot0/2。


Remote ID Suboption Frame Format:

+----------------------------------------------------------------+
|    2    |    8    |    0    |    6    |      MAC address       |
+----------------------------------------------------------------+
   1byte     1byte     1byte     1byte            6byte
 Suboption   Length    Remote    Length
   type               ID type

注:只有在当DHCP Snooping被全局的启用,且当ip dhcp snooping information option全局配置命令被启用时,switch才会使用这些packet formats。



DHCP Binding Database:

当DHCP Snooping开启时,switch开始使用DHCP Snooping Binding Database来存储关于untrusted interfaces的信息,它可以存储最多512个bindings。
每一个database entry(binding)有一个IP地址,一个相关的MAC地址,lease time(16进制形式),这个binding应用到哪个接口,以及接口属于哪个VLAN。
每一个entry大小都是72 bytes,后而跟一空格,其次是checksum value。
为了使Switch在重启后还能保留这个binding database,必须使用DHCP Snooping database agent。database agent存储bindings为一个文件形式到一配置好的指定位置。switch在当binding database改变时都会更新database agent文件,从而使它保存最新的信息。
binding database和database agent file的更新频率是基于配置的delay,且更新是成批的。如果binding database和database agent file在一个时间段(set by the write-delay and abort-timeout values)没有得到更新,则更新停止。

Binding database agent file format:
<initial-checksum>
TYPE DHCP-SNOOPING
VERSION 1
BEGIN
<entry-1> <checksum-1>
<entry-2> <checksum-1-2>
...
...
<entry-n> <checksum-1-2-..-n>
END
注:文件中的每一个entry都附属一个checksum值,switch在读这个文件的时候会检验这个checksum。
第一行的initial-checksum条目用来区别上一次更新的entries和最后一新更新的entries。

binding agent file实例:
3ebe1518
TYPE DHCP-SNOOPING
VERSION 1
BEGIN
1.1.1.1 512 0001.0001.0005 3EBE2881 Gi0/1 e5e1e733
1.1.1.1 512 0001.0001.0002 3EBE2881 Gi0/1 4b3486ec
1.1.1.1 1536 0001.0001.0004 3EBE2881 Gi0/1 f0e02872
1.1.1.1 1024 0001.0001.0003 3EBE2881 Gi/1 ac41adf9
1.1.1.1 1 0001.0001.0001 3EBE2881 Gi0/1 34b3273e
END
当switch开机启动时,它会计算每个entries的checksum,查看它们是否匹配,如果匹配,则读取它们到DHCP Snooping Binding Database,当下列情况发生时,switch会忽略这个entry:
1>switch计算的checksum值与entry后的checksum值不匹配,则这条entry及它以后的条目都被忽略。
2>该entry的lease time已经过期了,此时Switch可能不会从binding file里移除这个entry。
3>该entry中指定的interface已经不存在于系统内了。
4>该entry中指定的interface是一个routed interface,或是一个DHCP Snooping-trusted interface。



Configure DHCP Snooping Feture:

1>只有switch被配置为一个DHCP server是,它才会回复一个DHCP requests。
2>switch只有在DHCP server的IP地址配置在DHCP client的SVI上时才会回复DHCP packets。
3>只有switch运行enhanced multiplayer p_w_picpath(EMI)时,才支持此feture。
4>switch只从被配置为DHCP server的设备上获取network addresses和configuration parameters。

Case Study:DHCP Snooping Configuration Guidelines
1>必须在switch上全局启用DHCP Snooping。
2>DHCP Snooping在VLAN上启用后才会active。
3>在switch上配置全局启用DHCP Snooping之前,确保作为DHCP server和DHCP Relay Agent的设备已经配置好,并启用了。
4>下列命令在switch上全局配置DHCP Snooping后不能使用,直到DHCP Snooping被关闭:
ip dhcp relay information check  全局配置命令
ip dhcp relay information policy 全局配置命令
ip dhcp relay information trust-all 全局配置命令
ip dhcp relay information trusted 接口配置命令
5>在配置switch为一个DHCP Relay Agent时,必须确保DHCP server已经配置完成。
6>如果DHCP Relay Agent被启用,但是DHCP Snooping被关闭,DHCP option-82 data insertion feature不能被支持。
7>如果一个switch port连接到一个DHCP server,则需要通过输入接口配置命令ip dhcp snooping trust来配置那个port为一个trusted interface。
8>如果一个switch port连接到一个DHCP client,则需要通过输入接口配置命令no ip dhcp snooping trust来配置那个port为一个untrusted interface。
9>当配置DHCP Snooping Binding Database时要注意:
 -- 因为NVRAM和flash memory都有一个存储能力的限制,所以推荐使用TFTP server来存放binding file。
 -- 在使用基于网络的URLs(如TFTP,FTP)时,首先必须在那个URL下建立一个空的文件,以使Switch可以完成对那个URL下的文件的初始化写入。
 -- 确保database内的lease time的精确性,所以推荐使用配置使用NTP。
 -- 如果NTP没有配置,则switch只在switch system clock与NTP同步后,才将bindings的变化写入binding file。
 
Case Study:Configuring the DHCP Server
switch可以被配置为一个DHCP server。默认时Cisco IOS DHCP server和relay agent fetures都是被启用的,只是没有被配置生效。

Case Study:Configuring the DHCP Relay Agent
R1#conf t
R1(config)#service dhcp                 //在switch上启用dhcp server和relay agent,默认这些feture被启用。
R1(config)#end
R1#show running-config
R1#copy running-config startup-config


Specifying the Packet Forwarding Address:
如果DHCP server与DHCP clients在不同的网段内,就必须在switch上配置ip helper-address address的接口配置命令,实现这种中继转发。
一般情况下是在与clients最近的Layer 3 interface上配置。
命令ip help-address命令中的address参数可以是一个IP地址,即DHCP server的IP地址;也可以是一个network地址,它指示DHCP server在此网段上,同而使任何一个DHCP server都可以回复clients的请求。

R1#conf t
R1(config)#int vlan {vlan-id}
R1(config-vlan)#ip add {ip-address} {subnet-mask}
R1(config-vlan)#ip helper-address {address}
R1(config-vlan)#exit
R1(config)#int range {port-range/interface-id}
R1(config-if)#switchport mode access
R1(config-if)#switchport access vlan {vlan-id}
R1(config-if)#end
R1#show run
R1#copy run start

Enabling DHCP Snooping and Option 82:
R1#conf t
R1(config)#ip dhcp snooping           //全局启用DHCP Snooping
R1(config)#ip dhcp snooping vlan {vlan-range      //在一个VLAN或VLAN-RANGE上启用DHCP Snooping}
R1(config)#ip dhcp snooping information option   
允许switch插入或删除DHCP relay信息(option-82字段)到(传送给DHCP server的)DHCP request消息中。
R1(config)#int interface-id
R1(config-if)#ip dhcp snooping trust
配置接口为trusted或untrusted,默认为untrusted(no ip dhcp snooping trust)。
R1(config-if)#ip dhcp snooping limit rate {rate}
配置一个接口每秒可以接收DHCP packets数目。默认没有限制。
推荐为一个untrusted interface配置不超过每秒100 packets。
R1(config-if)#ip dhcp snooping verify mac-address
配置switch检测从一个untrusted interface接收到的DHCP packets的source MAC地址是否与包的client hardware address匹配,默认为检测。
R1(config-if)#end
R1(config)#show run
R1(config)#copy run start

注:
1>关闭DHCP Snooping feture,使用全局配置命令:
no ip dhcp snooping
2>关闭一个VLAN或一组VLAN上的DHCP Snooping feture,使用全局配置命令:
no ip dhcp snooping vlan vlan-range
3>关闭插入和移除option-82字段feture,使用全局配置命令:
no ip dhcp snooping information option

Example:
Switch(config)# ip dhcp snooping
Switch(config)# ip dhcp snooping vlan 10
Switch(config)# ip dhcp snooping information option
Switch(config)# interface gigabitethernet0/1
Switch(config-if)# ip dhcp snooping limit rate 100


Enabling DHCP Snooping on Private VLANs:
1>可以在private VLANs上启用DHCP Snooping,那时候configuration会被同时传递到primary VLAN和它相应的secondary VLANs。
2>如果在primary VLAN上启用了DHCP Snooping,那secondary VLANs也就被配置了DHCP Snooping了。
3>如果在primary VLAN上已经配置了DHCP Snooping,那在secondary VLANs上配置的任何其它的DHCP Snooping消息都不会生效。
4>如果没有在primary VLAN上配置DHCP Snooping,而只在secondary VLANs上进行了配置,则配置只影响secondary VLAN。
5>命令show ip dhcp snooping输出所有的启用DHCP Snooping feture的VLANs,包括primary和secondary VLANs。


Enabling the DHCP Snooping Binding Database Agent:
R1#conf t
R1(config)#ip dhcp snooping database {flash:/filename | [url]ftp://user:password@host/filename[/url] | rcp://user@host/filename}
指定DHCP Snooping database agent file的存放位置,推荐使用FTP或TFTP。
R1(config)#ip dhcp snooping database timeout {seconds}
指定当binding database变化后多长时间停止datase的传输过程。
可选范围是0-86400,0为infinite时长。默认为300 seconds(5 minites)。
R1(config)#end
R1(config)#ip dhcp snooping binding {mac-address} vlan {vlan-id} {ip-address} interface {interface-id} expiry {seconds}
填加binding entries到DHCP Snooping Binding Database。
R1#show ip dhcp snooping database [detail]
R1#copy run start

注:
1>删除databases agent或binding file,使用接口配置命令:
no ip dhcp snooping database
2>reset time or delay值,使用接口配置命令:
ip dhcp snooping database timeout {seconds}或ip dhcp snooping database write-delay {seconds}
3>清除DHCP Snooping Binding Database Agent的摘要信息,使用特权命令:
clear ip dhcp snooping database statistics
4>renew database,使用特权命令:
renew ip dhcp snooping database
5>从DHCP Snooping binding database中删除binding entries,使用特权命令:
no ip dhcp snooping binding {mac-address} vlan {vlan-id} {ip-address} interface {interface-id} expiry {seconds}

Example:
Switch(config)# ip dhcp snooping database flash:/database1
Switch(config)# ip dhcp snooping database timeout 30
Switch(config)# ip dhcp snooping database write-delay 30
Switch# ip dhcp snooping binding 0001.0200.0004 vlan 100 172.16.22.44 interface gigabitethernet0/1 expiry 5000
Switch# ip dhcp snooping binding 0022.0300.0008 vlan 100 172.16.24.44 interface gigabitethernet0/1 expiry 5000
Switch# ip dhcp snooping binding 0004.0070.0012 vlan 100 172.16.26.44 interface gigabitethernet0/1 expiry 5000



Case Study:Displaying DHCP Snooping Information
show ip dhcp snooping 显示关于此switch配置的关于DHCP Snooping的信息
show ip dhcp snooping binding  只显示DHCP Snooping Binding Dabase里动态配置的bindings,即binding table。
show ip dhcp snooping database 显示DHCP snooping binding database状态及摘要。
show up source binding 显示动态和静态配置的bindings。

注:如果DHCP Snooping被启用了,并且interface状态变为down,则switch不会删除手工静态配置的bindings。



Understanding IP Source Guard:
1>IP Source Guard是一种基于DHCP Snooping Binding Database和手工配置的IP Source Bindings来过滤非路由的Layer2的interfaces的一种security feature。
2>可以使用IP Source Guard feture来阻止流量***,例如,一个主机试图使用它邻居的IP地址时行通信。
3>当DHCP Snooping被启用在一个untrusted interface上时,就可以启用IP Source Guard。
4>当IP Source Guard被启用在一个interface上时,switch阻止在这个接口上接收到的所有的IP流量,除了被DHCP Snooping允许的DHCP packets。同时,一个port access control list(PACL)被应用于这个接口,PACL只允许source IP地址在IP Source Binding table内的IP流量,所有其它的流量都被限制。
5>IP Source Binding table的bindings是从DHCP Snooping或手工配置(Static IP Source bindings)学来的。IP Source Binding Table内的每一个条目都包括IP Address,与之对应的MAC address及它们所属的VLAN号。
6>只有IP Source Guard feture启用时,switch才使用IP Source Binding Table。
7>IP Source Guard只被Layer 2 ports支持,包括access ports和trunk ports。可以配置IP Source Guard使用源IP地址或源MAC地址进行过滤。
8>使用IP Source Guard Feture,switch必须配置Enhanced Multiplayer Image(EMI)。




Case Study:Source IP Address Filtering
Switch只转发源IP地址匹配DHCP Snooping Binding Database或IP Source Binding Table的IP流量。
当某一接口的DHCP Snooping Binding或静态的IP Source Binding被添加/修改/删除后,switch会自动对其相应的PACL进行调整。
如果在一个没有配置IP Source Bindings(dynamically learned by DHCP Snooping or manually configured)的接口启用了IP Source Guard,则switch会为该接口创建一个阻止所有IP流量的PACL。



Case Study:Source IP and MAC Address Filtering
Switch只转发源IP地址和源MAC都匹配IP Source Binding Table的IP流量。
当这种源IP和源MAC地址的IP Source Guard过滤被启用时,switch过滤所有的IP和非IP流量。如果IP或非IP流量的源MAC地址匹配一个有效的IP Source Binding,则switch转发这些流量信息。switch丢弃所有其它的非DHCP Packets。



Case Study:IP Source Guard Configuration Guidelines
1>默认IP Source Guard是被启用的。
2>只可以在非路由ports上配置static ip bindings。如果在一个routed interface上使用全局配置命令:
ip source binding {mac-address} vlan {vlan-id} {ip-address} interface {interface-id}
会导致一个error message:
Static IP source binding can only be configured on switch port.
3>当IP Source Guard with source IP filtering被启用在一个VLAN上,DHCP Snooping必须被启用在所有属于那个ACCESS VLAN的接口上。
4>当在一个Trunk interface上启用IP Source Guard,且DHCP Snooping被应用于所有VLANs时,source IP address过滤被应用到所有的VLANs上。
5>当使用源IP和源MAC地址过滤的IP Source Guard被启用,那么接口上的DHCP Snooping和port Security也必须被启用。
6>当配置IP Source Guard在一个属于private VLAN的接口上时,port security无效。
7>可以将此feture与802.1x port-based authentication一同使用。
8>当ternary content addressable memory(TCAM) entries数目超最大可用值时,CPU的使用量会增加。



Case Study:Configure IP Source Guard Feture
R1#conf t
R1(config)#int interface-id
R1(config-if)#ip verify source        //启用基于源IP地址过滤
R1(config-if)#ip verify source port-security      //启用基于源IP和MAC地址的过滤
R1(config-if)#exit
R1(config)#ip source binding {mac-address} vlan {vlan-id} {ip-address} interface {interface-id}
添加一个static ip source binding
R1(config)#end
R1(config)#show ip verify source [interface {interface-id}]
显示IP Source Guard的关于所有接口的或特定接口的配置信息
R1(config)#show ip source binding [ip-address] [mac-address] [dhcp-snooping | static] [interface {interface-id}]  [vlan {vlan-id}]
显示一个特定VLAN,特定接口的IP Source Bindings信息

注:
1>关闭IP Source Guard with source IP filtering,使用接口配置命令:
no ip verify source
2>删除一个static ip source binding entry,使用接口配置命令:
no ip source binding {ip-address} {mac-address} vlan {vlan-id} interface {interface-id}


Example:
Switch# configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Switch(config)# interface gigabitethernet0/1
Switch(config-if)# ip verify source port-security
Switch(config-if)# exit
Switch(config)# ip source binding 0100.0022.0010 vlan 10 10.0.0.2 interface gigabitethernet0/2
Switch(config)# ip source binding 0100.0230.0002 vlan 11 10.0.0.4 interface gigabitethernet0/2
Switch(config)# end



Case Study:Displaying IP Source Guard Information
1>show ip source binding
显示switch上配置的ip source bindings
2>show ip verify source
显示switch上配置的ip source guard配置