1. 一个看似简单、实际很容易翻车的实验:为什么需要DHCP中继
先说说我为什么想写这个案例。很多人在学华为设备时,第一个玩熟的就是DHCP。在AR路由器上开个全局地址池,接口下敲一行dhcp select global,PC改成自动获取,哒哒两下IP就拿到了。这确实很有成就感,但也容易让人产生一种错觉——DHCP就是这么简单,开个池子就完事了。
直到有一天你面对一个真实的多网段环境。
比如你的网络里有三个部门,分别在192.168.10.0/24、192.168.20.0/24、192.168.30.0/24三个网段,但机房只能放一台DHCP服务器。这时候问题就来了:客户机的DHCP请求是广播报文,广播不能穿越三层设备(路由器默认隔离广播域)。20网段的PC发出Discover广播,路由器收到后按默认策略是直接丢弃,绝对不会帮你转给10网段的DHCP服务器。结果就是PC一直转圈圈,最后弹出一个"无法获取IP地址"的红色感叹号。
解决这个问题的正规方案有三个:每个网段都部署一台DHCP服务器(成本高)、在路由器上做多子网地址池(适合小型网络,但地址池全挤在网关设备上,设备性能和配置复杂度都不好看)、以及本篇要讲的DHCP中继(DHCP Relay)。
DHCP中继的思路并不复杂——广播变单播,跨网段转发。路由器收到客户机的广播请求后,不丢弃,而是把报文改造成单播报文,源地址改成自己的接口地址,目的地址改成远端DHCP服务器的IP,然后转发过去。DHCP服务器收到后,根据报文中的网关IP(giaddr字段)判断客户机所在的网段,从对应网段的地址池里分配地址,再把响应通过中继回传给客户机。
这个机制在生产网里非常常见。公司总部一个DHCP服务器群,分支机构的网关设备做中继,几十个分支网段全都靠这一套机制下发地址。你要是不会配中继,遇到多网段环境就只能干瞪眼。
但说实话,第一次在eNSP里做这个实验的人,十个有八个会卡在"为什么PC还是拿不到地址"上面。我自己也翻过车,而且翻得相当彻底——当时Topology里连好的线、配置好的命令看着全对,结果PC上就是冒感叹号。后来抓包一查才发现,问题出在一个很多人根本不会注意的小细节上。
这篇文章就把这个实验彻底拆开讲透。我用Huawei eNSP搭一个完整的DHCP中继实验环境,从拓扑设计、IP规划、设备配置、抓包验证到常见故障排错,一步不落。还会把那些文档里不会写、但实际折腾中一定会遇到的坑(比如eNSP启动AR失败错误代码40、物理机蓝屏这类问题)一并拿出来说。整个配置流程我会用我自己的验证结果说话,确保你照着做完一定能复现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实验拓扑与地址规划:两台路由器加一台PC,搭出跨网段获取地址的场景
这个实验的核心目标是模拟一个典型的小型分支网络:PC所在的业务网段和DHCP服务器所在的服务器网段不是同一个广播域,PC必须通过网关设备上的DHCP中继功能,从远端服务器获取IP地址。
2.1 拓扑结构设计
不需要太多设备,三台就够:
- 一台PC(Client),模拟业务网段中的普通终端
- 两台AR2220路由器,AR1作为中继设备(也是PC的网关),AR2作为DHCP服务器
- AR1和AR2之间用一条GE链路互联
我这边实际的拓扑连线如下:
- PC的Ethernet0/0/1 接 AR1的GigabitEthernet0/0/0
- AR1的GigabitEthernet0/0/1 接 AR2的GigabitEthernet0/0/0
2.2 IP地址规划
这个实验的关键是把"业务网段"和"服务器网段"彻底分开,这样才能体现出中继的价值。
| 设备 | 接口 | IP地址 | 所属网段 | 用途 |
|---|---|---|---|---|
| AR1 | GE0/0/0 | 192.168.10.1/24 | 192.168.10.0/24 | PC网关,中继接口 |
| AR1 | GE0/0/1 | 192.168.20.1/24 | 192.168.20.0/24 | 连接DHCP服务器 |
| AR2 | GE0/0/0 | 192.168.20.2/24 | 192.168.20.0/24 | DHCP服务器接口 |
| PC1 | 以太网口 | DHCP自动获取 | 192.168.10.0/24 | 验证终端 |
DHCP服务器的地址池规划:
- 地址池名称:pool_10
- 网段:192.168.10.0/24(给PC所在网段分配地址)
- 网关:192.168.10.1
- DNS:8.8.8.8(eNSP里不需要真实DNS,随便填一个用于演示)
注意:很多人习惯把DHCP服务器的地址也放入地址池,这是错误的。中继模式下,服务器虽然能通过报文中的giaddr字段判断客户端所在的网段,但地址池里应该只包含业务网段的地址,不要把服务器自身所在网段混进去。
2.3 这个拓扑设计的意图
为什么选两台路由器而不是一台路由器+一台真实的DHCP服务器软件?原因很简单——eNSP跑在虚拟化环境里,如果你想用真实的Windows/Linux做DHCP服务器,还要处理VMware虚拟网卡和eNSP的云设备联动问题,实验复杂度会陡然上升。AR2220本身就支持DHCP服务器功能,在模拟器里再合适不过。用两台AR,能让你把"中继设备"和"服务器设备"的角色分得清清楚楚,排错的时候思路也清晰。
3. DHCP中继工作原理深度拆解:广播转单播背后,giaddr字段到底起了什么作用
配置之前,我强烈建议先把原理吃透。因为你不理解原理,后面遇到"PC拿不到地址"的情况时会完全不知道从哪里下手。
3.1 DHCP四步交互流程在中继场景下是怎么走的
在同一个广播域内,DHCP交互是四步:
- DHCP Discover(客户端广播寻找服务器)
- DHCP Offer(服务器广播回复提供地址)
- DHCP Request(客户端广播确认选择该地址)
- DHCP Ack(服务器广播最终确认)
到了跨网段场景,整个过程就不一样了。关键点是:Discover和Request是客户端发出的广播报文,路由器默认不转发广播,所以必须有人来"接管"这份广播。
中继设备做的事是这样的:
- PC发出源地址为0.0.0.0、目的地址为255.255.255.255的Discover广播包
- AR1(中继)收到这个广播包后,把报文中的giaddr字段(giaddr就是Gateway IP Address,也就是"中继代理地址")填上自己接口的IP地址192.168.10.1
- AR1把报文的目的地址改成DHCP服务器的IP(192.168.20.2),源地址改成自己的出接口地址(192.168.20.1),然后单播转发出去
- AR2(DHCP服务器)收到后,看到giaddr是192.168.10.1,就知道客户端在192.168.10.0/24网段,从对应地址池中选一个空闲地址,构造Offer报文
- AR2把Offer报文发给中继设备AR1(因为服务器直连网关是AR1,回应也是发给AR1)
- AR1收到后,把Offer转成广播或单播发给PC
这个过程中,giaddr就是整个机制的"灵魂"。DHCP服务器自己不关心客户端广播包从哪来,它只看giaddr字段来判断客户端位于哪个子网,从而决定从哪个地址池分配地址。
3.2 为什么中继要把源地址改成自己的出接口地址
如果不改源地址,AR1把Discover包原封不动地单播给AR2,AR2收到后想回复,但它的路由表里没有客户端所在网段的路由,回包根本不知道往哪儿发。中继把源地址改成192.168.20.1后,AR2回复时直接发给192.168.20.1,也就是AR1,AR1再根据之前记录的客户端信息,把Offer广播给客户端。一来一回,路径完全闭环。
3.3 一个容易忽略的细节:Offer是广播还是单播
在跨网段中继场景下,服务器返回给中继的Offer报文,目的地址可以是中继的IP,也可以是客户端的IP。中继设备转发给客户端时,如果客户端在同一个广播域内,通常以广播形式发出。因为客户端此时还没有IP地址,只能通过广播来接收。模拟器里的PC也是这个行为模式。
理解了这套流程,再看配置命令时你就能猜出大概——中继设备上要指明"往哪个IP转发",这个IP就是DHCP服务器的地址;服务器上要配置地址池,并确保路由可达。
4. 完整配置过程:AR1中继、AR2服务器,每一步都给出验证命令
下面进入正题。我会按设备、按步骤给出配置,每步附上验证方法。整个实验我在eNSP(V100R003C00SPC100)上实际跑通过。
4.1 初始配置:接口地址和连通性检查
先把两台路由器的接口IP配上,保证基础连通性。
AR1配置:
code复制system-view
sysname AR1
interface GigabitEthernet0/0/0
ip address 192.168.10.1 255.255.255.0
undo shutdown
interface GigabitEthernet0/0/1
ip address 192.168.20.1 255.255.255.0
undo shutdown
quit
AR2配置:
code复制system-view
sysname AR2
interface GigabitEthernet0/0/0
ip address 192.168.20.2 255.255.255.0
undo shutdown
quit
配置完成后,先做连通性测试:
code复制ping 192.168.20.2
在AR1上ping AR2的接口地址,能通再往下走。这一步纯粹是为了排除物理链路或者接口配置错误。我见过不少人卡在后面的排错环节,最后发现是接口没配IP,或者undo shutdown没做(eNSP里接口默认是开启的,但真机上有些是默认关闭的,习惯性写上没坏处)。
4.2 AR2:DHCP服务器配置
AR2作为DHCP服务器,需要先开启DHCP服务,再配置地址池。
code复制dhcp enable
ip pool pool_10
network 192.168.10.0 mask 255.255.255.0
gateway-list 192.168.10.1
dns-list 8.8.8.8
lease day 1 hour 0 minute 0
quit
interface GigabitEthernet0/0/0
dhcp select global
quit
这里面有几条命令需要解释一下:
dhcp enable是全局开启DHCP服务,漏掉的后果是地址池配置了但不生效network 192.168.10.0 mask 255.255.255.0是指定可分配网段。这里必须写192.168.10.0/24,而不是192.168.20.0/24。因为服务器要分配的是PC所在网段的地址gateway-list 192.168.10.1是下发给客户端的网关地址。很多初学者不理解:为什么要手动指定网关?因为PC拿到地址后需要知道网关是谁,这个信息不会自动产生,必须由DHCP服务器通过Option 3下发给客户端dhcp select global这句在接口上敲,表示该接口启用DHCP服务器的全局地址池功能
提示:确认地址池配置是否正确,可以用
display ip pool查看。应该能看到pool_10的网段信息和总地址数。
4.3 AR1:DHCP中继配置
AR1是中继设备,需要先把接口的DHCP模式改成中继模式,然后指定服务器的IP。
code复制dhcp enable
interface GigabitEthernet0/0/0
dhcp select relay
dhcp relay server-ip 192.168.20.2
quit
interface GigabitEthernet0/0/1
dhcp select relay
quit
这里有个细节很多人会忽略:AR1的GE0/0/0是连接PC的接口,这个接口上必须执行dhcp select relay启用中继功能,并指定服务器地址。而GE0/0/1连接服务器,实际上这个接口可以不开启中继,但保险起见我也写上relay模式,不影响功能。
有人会问:为什么dhcp select relay要敲两次?因为中继功能是按接口生效的,你希望哪个接口接受到的DHCP广播被中继,就要在那个接口上启用。在实际生产环境,中继设备通常有多个业务接口(对应多个VLAN),每个VLAN接口都要单独配置relay。
4.4 关键步骤:AR1与AR2之间的路由问题
PC所在网段192.168.10.0/24和服务器网段192.168.20.0/24是直连路由,AR1和AR2直连,所以AR2上有192.168.20.0/24的路由,AR1上有192.168.10.0/24和192.168.20.0/24的路由,不需要额外配置静态路由。
这是这个拓扑简单的地方。如果实际网络里中继设备和DHCP服务器之间隔了好几跳,那就要保证:
- 中继设备能路由到达DHCP服务器
- DHCP服务器回包时能路由到达中继设备
别小看这句话,很多人在复杂网络里做中继,配置完全正确,但就是不通,最后发现是中间路由器没有回程路由。
4.5 验证配置
AR1上查看中继配置:
code复制display dhcp relay interface GigabitEthernet0/0/0
AR2上查看地址池状态:
code复制display ip pool
这两条命令能确认你的基础配置没写错。
4.6 PC自动获取地址
把PC1的IPv4配置改成DHCP模式,然后点击"应用"。eNSP里的PC机模拟器会自动发送DHCP请求,稍等片刻,在PC的命令行里输入:
code复制ipconfig
如果一切正常,你会看到类似这样的输出:
code复制IPv4地址.......................: 192.168.10.2
子网掩码.......................: 255.255.255.0
默认网关.......................: 192.168.10.1
DNS服务器......................: 8.8.8.8
到这里,一个最基础的DHCP中继实验就跑通了。
5. 抓包验证与结果分析:让报文说话,确认中继真的发生了作用
配置跑通只是第一步。作为一个合格的网络工程师,你还得能证明"这个中继真的在正常工作",而不是瞎猫碰上死耗子。最直接的手段就是抓包。
5.1 在AR1的GE0/0/0接口上抓包
在eNSP中,右键点击AR1的GE0/0/0接口,选择"抓包",然后在PC上重新获取IP地址(禁用再启用网卡,或者在PC命令行里执行ipconfig /release再ipconfig /renew)。
你会看到四个关键报文:
- DHCP Discover(源0.0.0.0,目的255.255.255.255)——这是PC发出的广播
- DHCP Offer(源192.168.20.2,目的192.168.10.1?还是255.255.255.255?)——注意观察
- DHCP Request(源0.0.0.0,目的255.255.255.255)
- DHCP Ack(源192.168.20.2,目的255.255.255.255)
重点观察第二个报文。如果中继正常,Offer报文里的giaddr字段应该等于192.168.10.1。虽然在PC侧抓包看到的是广播地址,但你可以点开报文详情,在BOOTP选项里看到giaddr的值,这就是中继设备填进去的"身份信息"。
5.2 在没有中继的情况下,抓包会是什么样
为了加深理解,你可以在AR1的GE0/0/0接口上先删除dhcp select relay,再重新触发PC获取IP。这时PC发出的Discover广播还是会被AR1接收,但因为没有启用中继,AR1不会做任何转发。抓包结果只有PC反复重传的Discover报文,没有任何Offer或Ack响应。
这个对比实验很直观:PC在同一个网段里找不到DHCP服务器,就是因为你把"信使"给撤了。
5.3 分析DHCP报文的一个小技巧
在eNSP的抓包工具里,点开DHCP报文后重点看这几个字段:
- Message type:确认是Discover、Offer、Request还是Ack
- Client MAC address:确认报文确实是来自PC1(这个字段有助于排查报文是否被伪造或误转)
- Gateway IP address(giaddr):中继模式下应该是192.168.10.1
- Your IP address:Offer和Ack报文里,这里是服务器分配的地址
- Option 3(Router):下发的网关地址
- Option 6(DNS):下发的DNS地址
抓包能帮你剔除绝大部分配置问题。实践中有一次我做了个复杂的多级中继实验,PC一直拿不到地址,抓包发现Offer报文根本没回到PC所在网段,最后定位到是中间路由器把回包给丢了。没有抓包的话,这个故障排查难度会高出一个数量级。
6. 常见故障与排错实战:从eNSP自身问题到配置细节坑
做实验最崩溃的不是命令敲错,而是看起来全对、结果就是不通。我自己在这个实验上栽过好几次跟头,这里把所有踩过的坑、别人问过我的问题汇总成一份实战排错清单。尤其是开头提到的"eNSP启动AR失败错误代码40"和"开启路由器蓝屏"这类模拟器自带问题,先解决它们才能真正进入实验。
6.1 eNSP自身问题:AR1启动失败、错误代码40
这是eNSP用户最常遇到的问题。你在拓扑里拖一台AR2220,右键启动,结果设备图标一直是红色,提示启动失败,错误代码40。
错误代码40的常见原因和解决办法:
- VirtualBox版本不兼容。eNSP通常内置了定制版VirtualBox,有些人在自己电脑上装了新版VirtualBox,版本冲突导致AR无法启动。解决方式:卸载独立安装的VirtualBox,使用eNSP自带的版本
- VirtualBox服务未启动。eNSP依赖VirtualBox的底层服务(VBoxSVC),如果服务没启动,所有AR设备都会启动失败。去Windows服务里确认VirtualBox相关的服务是启动状态
- 管理员权限。eNSP最好以管理员身份运行,否则对网卡和虚拟机的控制权限不足,也会触发启动失败
- 电脑开启了Hyper-V。Windows的Hyper-V和VirtualBox共存会冲突,表现为AR启动后很快失败。终极解决办法是关闭Hyper-V,或者换用支持Hyper-V竞态共存的VirtualBox版本
注意:如果你用Win10/Win11,关掉Hyper-V之前先确认自己没有依赖WSL2、Docker Desktop等需要Hyper-V的功能,否则关了会影响其他开发环境。可以考虑用"Windows功能"里只关Hyper-V、保留Windows虚拟机监控程序平台,但最稳妥的还是按eNSP社区最常见的做法,先关掉再试。
6.2 eNSP开启路由器蓝屏
这个和错误代码40经常一起出现。蓝屏一般发生在AR设备真正启动的那一刻,CPU虚拟化指令被触发,系统直接崩溃。根据我实际折腾的经验,主要有三个诱因:
- 电脑CPU比较老,或者主板BIOS里虚拟化技术(VT-x/AMD-V)没有开启。进BIOS把Intel Virtualization Technology设为Enable,基本能解决大半
- 内存不够。AR2220每个实例默认分配512MB内存,如果你同时启动多台设备,物理机内存吃紧,容易出现蓝屏。建议一次只开2~3台AR,或者调低每台设备的内存(eNSP里可以右键设备→设置→内存调整)
- VirtualBox版本错乱。如果你之前装过Oracle VirtualBox,再装eNSP自带版本,驱动冲突很容易蓝屏。彻底卸载重装是正经解法
6.3 配置层面最常见的坑:PC上"感叹号"排错四板斧
模拟器跑起来、配置敲完了,但PC还是拿不到地址。按以下顺序排查:
第一步:确认DHCP功能开启
在AR2上执行:
code复制display dhcp status
如果显示disabled,说明全局dhcp enable没生效或没敲。这是最低级的错误,但发生率极高。
第二步:确认地址池配置和接口绑定
在AR2上执行:
code复制display ip pool
重点看:
- 地址池的网段是否为192.168.10.0/24
- 地址池的地址总数是否大于0
- AR2的GE0/0/0接口是否执行了
dhcp select global
第三步:确认中继配置
在AR1上执行:
code复制display dhcp relay interface GigabitEthernet0/0/0
关键看有没有显示:
code复制DHCP Relay is enabled.
Server IP : 192.168.20.2
如果显示DHCP Relay is disabled,说明dhcp select relay没生效。有几次我明明在接口视图下敲了命令,但事后才发现敲到了系统视图下,命令没执行成功,这种低级错误只能靠display命令来抓。
第四步:抓包确认报文流向
如果前三步全对还是不通,就在AR1的GE0/0/0接口上抓包。重点看PC的Discover广播是否到达了AR1、AR1是否转发了单播报文到AR2、AR2的Offer是否回来了。这一步能直接告诉你问题出在哪个环节。
6.4 一个我实际翻过车的细节:PC名称不能有下划线
说个有意思的坑。eNSP里的PC设备,名称默认是"PC1",这没问题。但有一次我为了区分,把PC的名字改成了"PC_Test",结果DHCP怎么都获取不到地址。后来查了一圈,发现eNSP对设备名称的字符支持有限,某些特殊符号会导致设备内部配置解析异常。改回"PC1"后立刻就好了。
所以做实验尽量保持设备名称简单,不要画蛇添足地加下划线、中划线、中文。同理,路由器名称的sysname也建议用纯字母数字组合。
6.5 AR1的GE0/0/1接口上要不要配中继?
这个我之前提过,单独拿出来说透。AR1的GE0/0/1连的是DHCP服务器,这个接口理论上不需要中继功能,因为服务器会通过路由回复到AR1,而不是在这个接口上发广播。但如果你在GE0/0/1上也敲了dhcp select relay,不影响实验。真正需要留意的是:如果服务器本身也接在某个业务网段,且服务器开启的是dhcp select global,那服务器接口上就不要配relay,否则服务器会变成"中继",导致逻辑混乱。
6.6 PC自动获取不到时,试试固定IP先测连通性
这是个很实用的排错思路:先把PC1的IP手动改成192.168.10.10/24,网关192.168.10.1,然后ping AR1的192.168.10.1,通了说明二层链路和网关没问题,问题肯定出在DHCP相关配置上。如果不通,先解决链路问题,再回头看DHCP。这个朴素的"由底向上"排错法,能帮你把问题范围缩小一大半。
7. 扩展实验:把中继和高可用结合起来,vrrp与dhcp中继的联动思考
既然热搜里提到了VRRP,那就多说一嘴。实际生产环境中,DHCP中继往往不是单独存在的,它经常和网关冗余(VRRP)一起出现。PC的网关是两个路由器组成的虚拟IP,DHCP中继也往往需要在这两台设备上同时运行。
7.1 VRRP场景下的中继配置思路
假设AR1和AR3组成VRRP组,虚拟网关是192.168.10.254,两台设备都连接PC所在网段,同时都需要把DHCP请求中继到后端的DHCP服务器。
这种情况下,两台设备的业务接口上都配置dhcp select relay,并且都指定同一个服务器IP。因为VRRP组内只有Master在转发数据,中继报文只会从Master发出,不会产生双份请求的问题。PC通过VRRP的虚拟网关获取到默认网关,DHCP服务器通过giaddr字段判断客户端网段。
注意一点:中继接口上指定的giaddr应该用哪个IP?推荐用VRRP的虚拟IP作为giaddr的候选值,或者用实际接口IP也可以。如果DHCP服务器按地址池选择网段时不关心具体是哪个IP,只关心网段信息,实际效果差不多。但如果你在服务器上做了基于giaddr的地址保留或策略分配,那就要仔细设计giaddr的取值。
7.2 多网段中继的配置扩展
真正生产环境里一个中继设备往往要服务多个VLAN,每个VLAN一个接口(或子接口),每个接口上都要配置中继:
code复制interface GigabitEthernet0/0/0.10
dot1q termination vid 10
ip address 192.168.10.1 255.255.255.0
dhcp select relay
dhcp relay server-ip 192.168.20.2
interface GigabitEthernet0/0/0.20
dot1q termination vid 20
ip address 192.168.20.1 255.255.255.0
dhcp select relay
dhcp relay server-ip 192.168.20.2
VLANIF接口同理。每多一个网段,就多一份中继配置,服务器的地址池也要相应增加一个network。注意,DHCP服务器会通过giaddr判断客户端网段,所以中继填写的giaddr必须属于对应的网段地址池。
7.3 中继和DHCP Snooping的配合
如果你在交换设备上开了DHCP Snooping(防止私建DHCP服务器攻击),中继设备的接口信任关系也要注意。交换机上连接DHCP服务器(或中继设备上联口)的接口要设为信任接口,否则合法的Offer报文会被丢弃。这个坑在真实项目中经常出现,配置中继时一定要同步检查DHCP Snooping的信任列表。
7.4 中继模式的限制
做扩展实验时还要记住:中继模式下,DHCP服务器无法直接响应客户端的续租请求(RENEW)。因为续租是单播请求,直接发给DHCP服务器,不经过中继设备,服务器看到源地址属于其他网段时可能不会受理(具体取决于服务器是否配置了跨网段响应)。不过华为VRP的DHCP服务器默认会处理,大家可以实际验证一下。这个问题在真实网络中不算大事,但面试时可能会被问到。
8. 实验做完了,再多说几句家常经验
实验做通很简单,难的是把每个细节背后的原理都吃透。这个DHCP中继实验虽然小,但波及面很广——它涉及广播域、三层转发、DHCP协议交互、设备角色分工,还牵扯到模拟器自身的虚拟化问题。把这一步走扎实,后面学VRRP、DHCP Snooping、OSPF多区域,都会顺很多。
最后分享一个我个人的操作习惯:每次做实验前,先在纸上把拓扑画出来,把IP规划表填好,再动手配置。哪怕是在eNSP里做,也不要省这一步。我见过太多人一边敲命令一边改规划,最后PC的IP和网关对不上,绕了半小时才发现是规划问题。另一点是,所有配置完一定要用display命令验证一遍,不要相信自己的眼睛,要相信设备的实际状态。
如果你在照着做的时候卡住了,优先抓包。eNSP的抓包功能就是你手上的探针,它能帮你把抽象的"为什么不走"变成可见的报文流。把报文看懂,网络的问题就解决了一大半。
