
1. 场景与选型什么情况下必须用到DHCP中继办公室搬到新园区之后网络架构变成了一台H3C核心交换机下挂多个VLAN原有DHCP服务器在机房单独跑着。一开始图省事直接在核心交换机上配了三个VLAN接口地址池结果用了一周问题就来了——销售部、研发部、财务部各自一个VLANDHCP地址池得分开维护新增一个部门就要上交换机改一段配置更麻烦的是领导要求IP地址统一由机房的Windows DHCP服务器分配方便和AD域控联动。这时候再去每个VLAN里跑一个DHCP服务显然不现实DHCP中继DHCP Relay就是这个场景下的标准解法。先把这个技术名词拆开讲明白。DHCP客户端发地址请求的时候用的是广播报文广播只能在自己所在的二层域也就是VLAN里传播到不了别的网段。三层交换机或路由器默认不转发广播所以如果DHCP服务器在别的网段客户端的请求根本送不过去。DHCP中继做的事情就是让网关设备把收到的广播请求转成单播发给指定的DHCP服务器再把服务器的回应转回给客户端。说白了网关在这里当了一台快递中转站。那有人会问直接在核心交换机上开DHCP服务不就行了何必多此一举确实小规模网络里直接在三层设备上配地址池完全够用。但如果网络里有独立的DHCP服务器、需要和域控联动做基于MAC地址的保留策略、或者要集中管理多个分支机构的地址分配中继模式就比在每台交换机上分别配DHCP要优雅得多。而且中继模式下地址池、租约、保留规则全部集中在服务器上管理交换机坏了换一台新的只要VLAN接口配置在终端照样能从服务器拿到地址不用重新迁移配置。我见过不少网络工程师第一次配中继时想不明白一个问题既然客户端发的是广播服务器回应的也是广播因为客户端此时还没有IP那服务器怎么知道该把回应发到哪个网段去这就是中继协议里最核心的机制——giaddr字段。中继设备在转发请求时会把收到请求的接口IP地址填进报文的giaddr字段服务器看到这个字段就知道客户端属于哪个网段直接从对应的作用域里分配地址然后把回应单播给giaddr指向的设备也就是中继器由中继器再转成广播发给客户端。理解了这个字段的作用后面排查问题会轻松很多。2. H3C设备DHCP中继的配置拆解2.1 配置前必须理清的网络规划先看一个最常见的实际场景。核心交换机是H3C S5560机房的DHCP服务器是Windows ServerIP是192.168.100.10/24。现在要解决的是两个业务VLAN的地址分配问题VLAN 10的网关是192.168.10.254网段是192.168.10.0/24VLAN 20的网关是192.168.20.254网段是192.168.20.0/24。服务器上已经分别建好了这两个网段的作用域地址池范围、网关、DNS都已经填好只等终端的请求送过来。重要的一点是交换机和服务器之间的三层路由必须通。中继只是在VLAN接口和服务器之间转发DHCP报文如果VLAN 10的接口地址ping不通服务器中继配得再对也是白搭。所以配置中继前第一件事是在交换机上测试到服务器的连通性。很多中继不生效的案例最后查下来都是路由不通或者防火墙策略拦截了UDP 67、68端口。这里还要注意DHCP服务器上作用域的网关设置。很多人在服务器上建作用域时会顺手把路由器选项填成网关地址这步不能省。客户端拿到地址后需要知道自己网段的网关是192.168.10.254、DNS是哪个服务器就是通过DHCP选项Option 3和Option 6把这些信息带给客户端的。如果服务器上的作用域没有配网关和DNS客户端即使拿到IP也上不了网。2.2 H3C两种风格的dhcp relay配置命令H3C的交换机路由器上DHCP中继的配置方式因为软件版本不同有细微差别。老版本用的是dhcp select relay配合dhcp relay server-address新版本特别是支持server-group的版本更推荐用dhcp relay server-group的方式好处是可以把多个服务器放到一个组里做冗余。两种写法我都列出来你根据自己设备的版本选一种就行。先说老式的经典写法适合老款的S5024、MSR系列等设备。# 全局开启DHCP服务 [H3C] dhcp enable # 进入VLAN 10的三层接口 [H3C] interface Vlan-interface 10 # 配置接口为DHCP中继模式 [H3C-Vlan-interface10] dhcp select relay # 指定DHCP服务器的地址可以指定多个设备会自动做主备 [H3C-Vlan-interface10] dhcp relay server-address 192.168.100.10 [H3C-Vlan-interface10] quit # VLAN 20同样处理 [H3C] interface Vlan-interface 20 [H3C-Vlan-interface20] dhcp select relay [H3C-Vlan-interface20] dhcp relay server-address 192.168.100.10 [H3C-Vlan-interface20] quit再来看新式写法用server-group把服务器统一管理适合较新的Comware V7、V9版本。# 创建DHCP服务器组 [H3C] dhcp server group dhcp-group # 添加DHCP服务器地址 [H3C-dhcp-server-group-dhcp-group] dhcp server 192.168.100.10 # 如果要配主备再加一个 [H3C-dhcp-server-group-dhcp-group] dhcp server 192.168.100.11 [H3C-dhcp-server-group-dhcp-group] quit # VLAN 10接口引用这个组 [H3C] interface Vlan-interface 10 [H3C-Vlan-interface10] dhcp select relay [H3C-Vlan-interface10] dhcp relay server-select dhcp-group [H3C-Vlan-interface10] quit # VLAN 20接口同样引用 [H3C] interface Vlan-interface 20 [H3C-Vlan-interface20] dhcp select relay [H3C-Vlan-interface20] dhcp relay server-select dhcp-group [H3C-Vlan-interface20] quit两种写法的效果是一样的核心就是三步开启DHCP功能、接口切换成relay模式、指定服务器地址。如果你在配置时发现设备不认识dhcp relay server-address这条命令基本可以判断是版本太新或者太老换成server-group方式写就行。2.3 华为设备对照配置顺带提一句华为设备上的配置因为很多网络里H3C和华为设备混着用对照着看能少踩不少坑。华为设备上配置DHCP中继的步骤和H3C基本一致只是命令名稍有不同# 全局开启DHCP [huawei] dhcp enable # 进入VLAN接口 [huawei] interface Vlanif 10 [huawei-Vlanif10] dhcp select relay [huawei-Vlanif10] dhcp relay server-ip 192.168.100.10 [huawei-Vlanif10] quit对比一下就能看出来华为用dhcp relay server-ip指定服务器地址H3C用dhcp relay server-address命令结构几乎一模一样。会配华为的人上手H3C基本没有学习成本反过来也一样。3. 完整实操从零配置一个能跑通的中继3.1 整体网络拓扑与配置基线我这里以一个完整的实验环境为例带你从头到尾走一遍。网络拓扑是H3C S5560核心交换机作为网关设备下接两个接入交换机分别对应VLAN 10和VLAN 20上联一台H3C MSR路由器路由器后面是那台DHCP服务器。当然实际环境中完全可以把服务器直接接到核心交换机上这里为了演示多设备场景故意绕了一下。规划好的参数如下表项目VLAN 10VLAN 20DHCP服务器网段192.168.10.0/24192.168.20.0/24192.168.100.0/24网关192.168.10.254192.168.20.254192.168.100.254接口Vlan-interface10Vlan-interface20服务器物理网卡服务器上的作用域已经提前建好VLAN 10的作用域范围是192.168.10.100到192.168.10.200网关和DNS都填了VLAN 20的作用域范围是192.168.20.100到192.168.20.200同样配好网关DNS。3.2 分步配置过程第一步是把VLAN接口建好这是中继能工作的前提。VLAN 10和VLAN 20的三层接口必须配置IP地址这个地址会成为终端设备的网关也是中继转发报文时giaddr字段的来源。[H3C] vlan 10 [H3C-vlan10] quit [H3C] vlan 20 [H3C-vlan20] quit [H3C] interface Vlan-interface 10 [H3C-Vlan-interface10] ip address 192.168.10.254 255.255.255.0 [H3C-Vlan-interface10] quit [H3C] interface Vlan-interface 20 [H3C-Vlan-interface20] ip address 192.168.20.254 255.255.255.0 [H3C-Vlan-interface20] quit第二步配置交换机到DHCP服务器的路由。这一步很多人容易忽略觉得VLAN接口配好就行忘了服务器在另一个网段。如果交换机上没有到192.168.100.0/24的路由中继报文根本送不到服务器。这里通过配置静态路由实现如果网络里有动态路由协议确保协议能学到这条路由也行。[H3C] ip route-static 192.168.100.0 255.255.255.0 192.168.100.254配完之后先敲一条ping 192.168.100.10确认连通性。注意有的设备默认ping的源地址是出接口地址如果出接口是192.168.100.254这个网段的接口就没问题如果不是建议指定源地址再ping一次确保从正确的接口出去[H3C] ping -a 192.168.100.254 192.168.100.10第三步配置DHCP中继。这里直接上命令[H3C] dhcp enable [H3C] dhcp server group relay-servers [H3C-dhcp-server-group-relay-servers] dhcp server 192.168.100.10 [H3C-dhcp-server-group-relay-servers] quit [H3C] interface Vlan-interface 10 [H3C-Vlan-interface10] dhcp select relay [H3C-Vlan-interface10] dhcp relay server-select relay-servers [H3C-Vlan-interface10] quit [H3C] interface Vlan-interface 20 [H3C-Vlan-interface20] dhcp select relay [H3C-Vlan-interface20] dhcp relay server-select relay-servers [H3C-Vlan-interface20] quit第四步回到DHCP服务器上检查一下防火墙规则。Windows Server默认会允许DHCP服务的入站请求但如果你用的是Linux服务器要确认UDP 67端口的报文能进来很多Linux发行版默认防火墙策略是拒绝所有未放行的入站连接。服务器配置这里不做展开只提醒一句服务器上每个作用域的网络掩码默认网关DNS服务器一定要填对否则终端拿到地址后无法正常通信。3.3 验证中继是否生效配置完成之后验证是最关键的环节。先不急着找终端电脑直接在交换机上敲一条命令看中继有没有正常工作[H3C] display dhcp relay statistics interface Vlan-interface 10这条命令会显示VLAN 10接口上中继收发的报文统计。如果看到DISCOVER和REQUEST报文有计数说明客户端的请求确实到达了交换机并做了中继转发。如果计数一直是0说明终端发出的广播可能没有到达网关设备需要排查接入交换机VLAN划分、上联口是否放通等问题。再看一下服务器侧的状态。在Windows服务器上用ipconfig /all确认网卡IP正常然后用Get-DhcpServerv4Lease -ScopeId 192.168.10.0PowerShell命令看一下地址池里的租约记录有没有新增。如果中继真的生效这里应该能看到来自192.168.10网段的租约客户端的MAC地址和主机名也会显示出来。终端侧验证更直观Windows客户端执行ipconfig /release再执行ipconfig /renew看能不能在几秒内拿到192.168.10网段的地址。拿不到就按下一条里的思路排查。4. 中继不生效的排查技巧与避坑实录先泼一盆冷水配置本身不难难的是配置完了终端拿不到地址时怎么排查。我在这个过程里踩过的坑基本可以归纳成几类每类都有很典型的现象和对应解法。4.1 DHCP报文统计怎么看前面提到看一眼display dhcp relay statistics的计数但这只是第一步。如果计数在涨但客户端还是拿不到地址问题很可能出在服务器到客户端的回程路径上。记住DHCP中继的工作流程客户端广播DISCOVER中继转发给服务器服务器单播OFFER给中继中继再广播给客户端。任何一个环节断了流程都走不完。所以在交换机上要再看一条命令[H3C] display dhcp relay statistics interface Vlan-interface 20重点看OFFER和ACK报文的计数。正常情况下DISCOVER、REQUEST、OFFER、ACK应该都有计数。如果只有DISCOVER没有OFFER说明请求到了服务器但回应没回到交换机。这时候去服务器上抓包Windows可以用WiresharkLinux用tcpdump过滤条件写port 67 or port 68。如果服务器上能看到来自192.168.20.254的请求但回应发出去了交换机上却收不到八成是回程路由有问题检查交换机上到服务器网段的路由以及服务器上有没有指回VLAN 20网段的网关。服务器上如果配了多块网卡还要确认回应是从哪个接口出去的Windows的路由表有时候会让人抓狂。4.2 两个非常隐蔽的命令坑第一个坑是dhcp select relay打完之后有的版本要求该VLAN接口下不能再配置dhcp select server或者dhcp apply server之类的残留配置。如果之前在接口上手动配过DHCP服务器方式后面改成中继时一定要先undo dhcp select再重新配成relay模式。不然会出现一个很诡异的现象有部分终端能从交换机上直接拿到地址因为接口还残留着server配置另一部分终端却拿到了中继地址整个网络混乱不堪。第二个坑出现在配置VLAN接口IP地址之后忘记保存配置就重启设备。H3C设备默认配置不会自动保存没有执行save force的情况下设备重启后中继配置会全部丢失。这听起来像低级错误但真实世界里这种问题发生的频率远超想象——往往是一台设备配置好之后几个月都没重启某次机房断电重启之后所有VLAN的终端都拿不到地址了。保存配置的命令[H3C] save force这个问题我在一个客户现场遇到过所有人都以为是中继配置坏了结果登进设备一查配置全没了估计是之前某次升级或调试时把配置清了重新敲一遍中继配置又复通了。4.3 服务器与终端相关问题的快速判别排查的时候要养成一个好习惯先判断问题出在哪个环节别一上来就怀疑配置。我自己常用的排查顺序是先看交换机上能不能ping通服务器再看中继统计计数然后到服务器上抓包最后才去查服务器作用域配置。有次客户报障说部分终端能获取IP、部分终端不能。我第一反应是地址池满了登进服务器一看果不其然VLAN 10的作用域范围设的是192.168.10.100到192.168.10.200总共101个地址但部门实际有150个人在线。扩大地址池范围之后问题立刻解决。这个例子说明中继本身没问题但地址池规划不合理也会表现出中继故障的症状。还有一次更隐蔽。终端能拿到地址但拿到的是一个错误的段——比如VLAN 20的终端拿到的却是192.168.10网段的地址。后来排查发现是服务器上作用域的配置中VLAN 20的作用域和超级作用域搞混了地址分配时服务器根据giaddr字段匹配错了作用域。H3C交换机转发的giaddr字段值是VLAN接口地址如果服务器上VLAN 20作用域的路由器选项误填成了192.168.10.254或者作用域的网络地址写错了都可能出现这种张冠李戴的情况。4.4 常见问题速查表把最常见的几个问题整理成一张速查表放在这里遇到问题时对照着查比翻手册快得多。现象可能原因排查方向所有终端都拿不到地址交换机到服务器路由不通ping服务器检查路由和防火墙策略中继统计无计数终端广播未到达网关检查接入交换机VLAN、上联口配置DISCOVER有计数但OFFER无服务器未收到或回程不通服务器侧抓包检查服务器路由表部分终端拿不到地址地址池耗尽检查作用域范围和租约时间拿错网段地址服务器作用域配置错误核对服务器上giaddr匹配的作用域设置重启后中继失效配置未保存执行save force重新保存配置5. 中继场景进阶多网段、多服务器与跨设备中继基础配置跑通之后很多网络会面临更复杂的场景。比如园区里有多台DHCP服务器做冗余或者核心交换机下面还挂了二级网关设备需要中继到核心。这里把几个进阶配置一并讲清楚。多DHCP服务器做冗余时H3C的server-group方式会按顺序选择服务器。第一条dhcp server命令配置的地址优先使用如果请求发出后超时没有响应会切换到第二条命令配置的地址。这个超时和切换机制由设备自动处理不需要额外配置。我一般建议至少配两台服务器一台主一台备主服务器出问题时终端不会长时间断网。多VLAN场景的批量配置也有优化办法。如果VLAN数量多一个个进接口敲命令确实繁琐可以用H3C的批量配置功能。先把配置写成脚本一次性执行或者用display current-configuration | include dhcp relay确认当前所有中继相关配置。实际运维里我会把中继配置单独做成一个文本文件设备变更时直接粘贴进去效率高很多。跨设备中继的场景则要特别小心。比如接入交换机是二层设备核心交换机做中继这种情况下只需要在核心交换机的VLAN接口上配置中继就可以了二层接入交换机不用做任何DHCP相关配置。但如果接入交换机上做了VLAN化且三级交换机上存在VLAN接口三层网关在接入层就要在每一层网关设备上分别配置中继终端广播先到接入层网关接入层网关转发给核心层核心层再转发给DHCP服务器。这种多级中继的部署方式排查起来复杂度翻倍尽量在设计阶段避免。我个人在实际配置中还有一个习惯把中继的目的服务器地址统一规划在一个独立段比如所有中继配置里的服务器地址都使用机房专用的192.168.100.10和192.168.100.11这样无论VLAN多少中继配置的差异只在于VLAN接口地址排查时一眼就能看出哪里配置错了。最后分享一个小技巧。中继配置完之后用display dhcp relay server-group all确认server-group里的地址列表用display dhcp relay statistics查看全量报文统计这两条命令是日常运维检查中继状态最常用的。再配合服务器侧的租约列表整个中继链路是否健康几分钟就能判断完。