1. 场景与选型:什么情况下必须用到DHCP中继
办公室搬到新园区之后,网络架构变成了一台H3C核心交换机下挂多个VLAN,原有DHCP服务器在机房单独跑着。一开始图省事,直接在核心交换机上配了三个VLAN接口地址池,结果用了一周问题就来了——销售部、研发部、财务部各自一个VLAN,DHCP地址池得分开维护,新增一个部门就要上交换机改一段配置,更麻烦的是领导要求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 Server,IP是192.168.100.10/24。现在要解决的是两个业务VLAN的地址分配问题:VLAN 10的网关是192.168.10.254,网段是192.168.10.0/24;VLAN 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 10 | VLAN 20 | DHCP服务器 |
|---|---|---|---|
| 网段 | 192.168.10.0/24 | 192.168.20.0/24 | 192.168.100.0/24 |
| 网关 | 192.168.10.254 | 192.168.20.254 | 192.168.100.254 |
| 接口 | Vlan-interface10 | Vlan-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.0(PowerShell命令)看一下地址池里的租约记录有没有新增。如果中继真的生效,这里应该能看到来自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可以用Wireshark,Linux用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查看全量报文统计,这两条命令是日常运维检查中继状态最常用的。再配合服务器侧的租约列表,整个中继链路是否健康,几分钟就能判断完。