1. 为什么需要手动搭建DHCP中继:广播过不去的那道坎
很多刚开始接触园区网络的朋友都会遇到一个典型的场景:网络里划分了好几个VLAN,每个VLAN的终端都要自动获取IP地址。最直觉的做法是在核心交换机上创建多个地址池,让交换机自己给每个VLAN分配IP。这种方案在规模不大、DHCP请求量可控的环境下确实没问题,但一旦网络规模上来,或者出于安全合规要求必须把DHCP服务集中部署在独立的服务器上,问题就来了。
DHCP协议从设计之初依赖的是广播报文。客户端在启动时并不知道DHCP服务器的位置,只能通过发送目的地址为255.255.255.255的广播Discover报文来寻找服务器。而广播报文默认无法跨越三层接口,也就是说,如果DHCP服务器在VLAN 10,而终端在VLAN 20,即使两个VLAN之间路由完全打通,终端的Discover报文也会在VLAN 20的三层网关处被丢弃,永远到不了服务器。这就是广播域隔离带来的副作用。
华三交换机的DHCP中继(DHCP Relay)功能解决的正是这个问题。它让交换机在收到客户端的广播Discover报文后,不再简单丢弃,而是把报文中的giaddr字段改写为交换机的接口地址,然后将报文以单播形式转发给指定的DHCP服务器。服务器收到请求后,会根据giaddr字段判断客户端所属的网段,从对应的地址池中选出合适的IP,并通过中继把Offer和ACK报文回传给客户端。整个过程对终端完全透明,终端感知不到服务器在哪个网段,也不需要做任何额外配置。
这篇文章适合谁看?如果你正在维护一台华三交换机,遇到了"多个VLAN需要从同一个DHCP服务器获取IP"的需求,或者你刚接触中继这个概念,想搞清楚原理和配置方法,那这篇文章正好对路。我会从基础原理讲起,给出完整的配置命令,再分享一些我在实际调试中踩过的坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 中继工作的完整链路:从Discover到ACK,报文到底经历了什么
在配置之前,先花点时间把中继的工作机制讲透。理解报文流转的每个环节,排错的时候才能做到心中有数,而不是靠猜。
2.1 一个完整的DHCP交互流程
假设终端PC-A在VLAN 100,IP网段是192.168.100.0/24,网关是192.168.100.1(交换机VLAN 100的三层接口地址)。DHCP服务器在VLAN 10,地址是192.168.10.10。整个交互过程分为四个阶段:
第一步,PC-A发送DHCP Discover报文。源IP是0.0.0.0,目的IP是255.255.255.255,源MAC是PC-A的MAC地址,目的MAC是广播地址。这个报文到达交换机后,交换机根据目的MAC判断是广播帧,会在VLAN 100内泛洪。同时,由于交换机的VLAN 100接口配置了DHCP中继功能,它会将这个报文交给中继模块处理。
第二步,中继模块将报文的giaddr字段(Gateway IP Address)改写为192.168.100.1,然后把报文封装成单播,源IP是192.168.100.1(或者根据配置选择其他源地址),目的IP是192.168.10.10,发给DHCP服务器。giaddr字段的作用就是告诉服务器"客户端在哪个网段",服务器正是靠这个字段从地址池中选择合适的IP段。
第三步,服务器收到Discover后,根据giaddr=192.168.100.1找到对应地址池,选择空闲IP,回复DHCP Offer,目的IP是192.168.100.1,然后交给中继。中继收到Offer后,将giaddr置零,查询之前记录的客户端端口信息,把Offer以广播形式(或者按需以单播形式)转发给VLAN 100内的PC-A。
第四步,PC-A收到Offer后,发送DHCP Request确认选择;服务器回复ACK,同样经过中继转发。至此,PC-A拿到完整的IP配置信息(IP地址、掩码、网关、DNS等),整个流程结束。
2.2 giaddr字段为什么是关键
giaddr(Gateway IP address,网关IP地址)字段是整个中继机制的灵魂。它原本是DHCP协议中一个可选的字段,客户端发送报文时该字段为零。中继设备收到广播报文后,把自己的接口地址填入该字段,再转发给服务器。服务器正是依靠这个字段来判断客户端归属的网段,选择对应的地址池。
如果配置中继时写错了接口地址,或者服务器侧地址池和giaddr不匹配,典型的症状是客户端一直获取不到IP,抓包能看到Discover在不断重发,但服务器端根本没有任何请求记录
