最近看到大家经常由于DHCP的问题犯愁, 为了让大家更明白的了解DHCP并且会配置,特此发这个贴 
相信大家认证看完对DHCP就会了如指掌
思科DHCP全攻略 - hkdog - HKdogs zone

1.配置DHCP Server 
1)开启DHCP 功能
    r2(config)#service dhcp 
2)配置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        租期为小时分(默认为一天)
    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       租期为小时分(默认一天)
3)去掉不提供给客户端的地址
注:因为某些IP 地址不希望提供给客户端,比如网关地址,所以我们要将这些地址
从地址池中移除,这样服务器就不会将这些地址发给客户端使用。
r2(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 移除10.1.1.110.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)配置接口使用DHCP 
    r1(config)#int f0/1 
    r1(config-if)#ip address dhcp 
3.查看命令:
1)在服务器上查看哪些地址分配给了哪些主机:
    R2#Show ip dhcp binding 
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 请求,就只能向客户端发送地址段和接收接口地址相同
的网段,如果不存在相同网段,就会丢弃请求数据包。图中接收接口地址为10.1.1.1
而地址池ccie1  中的网段10.1.1.0/24正好和接收接口是相同网段,所以向客户端发
送了IP 地址10.1.1.11
DHCP 中继
思科DHCP全攻略 - hkdog - HKdogs zone


如图中所示,当R1  的接口配置为DHCP获得地址后,那么将从F0/0 发出目的
地为255.255.255.255  的广播请求包,如果R2DHCP 服务器,便会响应客户端,
但它不是DHCP  服务器,因此R2  收到此广播包后便默认丢弃该请求包。而真正的
DHCP 服务器是R4R1  的广播包又如何能到达R4 这台服务器呢,R4 又如何向R1 
客户端发送正确的IP 地址呢。
   路由器是不能够转发广播的,因此,除非能够让R2 将客户端的广播包单播发向
R4 这台服务器。我们的做法就是让R2 将广播包通过单播继续前转到R4这台服务
器,称为DHCP 中继,通过IP help-address 功能来实现。
1R2 配置
1)配置将DHCP 广播前转到34.1.1.4
注:IP help-address 功能默认能够前转DHCP 协议,所以无需额外添加。
   R2(config)#int f0/0 
   R2(config-if)#ip helper-address 34.1.1.4 
2.配置DHCP Server: 
1)开启DHCP 功能
   R4(config)#service dhcp 
2)配置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(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 网关
3)去掉不提供给客户端的地址
   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移除20.1.1.1 
20.1.1.10 
4)配置正确地址池的路由
   R4(config)#ip route 10.1.1.0 255.255.255.0 34.1.1.3 
注:R3 无需做任何配置!
3.查看结果
    查看DHCP Client 会看到接口F0/0IP 地址为10.1.1.11,那么DHCP 服务器R4 
又是根据什么来判断出客户端需要的是哪个网段的IP 地址呢,为什么还是没有错把
34.1.1.0/24 网段的地址发给客户呢。不是说服务器从哪个接口收到请求,就把这个
接口相同网段的地址发给客户端吗?按照之前的理论,应该是发送34.1.1.0/24 的地
址给客户啊。在这里,能够指导服务器发送正确IP 地址给客户端,是因为有一个被
称为Relay agent IP address的字段,这个字段只要DHCP请求数据包被中继后便会自动添加此字段,中继路由器会在里面的写上参数,这个参数,就是告诉服务器,客户端需要哪个网段的IP地址才能正常工作。中继路由器从哪个接口收到客户的DHCP请求,就在Relayagent IP address位置写上该接收接口的IP 地址,然后服务器根据Relayagent IP address位置上的IP 地址,从地址池中选择一个与该IP地址相同网段的地址给客户,如果
没有相应地址池,则放弃响应,所以,服务器R4 能够正确发送10.1.1.0/24  的地址
给客户,正是因为R2 在由于IP help-address 的影响下,将Relay agent IP address的参数改成了自己接收接口的地址,即将Relayagent IP address改成了10.1.1.1,通过抓包 会看到如下过程:

思科DHCP全攻略 - hkdog - HKdogs zone

注:当服务器上存在10.1.1.0/24 网段的地址池时,服务器要将该地址池发送给客户,
就必须存在到达10.1.1.0 网段的路由(默认路由也行),并且客户端必须位于该路由的
方向,如果方向不对,该地址池也是不能够发给客户使用的。
不同VLAN 分配不同地址
思科DHCP全攻略 - hkdog - HKdogs zone


    如图中所示,两个DHCP 客户端分别位于交换机上两个不同的VLAN,交换机
上的VLAN 接口将作为他们的网关,R3 DHCP 服务器,这两个客户端必须得到不 
同网段的地址,否则无法与外网通信,在这种情况下,服务器R3 也必须正确为R1
分配10.1.1.0/24 网段的地址,必须为R2 分配20.1.1.0/24 的地址,配置如下:
1.配置DHCP Server 
1)开启DHCP 功能
   R3(config)#service dhcp 
2)配置DHCP 地址池
     R3(config)#ip dhcp pool ccie1        地址池名为ccie1 
     R3(dhcp-config)#network 10.1.1.0255.255.255.0  可供客户端使用的地址段
     R3(dhcp-config)#default-router 10.1.1.1    网关
     R3(config)#ip dhcp pool ccie2        地址池名为ccie1 
     R3(dhcp-config)#network 20.1.1.0255.255.255.0  可供客户端使用的地址段
     R3(dhcp-config)#default-router 20.1.1.1    网关 
3)去掉不提供给客户端的地址
   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 
4)配置正确地址池的路由
     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
3.配置DHCP Client 
1)配置R1 
     r1(config)#int f0/1 
     r1(config-if)#ip address dhcp 
(2)配置R2 
    r2(config)#int f0/1 
    r1(config-if)#ip address dhcp 
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 的地址。
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 poo 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/      Leaseexpiration   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 
思科DHCP全攻略 - hkdog - HKdogs zone


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)# arp authorized 禁止动态更新ARP
     R3(config-if)# arp timeout 60     60 秒客户无应答则删除ARP 条 目
说明:通过以上配置之后,当DHCP 客户端从服务器获得IP 地址后,服务器便会定
期查讯该IP 地址,如果60 秒没有回答,便从ARP 表中删除该条目。
DHCP 监听
思科DHCP全攻略 - hkdog - HKdogs zone


如图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   在交换机上启用DHCPSnooping 
2)将相应接口变为信任接口(默认全部为不可信)
sw(config-if)#ip dhcp snooping trust 
   2.查看命令:
    1)查看dhcpsnooping 
      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 服务器对即使giaddr0.0.0.0  的请求包也作出应答。配置如
   下:
      R3(config-if)#ip dhcp relay information trusted 
      最后,从上图中,如果R3 本身还不是DHCP 服务器,如果DHCP 服务器还在远程
    网络,需要R3 提供中继并转发该请求包到服务器的话,那么R3除了在接口下配置
   ip dhcp relay information trusted 之外,还必须配置iphelper-address,两者缺一不可。