DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是IETF为实现IP的自动配置而设计的协议,它可以为客户机自动分配IP地址、子网掩码以及缺省网关、DNS服务器地址等TCP/IP参数。了解DHCP工作过程可以帮助我们排除有关DHCP服务遇到的问题。DHCP 协议是基于UDP层之上的应用,本文来学习DHCP协议实现原理。

DHCP服务器端使用UDP的67号端口; DHCP 客户端使用UDP的68号端口。

为什么使用DHCP

DHCP服务器用于为客户机动态分配IP地址,避免了TCP/IP网络中地址的冲突,便于对网络的IP地址进行管理;

在使用TCP/IP协议通信的网络中,每台计算机都必须至少有一个IP地址,这样才能与其他计算机通信。对于一个较大规模的网络来说,逐个地为每台计算机分配和设置IP地址,将是一件很麻烦的事情,也不便于管理和维护;

对于像笔记本这样的移动用户,经常从一个子网移动到另一个子网,需要不断地手动更换IP地址,很不方便;

DHCP服务器通过动态的IP地址分配还能解决IP地址资源不足的情况,因此DHCP产生了。


一、DHCP工作原理

我们看下面的图

wKioL1ZtbBDTkAPwAAIQC8aBlbs900.png

1、客户发出的IP租用请求报文

  DHCP客户机初始化TCP/IP,通过UDP端口67向网络中发送一个DHCP DISCOVER广播包,请求租用IP地址。该 广播包中的源IP地址为0.0.0.0,目标IP地址为255.255.255.255;包中还包含客户机的MAC地址和计算机名。 

2、DHCP Server回应的IP租用提供报文
  任何接收到DHCP DISCOVER广播包并且能够提供IP地址的DHCP服务器,都会通过UDP端口68给客户机回应一个DHCP OFFER广播包,提供一个IP地址。该广播包的源IP地址为DHCP服务器IP,目标IP地址为255.255.255.255;包中还包含提供的IP地址、子网掩码及租期等信息。
3、客户选择IP租用报文
  客户机从不止一台DHCP服务器接收到提供之后,会选择第一个收到的DHCP OFFER包,并向网络中广播一个 DHCP REQUEST消息包,表明自己已经接受了一个DHCP服务器提供的IP地址。该广播包中包含所接受的IP地址和服务器的IP地址。 所有其他的DHCP服务器撤消它们的提供以便将IP地址提供给下一次IP租用请求。
4、DHCP服务器发出IP租用确认报文

  被客户机选择的DHCP服务器在收到DHCP REQUEST广播后,会广播返回给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户机。

5、客户配置成功后发出的公告报文

  客户机在收到DHCP ACK包,会使用该广播包中的信息来配置自己的TCP/IP,则租用过程完成,客户机可以在网络中通信。

至此一个客户获取IP的DHCP服务过程基本结束,不过客户获取的IP一般是用租期,到期前需要更新租期,这个过程是通过租用更新数据包来完成的。

客户IP租用更新报文

(1)在当前租期已过去50%时,DHCP客户机直接向为其提供IP地址的DHCP服务器发送DHCP REQUEST消息包。如果客户机接收到该服务器回应的DHCP ACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的TCP/IP参数,更新自己的配置,IP租用更新完成。如果没收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%。
(2)如果在租期过去50%时未能成功更新,则客户机将在当前租期过去87.5%时再次向为其提供IP地址的DHCP联系。如果联系不成功,则重新开始IP租用过程。
(3)如果DHCP客户机重新启动时,它将尝试更新上次关机时拥有的IP租用。如果更新未能成功,客户机将尝试联系现有IP租用中列出的缺省网关。如果联系成功且租用尚未到期,客户机则认为自己仍然位于与它获得现有IP租用时相同的子网上(没有被移走)继续使用现有IP地址。 如果未能与缺省网关联系成功,客户机则认为自己已经被移到不同的子网上,将会开始新一轮的IP租用过程。


  DHCP客户机在发出IP租用请求的DHCP DISCOVER广播包后,将花费1秒钟的时间等待DHCP服务器的回应,如果1秒钟没有服务器的回应,它会将这一广播包重新广播四次(以2,4,8和16秒为间隔,加上1~1000毫秒之间随机长度的时间)。四次之后,如果仍未能收到服务器的回应,则运行Windows 2000的DHCP客户机将从169.254.0.0/16这个自动保留的私有IP地址(APIPA)中选用一个IP地址,而运行其他操作系统的DHCP客户机将无法获得IP地址。DHCP客户机仍然每隔5分钟重新广播一次,如果收到某个服务器的回应,则继续IP租用过程。


二、思科DHCP全攻略


实验一: 配置DHCP 服务

wKiom1ZtbySAJCjUAADT0LlW-IU332.png

1、配置DHCP Server

(1)接口配置IP地址
    r2(config)#int f0/0
    r2(config-if)#ip address 10.1.1.1 255.255.255.0
    r2(config-if)#no shut
    r2(config-if)#exit
(2)开启DHCP 功能 
    r2(config)#service dhcp 
(3)配置DHCP 地址池 
    r2(config)#ip dhcp pool ccie1                   #地址池名为ccie1 
    r2(dhcp-config)#network 10.1.1.0 255.255.255.0  #可供客户端使用的地址段 
    r2(dhcp-config)#default-router 10.1.1.1         #默认网关 
    r2(dhcp-config)#dns-server 10.1.1.1 10.1.1.2    #DNS 
    r2(dhcp-config)#lease 1 1 1        #租期为1天1小时1分(默认为一天) 
    r2(dhcp-config)#exit
    r2(config)#ip dhcp pool ccie2                   #地址池名为ccie1 
    r2(dhcp-config)#network 20.1.1.0 255.255.255.0  #可供客户端使用的地址段 
    r2(dhcp-config)#default-router 20.1.1.1         #网关 
    r2(dhcp-config)#dns-server 20.1.1.1 20.1.1.2    #DNS 
    r2(dhcp-config)#lease 1 1 1        #租期为1 天1 小时1 分(默认一天) 
(3)去掉不提供给客户端的地址 
注:因为某些IP 地址不希望提供给客户端,比如网关地址,所以我们要将这些地址 
从地址池中移除,这样服务器就不会将这些地址发给客户端使用。 
r2(dhcp-config)#exit
r2(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 #移除10.1.1.1 到10.1.1.10
r2(config)#ip dhcp excluded-address 20.1.1.1 20.1.1.10 #移除20.1.1.1 到20.1.1.10

2、配置DHCP Client

(1)路由器模拟PC
    r1(config)#no ip routing
(2)配置接口使用DHCP
    r1(config)#int f0/0 
    r1(config-if)#ip address dhcp 
    r1(config-if)#no shut
    r1(config-if)#
*Mar  1 00:22:48.271: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar  1 00:22:49.271: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up
R1(config-if)#
*Mar  1 00:23:00.907: %DHCP-6-ADDRESS_ASSIGN: Interface FastEthernet0/0 assigned DHCP address 10.1.1.11, mask 255.255.255.0, hostname R1

    r1#show ip route
Default gateway is 10.1.1.1

Host               Gateway           Last Use    Total Uses  Interface
ICMP redirect cache is empty
    r1#ping 10.1.1.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.1.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 72/272/1076 ms

3、查看命令

(1)在服务器上查看哪些地址分配给了哪些主机: 
  R2#show ip dhcp binding 
    
 (2)查看DHCP地址池信息
 R2#show ip dhcp pool

Pool ccie1 :
 Utilization mark (high/low)    : 100 / 0
 Subnet size (first/next)       : 0 / 0
 Total addresses                : 254        #地址池总共IP数
 Leased addresses               : 1          #已分配的IP数
 Pending event                  : none
 1 subnet is currently in the pool :
 Current index        IP address range                    Leased addresses
 10.1.1.12            10.1.1.1         - 10.1.1.254        1

Pool ccie2 :
 Utilization mark (high/low)    : 100 / 0
 Subnet size (first/next)       : 0 / 0
 Total addresses                : 254
 Leased addresses               : 0
 Pending event                  : none
 1 subnet is currently in the pool :
 Current index        IP address range                    Leased addresses
 20.1.1.1             20.1.1.1         - 20.1.1.254        0
R2#

(3)debug 信息
R2#debug ip dhcp server events     #查看DHCP服务器发生的事件
R2#clear ip dhcp binding *         #清除DHCP所有绑定条目

(4)显示DHCP服务器的统计信息
R2#show ip dhcp server statistics

wKioL1Ztek-TjbkJAAEs2XP9EMI452.png

4、分析

    查看DHCP  Client 会看到接口 F0/0 的IP  地址为10.1.1.11 ,并且产生一条指向 10.1.1.1 的默认路由(换成PC 就会变成网关是10.1.1.1),路由器并不需要得到DNS。 
    在这里,DHCP  Server 上明明配了两个地址池,网段分别为 10.1.1.0/24 和 20.1.1.0/24,为什么客户端向服务器请求地址的时候,服务器就偏偏会把10.1.1.0/24 网段的地址发给客户,而不会错把20.1.1.0/24 网段的地址发给客户呢。这是因为DHCP服务器从哪个接口收到DHCP 请求,就只能向客户端发送地址段和接收接口地址相同的网段,如果不存在相同网段,就会丢弃请求数据包。图中接收接口地址为10.1.1.1, 而地址池ccie1  中的网段10.1.1.0/24 正好和接收接口是相同网段,所以向客户端发送了IP 地址10.1.1.11。


实验二:DHCP中继代理

    在一个大型的网络中,可能会存在着多个子网。DHCP客户机是通过广播消息来获得IP地址,但广播消息是不能跨越子网的。因此,如果DHCP客户机和服务器在不同的子网,那客户机还能不能向服务器申请IP地址呢?这就要用到DHCP中继代理。安装了DHCP中继代理的计算机称为DHCP中继代理服务器,它承担不同子网间的DHCP客户机和服务器的通信任务。 

配置DHCP Relay:

    由于路由器不能转发“255.255.255.255”的广播,但是很多服务(如DHCP和TFTP等)的客户端请求都是以泛洪广播的方式发起的,我们不可能在每个网点都设置这样的服务器,但是Cisco可以通过使用帮助地址,路由器可以被配置为接受对UDP服务的广播请求,然后将之以单点传送(单播)的方式发给某个具体的IP地址,或者以定向广播的形式向某个网段转发这些请求,这就是Relay(中继)。

wKioL1ZtfbuDQxO7AAFRGejY_bI813.png

    如图中所示,当R1 的接口配置为DHCP 获得地址后,那么将从F0/0 发出目的地为255.255.255.255 的广播请求包,如果R2 为DHCP 服务器,便会响应客户端R1, 但如果它不是DHCP 服务器,R2 收到此广播包后便默认丢弃该请求包。

    如果真正的 DHCP 服务器是R4,R1  的广播包又如何能到达R4 这台服务器呢,R4 又如何向R1 客户端发送正确的IP 地址呢? 我们知道路由器是不能够转发广播的,因此,除非能够让R2 将客户端的广播包单播发向 R4 这台服务器。我们的做法就是让R2 将广播包通过单播继续前转到R4 这台服务器,这就称为DHCP 中继,Cisco通过 ip help-address 功能来实现。

1、配置R2, DHCP 中继

(1)配置接口IP地址
R2#config t
Enter configuration commands, one per line.  End with CNTL/Z.
R2(config)#int f0/0
R2(config-if)#ip addr 10.1.1.1 255.255.255.0
R2(config-if)#no shut
R2(config-if)#exit
R2(config)#int f0/1
R2(config-if)#ip addr 23.1.1.2 255.255.255.0
R2(config-if)#no shut
R2(config-if)#end

#在R2上只要配置路由,使R1能和R4通信
Router(config)#ip route 34.1.1.0 255.255.255.0 23.1.1.3

(2)配置R2将 DHCP 广播包前转到 34.1.1.4 
注:IP help-address 功能默认能够前转DHCP 协议,所以无需额外添加。 
   R2(config)#int f0/0 
   R2(config-if)#ip helper-address 34.1.1.4    #配置帮助地址,用于完成DHCP Relay

2、配置 R3

R3(config)#int f0/1
R3(config-if)#ip addr 23.1.1.3 255.255.255.0
R3(config-if)#no shut
R3(config-if)#exit
R3(config)#int f0/0
R3(config-if)#ip addr 34.1.1.3 255.255.255.0
R3(config-if)#no shut
R3(config-if)#exit

#在R3上只要配置路由,使R1能和R4通信
R3(config)#ip route 10.1.1.0 255.255.255.0 23.1.1.2

注: 此外 R3 无需做其他特殊配置!

3、配置DHCP Server  R4

(1)配置接口IP地址
R4(config)#int f0/0
R4(config-if)#ip addr 34.1.1.4 255.255.255.0
R4(config-if)#no shut
R4(config-if)#exit

(2)开启DHCP功能 
R4(config)#service dhcp 
(3)配置DHCP 地址池 
R4(config)#ip dhcp pool ccie1            #地址池名为ccie1 
R4(dhcp-config)#network 10.1.1.0 255.255.255.0 #可供客户端使用的地址段 
R4(dhcp-config)#default-router 10.1.1.1         #网关 
R4(dhcp-config)#exit
R4(config)#ip dhcp pool ccie2             #地址池名为ccie1 
R4(dhcp-config)#network 34.1.1.0 255.255.255.0 #可供客户端使用的地址段 
R4(dhcp-config)#default-router 34.1.1.4         #网关
R4(dhcp-config)#exit 
(4)去掉不提供给客户端的地址 
R4(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 #移除10.1.1.1到10.1.1.10 
R4(config)#ip dhcp excluded-address 34.1.1.1  34.1.1.10 #移除34.1.1.1到34.1.1.10 
(4)配置正确地址池的路由 
R4(config)#ip route 10.1.1.0 255.255.255.0 34.1.1.3
R4(config)#ip route 23.1.1.0 255.255.255.0 34.1.1.3

4、配置DHCP client  R1

(1)路由器模拟PC
    r1(config)#no ip routing
(2)配置接口使用DHCP
    r1(config)#int f0/0 
    r1(config-if)#ip address dhcp 
    r1(config-if)#no shut
    R1(config-if)#
    R1(config-if)#
*Mar  1 00:28:04.351: %DHCP-6-ADDRESS_ASSIGN: Interface FastEthernet0/0 assigned DHCP address 10.1.1.11, mask 255.255.255.0, hostname R1

(3)配置完成之后我们可以在R1上sh ip int bri可以看到:
    R1#show ip int bri
    Interface                  IP-Address      OK? Method Status                Protocol
    FastEthernet0/0            10.1.1.11       YES DHCP   up
    
##当把端口down掉然后重新启用的时候,IP地址会换一个。


    查看DHCP Client 会看到R1接口F0/0 的IP 地址为10.1.1.11,那么DHCP 服务器R4 又是根据什么来判断出客户端需要的是哪个网段的IP 地址呢,为什么还是没有错把 34.1.1.0/24 网段的地址发给客户呢。不是说服务器从哪个接口收到请求,就把这个 接口相同网段的地址发给客户端吗?按照之前的理论,应该是发送34.1.1.0/24 的地址给客户啊。

    在这里,能够指导服务器发送正确IP 地址给客户端,是因为有一个被称为option 82 的选项,这个选项只要DHCP 请求数据包被中继后便会自动添加,此选项,中继路由器会在里面的giaddr 位置写上参数,这个参数,就是告诉服务器,客户端需要哪个网段的IP地址才能正常工作。中继路由器从哪个接口收到客户的DHCP请求,就在option 82 的giaddr 位置写上该接收接口的IP 地址,然后服务器根据giaddr 位置上的IP 地址,从地址池中选择一个与该IP 地址相同网段的地址给客户,如果 没有相应地址池,则放弃响应,所以,服务器R4 能够正确发送10.1.1.0/24  的地址给客户,正是因为R2 在由于IP help-address 的影响下,将giaddr  的参数改成了自己接收接口的地址,即将giaddr 参数改成了10.1.1.1,通过debug 会看到如下过程: 
*Mar100:28:36.666: DHCPD: setting giaddr to 10.1.1.1. 
*Mar100:28:36.666HCPD:BOOTREQUESTfrom0063.6973.636f.2d30.3031.322e. 
6439.6639.2e63.3638.302d.4661.302f.30 forwarded to 34.1.1.4. 
    从上面debug 信息可以看到R2 是将giaddr改成 10.1.1.1 后发中继发向34.1.1.4 的,需要知道的是,经过中继后发来的DHCP 请求包如果giaddr 位置不是某个IP 地 址而是0.0.0.0 的话,服务器是丢弃该请求而不提供IP 地址的。 
注:当服务器上存在10.1.1.0/24 网段的地址池时,服务器要将该地址池发送给客户, 就必须存在到达10.1.1.0 网段的路由(默认路由也行),并且客户端必须位于该路由的方向,
如果方向不对,该地址池也是不能够发给客户使用的。


实验三:不同VLAN,分配不同地址

wKioL1Zu1oqw6TToAAHpX2BVWUo251.png

    如图3 中所示,两个DHCP 客户端分别位于交换机上两个不同的VLAN,交换机上的VLAN 接口将作为他们的网关,R3 是DHCP 服务器,这两个客户端必须得到不同网段的地址,否则无法与外网通信,在这种情况下,服务器R3 也必须正确为R1 分配10.1.1.0/24 网段的地址,必须为R2 分配20.1.1.0/24 的地址,配置如下: 
1.配置DHCP Server  : R3

(1)配置接口IP
    R3(config)#int f0/0
    R3(config-if)#ip addr 30.1.1.3 255.255.255.0
    R3(config-if)#no shut
    R3(config-if)#exit
(2)开启DHCP 功能 
   R3(config)#service dhcp 
(3)配置DHCP 地址池 
     R3(config)#ip dhcp pool ccie1         #地址池名为ccie1 
     R3(dhcp-config)#network 10.1.1.0 255.255.255.0  #可供客户端使用的地址段 
     R3(dhcp-config)#default-router 10.1.1.1    #网关 
     R3(dhcp-config)#exit
     R3(config)#ip dhcp pool ccie2         #地址池名为ccie2 
     R3(dhcp-config)#network 20.1.1.0 255.255.255.0  #可供客户端使用的地址段 
     R3(dhcp-config)#default-router 20.1.1.1     #网关 
     R3(dhcp-config)#exit
(4)去掉不提供给客户端的地址 
 R3(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 #移除10.1.1.1 到10.1.1.10 
 R3(config)#ip dhcp excluded-address 20.1.1.1 20.1.1.10 #移除20.1.1.1 到20.1.1.10 
(5)配置正确地址池的路由 
     R3(config)#ip route 10.1.1.0 255.255.255.0 30.1.1.1 
     R3(config)#ip route 20.1.1.0 255.255.255.0 30.1.1.1

2.配置交换机 

(1)配置相应接口信息 
   sw(config)#vlan 10 
   sw(config-vlan)#exit 
   sw(config)#vlan 20 
   sw(config-vlan)#exit 
   sw(config)#int f0/1 
   sw(config-if)#switchport mode access 
   sw(config-if)#switchport access vlan 10 
   sw(config-if)#exit 
   sw(config)#int f0/2 
   sw(config-if)#switchport mode access 
   sw(config-if)#switchport access vlan 20 
   sw(config-if)#exit 
   sw(config)#int vlan 10 
   sw(config-if)#ip address 10.1.1.1 255.255.255.0 
   sw(config-if)#ip helper-address 30.1.1.3          单播前转DHCP 广播到30.1.1.3 
   sw(config-if)#exit 
   sw(config)#int vlan 20 
   sw(config-if)#ip address 20.1.1.1 255.255.255.0 
   sw(config-if)#ip helper-address 30.1.1.3          单播前转DHCP 广播到30.1.1.3 
   
###===========================华丽的分割线==============================###
由于我使用的GNS3模拟器,无法模拟交换机。这里利用路由器加上交换模块做实验。
(1)配置接口IP地址
sw(config)#int f0/3
sw(config-if)#ip addr 30.1.1.1 255.255.255.0
sw(config-if)#no shut
sw(config-if)#exit

(2)配置VLAN, 由于用路由器模拟, 只能使用vlan database 模式创建VLAN;已不再建议使用该方式
sw#vlan database                #进入vlan数据库模式
sw(vlan)#vlan 10 name vlan10    #创建vlan3并对其命名
VLAN 10 added:
    Name: vlan10
sw(vlan)#vlan 20 name vlan20
VLAN 20 added:
    Name: vlan20
sw(vlan)#apply                  #应用配置,使生效
APPLY completed.
sw(vlan)#exit                   #退出vlan database模式
APPLY completed.
Exiting....

#使用show vlan-switch来查看VLAN信息
sw#show vlan-switch

(3)将端口绑定到VLAN
#=============
Switch(config)#int f0/3
Switch(config-if)#switchport mode access    #将端口设置为access模式
Switch(config-if)#switchport access vlan 3  #将该端口绑定到vlan3
#=============

sw#config t
sw(config)#interface range f1/0 - 4
sw(config-if-range)#switchport mode access
sw(config-if-range)#switchport access vlan 10
sw(config-if-range)#exit

sw(config)#interface range f1/5 - 9
sw(config-if-range)#switchport mode access
sw(config-if-range)#switchport access vlan 20
sw(config-if-range)#end

sw#show vlan-switch
VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Fa1/10, Fa1/11, Fa1/12, Fa1/13
                                                Fa1/14, Fa1/15
10   vlan10                           active    Fa1/0, Fa1/1, Fa1/2, Fa1/3
                                                Fa1/4
20   vlan20                           active    Fa1/5, Fa1/6, Fa1/7, Fa1/8
                                                Fa1/9
1002 fddi-default                     active
1003 token-ring-default               active
1004 fddinet-default                  active
1005 trnet-default                    active


(4)配置VSI接口
sw(config)#int vlan 10 
sw(config-if)#ip address 10.1.1.1 255.255.255.0 
sw(config-if)#ip helper-address 30.1.1.3          #单播前转DHCP 广播到30.1.1.3 
sw(config-if)#exit 
sw(config)#int vlan 20 
sw(config-if)#ip address 20.1.1.1 255.255.255.0 
sw(config-if)#ip helper-address 30.1.1.3          #单播前转DHCP 广播到30.1.1.3
sw(config-if)#exit

3.配置DHCP Client 

(1)配置R1 
R1(config)#int f0/0
R1(config-if)#ip addr dhcp
R1(config-if)#no shut
R1(config-if)#
*Mar  1 00:01:24.371: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar  1 00:01:25.371: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up
R1(config-if)#
*Mar  1 00:01:37.335: %DHCP-6-ADDRESS_ASSIGN: Interface FastEthernet0/0 assigned DHCP address 10.1.1.11, mask 255.255.255.0, hostname R1 

(2)配置R2 
R2(config)#int f0/0
R2(config-if)#ip addr dhcp
R2(config-if)#no shut
R2(config-if)#
*Mar  1 00:02:13.703: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar  1 00:02:14.703: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up
R2(config-if)#
*Mar  1 00:02:26.487: %DHCP-6-ADDRESS_ASSIGN: Interface FastEthernet0/0 assigned DHCP address 20.1.1.11, mask 255.255.255.0, hostname R2

 
4.查看结果: 
  按上述配置完之后,客户端R1 的F0/0 便能够收到地址10.1.1.11,客户端R2 便 能够收到地址20.1.1.11,然后就可以全网通信。在上述的情况下,服务器R3  能够正确为R1 分配10.1.1.0/24 网段的地址,能够正确为R2 分配20.1.1.0/24 网段的地址,同样也是因为交换机在收到R1 的DHCP 广播包后,将giaddr 的参数改成了10.1.1.1,收到R2 的广播包后,将giaddr  的参数改成了20.1.1.1,所以最后服务器R3 能够根据 giaddr=10.1.1.1 的包分配10.1.1.0/24 的地址,根据giaddr=20.1.1.1 的包分配20.1.1.0/24 的地址。


根据上述几种情况总结分析可以得出, DHCP 分配地址的机制是根据 与 DHCP client 所在网段的网关】作为依据,从dhcp定义的地址池中,找到相同网段的地址分配给client。


5. IP 与MAC 地址绑定 
    在配置DHCP 时,地址池中除了移除掉的IP 地址之外,所有的地址都会按顺序分配给客户,所以客户机得到的 IP  地址是无法固定的,有时需要每次固定为某些PC 分配相同的IP 地址,那么这时就可以配置DHCP 服务器以静态将IP 地址和某些MAC 绑定,只有相应的MAC 地址才能获得相应的IP 地址。在Cisco 设备上静态将 IP 与MAC 绑定的方法为,需要将某个IP 地址绑定给MAC 地址,就为该IP 地址单独创建地址池,称为host pool,地址池中需要注明IP 地址和掩码位数,并且附上一个MAC 地址,以后这个IP 地址就只分配给这个MAC 地址,所以host pool 只能有一个IP 地址和一个MAC 地址,如果需要为多个客户绑定IP 和MAC,就必须得单独为每个客户都配置各自的host   pool,还要注意的是,在host   pool 中,MAC 地址的表示方法和平常不一样,比如一个主机网卡的MAC 地址为aabb.ccdd.eeff,在地址池中,需要在前面加上01(01 表示为以太网类型),结果为01aa.bbcc.ddee.ff 

1.配置host pool: 

(1)配置pool 名 
    r1(config)#ip dhcp pool ccie 
(2)配置IP 地址 
    r1(dhcp-config)#host 10.1.1.100 /24 
(3)配置与该IP 地址对应的MAC 地址 
    r1(dhcp-config)#client-identifier 01aa.bbcc.ddee.ff

2.查看配置结果: 

(1)查看服务器地址分配状态 
   r1#sh ip dhcp binding 
   Bindings from all pools not associated with VRF: 
   IP address    Client-ID/      Lease expiration   Type 
           Hardware address/ 
           User name 
   10.1.1.100    01aa.bbcc.ddee.ff   Infinite       Manual 
   r1#

说明:从以上结果可以看出,IP 地址10.1.1.100 已经手工与MAC 地址aabb.ccdd.eeff 做了绑定,以后只要MAC 地址为aabb.ccdd.eeff 的客户端请求IP 地址时,才能获得 IP 地址10.1.1.100。 


DHCP 安全ARP

wKiom1ZvUDujqfA-AAGVF0nn7ZQ946.png


Cisco 设计的DHCP 安全ARP 也许不是绝对的安全,但也起到了一定的作用,原本设计为一个需要计费的公共热点PVLAN(公共无线场所),如图4  中所示,R3 为DHCP 服务器,为付费的R1 提供正确IP 地址以提供网络服务,当服务器R3 为客户端R1 提供IP 地址 10.1.1.2 之后,就已经记住了它的MAC 地址,在正常情况下,如果R1 退出,服务器是不知道的,并且当网络中有欺骗者接入后,也可冒充10.1.1.2 这个地址进行上网,当然R1 和R2  的MAC 地址肯定是不一样的,如果这时服务器R3 由于自动更新ARP 表的MAC 地址,就能够顺利让R2 上网。 
   基于上述原因,需要在服务器R3 和客户端R1 之间提供某种安全机制,即服务器定期ARP 讯问10.1.1.2 是否还存在,在讯问时,只有R1 能够回答。 
   在完成这种机制,需要两个feature 来支持,第一个是Update Arp,在地址池模式下开启,这个feature  便是定期讯问网络中DHCP 客户端的; 第二个是Authorized ARP  (ARP 授权),只能在以太网接口下开启,功能是禁止该接口下通过ARP自动更新和学习MAC 地址,这样一来,接口下将不能有手动配置IP 的设备接入,因为手工配置IP 接入后,服务器不会更新自己的ARP  表,也就无法完成到新设备的二层MAC 地址封装,也就无法和新设备进行通信,只有合法的DHCP 客户端才能正常通信,所以,如果为远程客户端分配IP 地址,就无法做这样的保护,并且到远程客户端的下一跳必须是自己的客户端,因为如果不是,是无法通信的,因为ARP 不存在到它的条目。
 
1.配置安全ARP: 

(1)开启DHCP 功能 
   R3(config)#service dhcp 
(2)配置DHCP 地址池 
   R3(config)#ip dhcp pool ccie1       地址池名为ccie1 
   R3(dhcp-config)#network 10.1.1.0 255.255.255.0 可供客户端使用的地址段 
   R3(dhcp-config)#default-router 10.1.1.1 网关 
   R3(dhcp-config)#update arp          开启定期ARP 讯问 
(3)去掉不提供给客户端的地址 
   R3(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 移除10.1.1.1 到10.1.1.10 
(4)在接口下开启Authorized ARP 
     R3(config)#int f0/0 
     R3(config-if)#Router(config-if)# arp authorized 禁止动态更新ARP 
     R3(config-if)# arp timeout 60      60 秒客户无应答则删除ARP 条 目

 说明:通过以上配置之后,当DHCP 客户端从服务器获得IP 地址后,服务器便会定期查讯该IP 地址,如果60 秒没有回答,便从ARP 表中删除该条目。


DHCP Snooping 功能与实例详解

一、采用DHCP服务的常见问题
    架设DHCP服务器可以为客户端自动分配IP地址、掩码、默认网关、DNS服务器等网络参数,简化了网络配置,提高了管理效率。但在DHCP服务的管理上存在一些问题,常见的有:

  • DHCP Server的冒充

  • DHCP Server的DOS***,如DHCP耗竭***

  • 某些用户随便指定IP地址,造成IP地址冲突
      

1、DHCP Server的冒充
      由于DHCP服务器和客户端之间没有认证机制,所以如果在网络上随意添加一台DHCP服务器,它就可以为客户端分配IP地址以及其他网络参数。只要让该DHCP服务器分配错误的IP地址和其他网络参数,客户端通过私设的DHCP服务器拿到一个非法的地址,最终导致PC无法上网,那就会对网络造成非常大的危害。

wKiom1ZxXDDgSK9QAAAo9xlICXw479.png

2、DHCP Server的拒绝(DOS)服务***
    通常DHCP服务器通过检查客户端发送的DHCP请求报文中的CHADDR(也就是Client MAC address)字段来判断客户端的MAC地址。正常情况下该CHADDR字段和发送请求报文的客户端真实的MAC地址是相同的。***者可以利用伪造MAC的方式发送DHCP请求,但这种***可以使用Cisco 交换机的端口安全特性来防止。

    端口安全特性(Port Security)可以限制每个端口只使用唯一的MAC地址。但是如果***者不修改DHCP请求报文的源MAC地址,而是修改DHCP报文中的CHADDR字段来实施***,那端口安全就不起作用了。由于DHCP服务器认为不同的CHADDR值表示请求来自不同的客户端,所以***者可以通过大量发送伪造CHADDR的DHCP请求,导致DHCP服务器上的地址池被耗尽,从而无法为其他正常用户提供网络地址,这是一种DHCP耗竭***。DHCP耗竭***可以是纯粹的DOS***,也可以与伪造的DHCP服务器配合使用。当正常的DHCP服务器瘫痪时,***者就可以建立伪造的DHCP服务器来为局域网中的客户端提供地址,使它们将信息转发给准备截取的恶意计算机。甚至即使DHCP请求报文的源MAC地址和CHADDR字段都是正确的,但由于DHCP请求报文是广播报文,如果大量发送的话也会耗尽网络带宽,形成另一种拒绝服务***。
3、客户端随意指定IP地址
   客户端并非一定要使用DHCP服务,它可以通过静态指定的方式来设置IP地址。如果随便指定的话,将会大大提高网络IP地址冲突的可能性。


二、DHCP Snooping技术介绍
  DHCP监听(DHCP Snooping)是一种DHCP安全特性。Cisco交换机支持在每个VLAN基础上启用DHCP监听特性。通过这种特性,交换机能够拦截第二层VLAN域内的所有DHCP报文。一般部署在接入层交换机上面。

在部署DHCP Snooping环境中(部署在交换机上),将交换机端口划分为两种安全级别:

  ●trust  非信任端口:通常为连接终端设备的端口,如PC,网络打印机等
  ●untrust 信任端口:连接合法DHCP服务器的端口或者连接汇聚交换机的上行端口

  只有trust接口上收到的来自DHCP server的报文(如DHCPOFFER, DHCPACK, DHCPNAK, 或者DHCPLEASEQUERY)才会被放行,相反,在untrust接口上收到的来自DHCP server的报文将被过滤掉,这样一来就可以防止非法的DHCPserver接入。

  通过开启DHCP监听特性,交换机限制用户端口(非信任端口)只能够发送DHCP请求,丢弃来自用户端口的所有其它DHCP报文,例如DHCP Offer报文等。而且,并非所有来自用户端口的DHCP请求都被允许通过,交换机还会比较DHCP 请求报文的(报文头里的)源MAC地址和(报文内容里的)DHCP客户机的硬件地址(即CHADDR字段),只有这两者相同的请求报文才会被转发,否则将被丢弃。这样就防止了DHCP耗竭***。
  信任端口可以接收所有的DHCP报文。通过只将交换机连接到合法DHCP服务器的端口设置为信任端口,其他端口设置为非信任端口,就可以防止用户伪造DHCP服务器来***网络。DHCP监听特性还可以对端口的DHCP报文进行限速。通过在每个非信任端口下进行限速,将可以阻止合法DHCP请求报文的广播***。
wKiom1ZxYSqipnMbAAArdHQwZuM317.png


DHCP监听还有一个非常重要的作用: 就是建立一张DHCP监听绑定表(DHCP Snooping Binding)。一旦一个连接在非信任端口( untrust )的客户端获得一个合法的DHCP Offer,交换机就会自动在DHCP监听绑定表里添加一个绑定条目,内容包括了该非信任端口的客户端IP地址、MAC地址、端口号、VLAN编号、租期等信息。如: 

Switch#show ip dhcp snooping binding

这张DHCP监听绑定表为进一步部署IP源防护(IPSG)和动态ARP检测(DAI)提供了依据。

DHCP snooping配合IP源防护(IPSG)和动态ARP检测(DAI)绝对二层最佳安全实践。

说明:

I. 非信任端口只允许客户端的DHCP请求报文通过,这里只是相对于DHCP报文来说的。其他非DHCP报文还是可以正常转发的。这就表示客户端可以以静态指定IP地址的方式通过非信任端口接入网络。由于静态客户端不会发送DHCP报文,所以DHCP监听绑定表里也不会有该静态客户端的记录。
  信任端口的客户端信息不会被记录到DHCP监听绑定表里。如果有一客户端连接到了一个信任端口,即使它是通过正常的DHCP方式获得IP地址,DHCP监听绑定表里也不有该客户端的记录。如果要求客户端只能以动态获得IP的方式接入网络,则必须借助于IPSG和DAI技术。

II.交换机为了获得高速转发,通常只检查报文的二层帧头,获得目标MAC地址后直接转发,不会去检查报文的内容。而DHCP监听本质上就是开启交换机对DHCP报文的内容部分的检查,DHCP报文不再只是被检查帧头了。

III. DHCP监听绑定表不仅用于防御DHCP***,还为后续的IPSG和DAI技术提供动态数据库支持。

IV. DHCP监听绑定表里的Lease列就是每个客户端对应的DHCP租约时间。当客户端离开网络后,该条目并不会立即消失。当客户端再次接入网络,重新发起DHCP请求以后,相应的条目内容就会被更新。如上面的00F.1FC5.1008这个客户端原本插在Fa0/1端口,现在插在Fa0/3端口,相应的记录在它再次发送DHCP请求并获得地址后会更新为:

Switch#show ip dhcp snooping binding
or
Switch#show ip source binding

V.当交换机收到一个DHCPDECLINE或DHCPRELEASE广播报文,并且报文头的源MAC地址存在于DHCP监听绑定表的一个条目中。但是报文的实际接收端口与绑定表条目中的端口字段不一致时,该报文将被丢弃。

    ●DHCPRELEASE报文:此报文是客户端主动释放IP 地址(如Windows 客户端使用ipconfig/release),当DHCP服务器收到此报文后就可以收回IP地址,分配给其他的客户端了
    ●DHCPDECLINE报文:当客户端发现DHCP服务器分配给它的IP地址无法使用(如IP地址发生冲突)时,将发出此报文让DHCP服务器禁止使用这次分配的IP地址。

VI. DHCP监听绑定表中的条目可以手工添加。

VII. DHCP监听绑定表在设备重启后会丢失,需要重新绑定,但可以通过设置将绑定表保存在flash或者tftp/ftp服务器上,待设备重启后直接读取,而不需要客户端再次进行绑定

VIII. 当前主流的Cisco交换机基本都支持DHCP Snooping功能。


三、DHCP Option 82
  当DHCP服务器和客户端不在同一个子网内时,客户端要想从DHCP服务器上分配到IP地址,就必须由DHCP中继代理(DHCP Relay Agent)来转发DHCP请求包。DHCP中继代理将客户端的DHCP报文转发到DHCP服务器之前,可以插入一些选项信息,以便DHCP服务器能更精确的得知客户端的信息,从而能更灵活的按相应的策略分配IP地址和其他参数。这个选项被称为:DHCP relay agent information option(中继代理信息选项),选项号为82,故又称为option 82,相关标准文档为RFC3046。

CISCO注释:The DHCP option-82 feature is supported only when DHCP snooping is globally enabled and on the VLANs to which subscriber devices using this feature are assigned.

 wKioL1ZxatSD1d57AAAyhUgy9Ro634.png 

基本的交互过程如下:

  1. DHCP client广播DHCP request

  2. 交换机收到DHCP request,它在报文中插入option82信息(当然,要你先做了相应的配置后),在插入的信息中,remote-ID suboption是该交换机的MAC;circuit-ID suboption是收到DHCP request报文的接口ID。

  3. 如果交换机上还部署了DHCP relay,那么交换机将中继地址也添加进DHCP报文中

  4. 交换机将携带了option82信息的DHCP报文转发给DHCP服务器

  5. DHCP服务器接收到了DHCP报文,如果这台服务器是能够识别option82的,那么它将根据option82中携带的信息,来为客户端分配IP地址,以及选择相应的策略。然后服务器回应一个DHCP包,其中也包含option82信息。

  6. 交换机收到该DHCP报文后,发现报文的option82信息正是从本地始发,交换机将option82信息移除后,将DHCP报文转发给DHCP client。


在上述事件的发生过程中,下面字段的内容不会发生改变:

  • Circuit-ID suboption fields

      –Suboption type

      –Length of the suboption type

      –Circuit-ID type

      –Length of the circuit-ID type

  • Remote-ID suboption fields

      –Suboption type

      –Length of the suboption type

      –Remote-ID type

      –Length of the remote-ID type

  In the port field of the circuit-ID suboption, the port numbers start at 3.也就是说这个字段中,端口号是从3开似乎的,第一个端口号就是3,依次类推。例如,一个带了SFP插槽的24×××换机,port3是fast x/0/1,port4是fast x/0/2,以此类推,port 27就是sfq模块的 x/0/1口。其中x为堆叠成员编号。


  Option 82是对DHCP选项的扩展应用。选项82只是一种应用扩展,是否携带选项82并不会影响DHCP原有的应用。另外还要看DHCP服务器是否支持选项82。不支持选项82的DHCP服务器接收到插入了选项82的报文,或者支持选项82的DHCP服务器接收到了没有插入选项82的报文,这两种情况都不会对原有的基本的DHCP服务造成影响。要想支持选项82带来的扩展应用,则DHCP服务器本身必须支持选项82以及收到的DHCP报文必须被插入选项82信息

  从非信任端口收到DHCP请求报文,不管DHCP服务器和客户端是否处于同一子网,开启了DHCP监听功能的Cisco交换机都可以选择是否对其插入选项82信息。默认情况下,交换机将对从非信任端口接收到的DHCP请求报文插入选项82信息

当一台开启DHCP监听的汇聚交换机和一台插入了选项82信息的边界交换机(接入交换机)相连时:

  ●如果边界交换机是连接到汇聚交换机的信任端口,那么汇聚交换机会接收从信任端口收到的插入选项82的DHCP报文信息,但是汇聚交换机不会为这些信息建立DHCP监听绑定表条目。
  ●如果边界交换机是连接到汇聚交换机的非信任端口,那么汇聚交换机会丢弃从该非信任端口收到的插入了选项82的DHCP报文信息。但在IOS 12.2(25)SE版本之后,汇聚交换机可以通过在全局模式下配置一条ip dhcp snooping information allow-untrusted命令。这样汇聚交换机就会接收从边界交换机发来的插入选项82的DHCP报文信息,并且也为这些信息建立DHCP监听绑定表条目。
  在配置汇聚交换机下联口时,将根据从边界交换机发送过来的数据能否被信任而设置为信任或者非信任端口。

  一台支持DHCP snooping的交换机,如果在其untrust接口上,收到来自下游交换机发送的、且带有option82的DHCP报文,则默认的动作是丢弃这些报文。如果该交换机开启了DHCP snooping并且带有option82的DHCP报文是在trusted接口上收到的,则交换机接收这些报文,但是不会根据报文中包含的相关信息建立DHCP bingding databse表项。

如果交换机确实通过一个untrust接口连接了下游交换机,并且希望放行该接口收到的、下游交换机发送出来的带有option82的DHCP报文,则可使用全局命令:ip dhcp snooping information option allow-untrusted,同时由于是通过untust接口收到的DHCP报文,因此会根据侦听的结果创建DHCP snooping binding database表项。


配置示例:

DHCP 监听(DHCP Snooping)

wKioL1ZvUI7CXnuRAAGo3FXImR8471.png



如图5  中所示,客户端R1 只有正确从服务器R3  中获得10.1.1.0/24  网段的IP地址才能够正确上网,如果当网络中出现另外一台错误的DHCP 服务器(图中R2), R2 向客户端R1 发出 20.1.1.0/24  的地址,那么将导致R1 网络中断,在这样的情况下, 就需要禁止不合法的DHCP 服务器向网络中提供DHCP 服务,这就需要DHCP 监听 (DHCP Snooping)。DHCP Snooping 是在交换机上完成的,如上图中,只要告诉交换机,只有F0/3 发来的DHCP 应答地址才转发给客户端,其它接口发来的应答地址统统被丢弃。要做到这一点,就要告诉交换机,F0/3 接口是它可能信任的DHCP 地址, 其它接口都是不可信的,不能提供DHCP 应答,那么在实现这个功能时,就需要将交换机上的接口分为可信任接口和不可信任接口两种,默认交换机全为不可信任接口,也就是说交换机开启DHCP Snooping 之后,没有任何一个接口上的DHCP 服务器能提供服务。在交换机上配置DHCP  Snooping 时,必须指明在哪个VLAN 上进行 
监听,其它没有监听的VLAN 不受上述规则限制。 

1.交换机上配置DHCP Snooping 

注:交换机上所有接口全部划入VLAN1 
(1)在交换机上开启DHCP Snooping 
   sw(config)#ip dhcp snooping       开启DHCP Snooping 
  sw(config)#ip dhcp snooping vlan 1   在交换机上启用DHCP Snooping 
(2)将相应接口变为信任接口(默认全部为不可信) 
sw(config-if)#ip dhcp snooping trust

2.查看命令: 

(1)查看dhcp snooping 
 Sw#sh ip dhcp snooping

说明:通过以上配置之后,只有交换机F0/3 接口上(信任接口)的设备能够应答DHCP 请求,而其它所有接口,比如R2 过来的DHCP 应答是会被丢弃的。但是你会发现,在这之后,R1 还是无法获得服务器R3 发来的DHCP 地址。这是因为开了DHCP Snooping 的交换机默认会产生中继效果,即将DHCP 请求包的giaddr 的参数改成0.0.0.0,交换机的这种中继效果是无法关闭的,当一个服务器收到中继后并且将giaddr 设置为0.0.0.0 而不是IP 地址的请求包时,默认是要丢弃该数据包而不作应答的,所以服务器R3 丢弃了该请求数据包。要让客户R1 能够正常收到DHCP 提供的IP 地址,就要让DHCP 服务器对即使giaddr 为0.0.0.0  的请求包也作出应答。配置如下: 

 R3(config-if)#ip dhcp relay information trusted

      最后,从上图中,如果R3 本身还不是DHCP 服务器,如果DHCP 服务器还在远程网络,需要R3 提供中继并转发该请求包到服务器的话,那么R3 除了在接口下配置  ip dhcp relay information trusted 之外,还必须配置ip helper-address,两者缺一不可。



DHCP Snooping 文章:

http://blog.sina.com.cn/s/blog_5ec353710101dy03.html

http://bbs.51cto.com/thread-1116776-1-1.html



配置Windows客户端:

PC1:ipconfig /all

PC1:ipconfig /release

PC1:ipconfig /renew


http://blog.sina.com.cn/s/blog_64d959260100yzch.html

http://bbs.51cto.com/thread-800321-1.html