前言
网络结构复杂且存在多个不同网段时,DHCP中继服务成为必需。
DHCP中继允许位于不同网段的客户端接收到DHCP信息,获取到IP地址,简化了网络管理员的工作,提供了一种有效的方式,使得位于不同网段的客户端可以自动获取IP地址和其他网络配置信息。
这个也需要了解一定的DHCP的基础,可以看看这篇
链接: 【思科】DHCP配置和工作原理
工作原理
DHCP 报文
报文 | 作用 |
---|---|
DHCP DISCOVER | DHCP交互的第一个报文,用来寻找DHCP服务器 |
DHCP Offer | 服务器响应DHCP DISCOVER的请求,提供IP和其他配置信息 |
DHCP Request | 广播回应服务器的DHCP OFFER报文 |
DHCP ACK | 服务器对客户端的DHCP REQUEST报文的确认报文 |
过程图解
过程详解
发现阶段
在第一阶段,客户端会广播发送DHCP Discover 报文,去寻找DHCP 服务器。
由于DHCP 服务器和客户端不在同一个网段内
服务器不能直接接收到DHCP Discover 报文,就只能通过DHCP 中继进行转发。
当有多个DHCP中继时候,也要去辨认这个DHCP
Discover包经过了几个中继,那么服务器又是怎么知道该服务器位于哪个网段,我要分配哪个网段IP地址
这些疑问都需要用到hops、giaddr这两个字段
.
hops字段:经过了几个中继,每经过一个中继,就会加1,最高能经过16台中继
giaddr字段:将经过的第一个中继接口设置为接收DHCP Discover 报文的接口IP地址
在DHCP 中继上,会检查这两个字段,如下:
-
检查DHCP报文中的hops字段,如果大于16,则丢弃DHCP报文;否则,将hops字段加1(表明经过一次DHCP中继),并继续下面的操作。
-
检查DHCP报文中的giaddr字段。如果是0,将giaddr字段设置为接收DHCP Discover 报文的接口IP地址。如果不是0,则不修改该字段,继续下面的操作。
-
将DHCP报文的目的IP地址改为DHCP服务器或下一跳中继的IP地址,源地址改为中继连接客户端的接口地址,通过路由转发将DHCP报文单播发送到DHCP服务器或下一跳中继。
如果DHCP客户端与DHCP服务器之间存在多个DHCP中继,后面的中继接收到DHCP Discover 报文的处理流程同前面所述。
提供阶段
DHCP服务器接收到DHCP DISCOVER报文后
选择与报文中giaddr字段为同一网段的地址池,先会进行IP地址冲突检测
IP地址冲突检测
会发送一个ICMP包,以中继的IP地址为源IP地址,以需要分配的IP地址为目的地址 如果没有回应,就说明该IP地址可用 如果有回应,就说明该地址被使用,继续选择下一个地址
它会广播发送ARP去询问该地址是否有人用 如果有回应,就说明该地址被使用,继续选择下一个地址 如果没有回应该广播ARP的话,就开始为客户端分配IP地址等参数 然后向giaddr字段标识的DHCP中继单播发送DHCP
OFFER报文。
DHCP中继收到DHCP OFFER报文后,会进行如下处理:
检查报文中的giaddr字段,如果不是接口的地址,则丢弃该报文;否则,继续下面的操作。
DHCP中继检查报文的广播标志位。
如果广播标志位为1,则将DHCP OFFER报文广播发送给DHCP客户端;
否则将DHCP OFFER报文单播发送给DHCP客户端
选择阶段
如果有多个DHCP服务器向DHCP客户端回应DHCP Offer报文,则DHCP客户端一般只接收第一个收到的DHCP Offer报文,然后以广播方式发送DHCP Request报文,该报文中包含客户端想选择的DHCP服务器标识符和客户端IP地址。
DHCP客户端广播发送DHCP Request报文通知所有的DHCP服务器,它将选择某个DHCP服务器提供的IP地址,其他DHCP服务器可以重新将曾经分配给客户端的IP地址分配给其他客户端。
确认阶段
当DHCP服务器收到DHCP客户端发送的DHCP Request报文后,DHCP服务器回应DHCP ACK报文,表示DHCP Request 报文中请求的IP地址分配给客户端使用。
当DHCP服务器收到DHCP客户端发送的DHCP Request报文后,如果DHCP服务器由于某些原因(例如协商出错或者由于发送Request过慢导致服务器已经把此地址分配给其他客户端)无法分配DHCP Request报文中的IP地址,则发送DHCP NAK报文作为应答,通知DHCP客户端无法分配此IP地址。DHCP客户端需要重新发送DHCP Discover报文来申请新的IP地址。
过程的报文交换
配置
拓扑
R1
[DHCP-Server]dhcp enable ## 这个千万不要忘记啦,要记得打开DHCP功能哦
[DHCP-Server]int g0/0/0
[DHCP-Server-GigabitEthernet0/0/0]ip address 192.168.100.254 24 ##配置IP地址
==================================== 创建DHCP 地址池 ========================================
[DHCP-Server]ip pool vlan10
[DHCP-Server-ip-pool-vlan10]network 192.168.10.0 mask 24 ## 下发的网段范围
[DHCP-Server-ip-pool-vlan10]gateway-list 192.168.10.254 ## 默认网关
[DHCP-Server-ip-pool-vlan10]dns-list 8.8.8.8 ## DNS服务器
[DHCP-Server-ip-pool-vlan10]qu
[DHCP-Server]ip pool vlan20
[DHCP-Server-ip-pool-vlan20]network 192.168.20.0 mask 24
[DHCP-Server-ip-pool-vlan20]gateway-list 192.168.20.254
[DHCP-Server-ip-pool-vlan20]dns-list 8.8.8.8
[DHCP-Server-ip-pool-vlan20]qu
================================== 进入该接口,打开全局中DHCP 功能 ==============================
[DHCP-Server]int g0/0/0
[DHCP-Server-GigabitEthernet0/0/0]dhcp select global ## 调用该地址池
[DHCP-Server-GigabitEthernet0/0/0]qu
=========================================== 静态路由 ===========================================
[DHCP-Server]ip route-static 192.168.10.0 255.255.255.0 192.168.100.100
[DHCP-Server]ip route-static 192.168.20.0 255.255.255.0 192.168.100.100
静态路由的目的是,实现对PC的网关可达,有在最后详细阐述了该静态路由的作用
DSW (核心层)
SVI接口当作PC的网关,并且配置上DHCP中继
[DSW-Vlanif10] dhcp select relay
[DSW-Vlanif10] dhcp relay server-ip 192.168.100.254
[DSW] dhcp enable ## 这个千万不要忘记啦,要记得打开DHCP功能哦
## 需要先创建VLAN,才能配置SVI接口
[DSW]vlan 10
[DSW-vlan10]vlan 20
[DSW-vlan20]vlan 100
========================================= 实现交换机与服务器通信 ========================================
## VLAN 100 是用来与服务器实现通信的,从而达成中继功能
[DSW]interface Vlan 100
[DSW-Vlanif100] ip address 192.168.100.100 255.255.255.0
[DSW-Vlanif100]qu
## 要将交换机DSW与路由器相连的接口,改成Access端口
## 这样子,携带Tag标签的流量,就会被剥离掉,从而实现通信
[DSW]interface GigabitEthernet0/0/1
[DSW-GigabitEthernet0/0/1] port link-type access
[DSW-GigabitEthernet0/0/1] port default vlan 100
[DSW-GigabitEthernet0/0/1]#
======================================== 配置PC网关地址(SVI接口) ======================================
[DSW]interface Vlan 10
[DSW-Vlanif10] ip address 192.168.10.254 255.255.255.0 ## PC的网关地址
[DSW-Vlanif10] dhcp select relay ## DHCP中继开启
[DSW-Vlanif10] dhcp relay server-ip 192.168.100.254 ## 配置DHCP服务器的地址:192.168.100.254
[DSW-Vlanif10]qu
[DSW]interface Vlan 20
[DSW-Vlanif20] ip address 192.168.20.254 255.255.255.0
[DSW-Vlanif20] dhcp select relay
[DSW-Vlanif20] dhcp relay server-ip 192.168.100.254
[DSW-Vlanif20]qu
LSW (汇聚层)
[DSW]vlan 10
[DSW-vlan10]vlan 20
[LSW]interface Ethernet0/0/1
[LSW-Ethernet0/0/1] port link-type trunk
[LSW-Ethernet0/0/1] port trunk allow-pass vlan 10 20
[LSW-Ethernet0/0/1]qu
[LSW]interface Ethernet0/0/2
[LSW-Ethernet0/0/2] port link-type access
[LSW-Ethernet0/0/2] port default vlan 10
[LSW-Ethernet0/0/2]qu
[LSW]interface Ethernet0/0/3
[LSW-Ethernet0/0/3] port link-type access
[LSW-Ethernet0/0/3] port default vlan 20
[LSW-Ethernet0/0/3]qu
PC1
PC2
强调
大家可以在 这个抓包截图中发现 ,当PC去请求DHCP服务器的时候,一直请求不下来,为什么?
因为DHCP中继给DHCP服务器发的是单播,并且源IP地址是PC的网关,DHCP的服务器收到了DHCP中继的Discover报文,它开始查本地路由表时,并没有找到通往该PC网关的路由条目,就没有回包给中继,导致DHCP 的协商迟迟不成功。
DHCP_Server 的路由表
解决方法:
配置两条指向PC网关的静态路由
[DHCP-Server]ip route-static 192.168.10.0 255.255.255.0 192.168.100.100
[DHCP-Server]ip route-static 192.168.20.0 255.255.255.0 192.168.100.100
现在的路由表
获取成功啦
配置文档
R1
#
dhcp enable
#
ip pool vlan10
gateway-list 192.168.10.254
network 192.168.10.0 mask 255.255.255.0
dns-list 8.8.8.8
#
ip pool vlan20
gateway-list 192.168.20.254
network 192.168.20.0 mask 255.255.255.0
dns-list 8.8.8.8
#
interface GigabitEthernet0/0/0
ip address 192.168.100.254 255.255.255.0
dhcp select global
#
ip route-static 192.168.10.0 255.255.255.0 192.168.100.100
ip route-static 192.168.20.0 255.255.255.0 192.168.100.100
#
DSW
#
dhcp enable
#
vlan batch 10 20 100
#
interface Vlanif10
ip address 192.168.10.254 255.255.255.0
dhcp select relay
dhcp relay server-ip 192.168.100.254
#
interface Vlanif20
ip address 192.168.20.254 255.255.255.0
dhcp select relay
dhcp relay server-ip 192.168.100.254
#
interface Vlanif100
ip address 192.168.100.100 255.255.255.0
#
interface GigabitEthernet0/0/1
port link-type access
port default vlan 100
#
interface GigabitEthernet0/0/2
port link-type trunk
port trunk allow-pass vlan 10 20
#
LSW
#
vlan batch 10 20
#
interface Ethernet0/0/1
port link-type trunk
undo port trunk allow-pass vlan 1
port trunk allow-pass vlan 10 20
#
interface Ethernet0/0/2
port link-type access
port default vlan 10
#
interface Ethernet0/0/3
port link-type access
port default vlan 20
#