
算下来这个话题我其实琢磨了很久。前几天有位朋友公司搬了新办公区财务部电脑挪到另一个楼层之后客户端始终卡在“获取IP地址”阶段最终弹出一个黄色感叹号。我过去看了一眼配置DHCP服务器在机房服务器区而财务部终端已经划分到了新的VLAN中间隔了台H3C路由器。问题立刻就清楚了这不是DHCP服务器配置出了问题而是跨网段广播报文根本没有送达到服务器。用H3C路由器配置DHCP中继方式获得IP地址是解决这类场景最标准、也最省事的方案本文就从一个真实的网络改造项目出发把原理、配置、验证和排错链路完整拆开讲一遍给同样在维护园区网络的同行做个参考。1. 先搞清楚为什么会有“DHCP中继”这种配置需求1.1 一次跨网段“拿不到IP”的现场回到开头那个朋友公司的现场。财务部那台电脑手动指定IP就能上网一旦改成自动获取就一直在转圈最后拿到一个169.254.x.x的地址。这个地址是Windows在DHCP失败后自己生成的APIPA地址属于“没有任何DHCP服务器回应”的典型特征。我问他“财务电脑和DHCP服务器的网关是不是同一个”他检查后发现DHCP服务器在192.168.100.0/24网段财务终端在192.168.10.0/24网段中间隔着新加的路由器和楼层交换机二层广播根本进不到服务器。这个现象在真实办公网络里太常见了。DHCP服务器集中放在机房业务终端分散在不同楼层、不同VLAN中间全部是三层设备。客户端发出的DHCP请求是广播包广播包只能在同一个二层广播域内传播跨不过路由器。如果不在网关设备上做任何处理客户端就永远等不到服务器的回应。1.2 DHCP协议为什么靠广播而广播又为什么跨不了三层先回顾一下DHCP的正常工作过程。客户端不知道自己该从哪个服务器获取地址所以它发出的第一个报文是目的地址为255.255.255.255的广播Discover。服务器收到后回一个Offer客户端再广播Request服务器最后广播或单播ACK。这就是常说的DHCP四步交互。其中最关键的一点Discover和Request都是广播帧。广播帧是二层概念交换机负责在同一个VLAN内复制转发但路由器接口收到广播帧后默认不会把它转发到其他网段因为那个网段属于另一个广播域。这正是“DHCP服务器和客户端不在同一网段就获取不到地址”的根本原因。1.3 DHCP中继的定位把广播变成单播再转发DHCP中继DHCP Relay的思路就是让客户端所在网段的三层设备替客户端“跑腿”。中继设备收到接口下的广播Discover后不把它当成普通广播丢弃而是根据配置把它封装成单播报文发给指定的DHCP服务器IP同时在报文的giaddr字段中填入接收这个广播的接口IP地址。服务器通过giaddr字段就能判断这个请求来自哪个网段然后从对应的IP地址池里挑一个合适的地址通过中继设备返回给客户端。所以DHCP中继本质上是把“跨网段广播无法传播”的问题转化成了“中继设备负责单播通信”的问题配置虽然只有几条命令但背后的机制非常巧妙。提示DHCP中继并不是H3C的私有功能而是RFC 1542定义的标准机制几乎所有三层交换机、路由器、防火墙都支持只不过不同厂商的命令和细节有差异。理解了原理换到哪个品牌都能举一反三。2. 动手前的拓扑规划与地址池设计2.1 一个典型的多VLAN办公网络拓扑先给出一套本文反复使用的示例拓扑。假设公司有一台H3C MSR系列路由器作为各业务VLAN的网关DHCP服务器在服务器区各楼层终端分散在不同VLAN。具体的地址规划如下表所示区域网段网关/接口说明服务器区192.168.100.0/24GE0/2: 192.168.100.1DHCP服务器地址192.168.100.254VLAN 10 财务部192.168.10.0/24GE0/0: 192.168.10.1客户端自动获取地址VLAN 20 人事部192.168.20.0/24GE0/1: 192.168.20.1客户端自动获取地址这里的关键点是客户端的网关都终结在H3C路由器上。如果网关在核心交换机上配置思路完全一样只是把物理接口换成Vlanif接口而已。2.2 地址池和网关怎么规划才不打架地址池规划是最容易给后面埋雷的地方。第一不要把网关地址包含进自动分配地址池。虽然多数DHCP服务器会排除保留地址但如果你用的是老版本或者第三方DHCP服务网关地址被分配出去的概率依然存在最好的习惯是地址池单独划一段例如192.168.10.100开始前面1到99留给固定IP设备。第二多个VLAN绝对不能共用同一个地址池。服务器判断给客户端哪个网段的IP靠的是中继报文里的giaddr字段。如果服务器端没有和giaddr一一对应的独立地址池就会出现“电脑明明在VLAN 10却拿到了VLAN 20网段的IP”这种诡异问题。第三地址池的租期也要提前规划。办公网络里的PC租期设个1天到3天比较合适如果现场有大量无线终端频繁漫游租期可以缩短到6到12小时避免地址池里囤积大量还在租期内但已经无人在用的租约。2.3 配置前需要确认的设备信息和权限正式上设备之前我建议先做四件事。一是确认H3C路由器的具体软件版本V5平台和V7平台的命令虽然总体一致但细节有差异后面会单独讲。二是确认路由器各接口IP已经配置完成并且路由器能ping通DHCP服务器。三是确认管理账号有系统视图权限普通企业环境用admin基本足够。四是确认DHCP服务器侧的防火墙策略允许UDP 67/68端口通信如果服务器是Windows Server还要看自带的防火墙有没有放行DHCP服务。把这些准备工作做完后面配置和排障的时候会顺畅很多。3. H3C路由器DHCP中继配置的完整操作3.1 全局开启DHCP服务H3C设备默认不一定会开启DHCP功能所以第一步是到系统视图下把全局服务打开。system-view dhcp enable这一步经常被人忽略。中继功能和服务器功能虽然在工作原理上是两件事但H3C的DHCP中继进程依赖全局DHCP服务处于使能状态。如果后面发现中继不转发报文回查配置时优先看这里。3.2 在客户端侧接口启用中继模式进入连接客户端网段的三层接口把该接口的DHCP模式切换到中继。interface GigabitEthernet0/0 ip address 192.168.10.1 255.255.255.0 dhcp select relaydhcp select relay的含义是这个接口不再作为DHCP服务器响应请求而是作为DHCP中继转发请求。同一个接口下中继模式和服务器模式只能二选一。如果你用的是H3C三层交换机而不是路由器对应操作是在Vlanif接口下执行同一套命令原理没有区别。3.3 指定DHCP服务器的IP地址继续在中继接口下指定要转发的目标服务器地址。dhcp relay server-address 192.168.100.254把VLAN 10和VLAN 20两个接口都配完完整配置是interface GigabitEthernet0/0 ip address 192.168.10.1 255.255.255.0 dhcp select relay dhcp relay server-address 192.168.100.254 interface GigabitEthernet0/1 ip address 192.168.20.1 255.255.255.0 dhcp select relay dhcp relay server-address 192.168.100.254有人会问两个接口都指向同一台DHCP服务器服务器能区分出该分哪段地址吗答案是能。中继在转发时会自动把接收接口的IP地址填入giaddr字段。比如从GE0/0进来的请求giaddr就是192.168.10.1从GE0/1进来的请求giaddr就是192.168.20.1。服务器读取这个字段就能准确判断客户端所在网段。3.4 服务器端地址池的关键配置如果DHCP服务器也是一台H3C设备那么在服务器侧需要创建与giaddr一一对应的地址池。dhcp server ip-pool vlan10 network 192.168.10.0 mask 255.255.255.0 gateway-list 192.168.10.1 dns-list 114.114.114.114 8.8.8.8 expired day 1 hour 2 dhcp server ip-pool vlan20 network 192.168.20.0 mask 255.255.255.0 gateway-list 192.168.20.1 dns-list 114.114.114.114 8.8.8.8这里有一个非常容易写错的点gateway-list必须填写中继接口的IP地址也就是192.168.10.1和192.168.20.1不能填DHCP服务器自己的地址。客户端是通过中继获取地址的它拿到的默认网关必须是指向自己网段的三层地址。如果填错客户端即使拿到了IP地址也无法通过网关访问外网ping网关都通不了。如果DHCP服务器是Windows Server地址池配置页面里对应的是“作用域选项”中的003路由器、006 DNS服务器功能完全等价只是操作界面不同。生产环境中常见的问题是Windows管理员只建了作用域忘了配置作用域选项结果客户端能拿到IP但上不了网。3.5 保存配置与验证配置结果配置完成后记得保存避免设备重启丢失。save force然后查看中继服务器地址是否已经生效。display dhcp relay server-address正常输出类似这样Interface ServerAddress GE0/0 192.168.100.254 GE0/1 192.168.100.254看到接口和服务器地址都对应上了说明中继配置已经生效。4. 验证中继是否生效客户端获取IP的实测方法4.1 客户端重新获取IP地址在客户端上执行释放和重新获取ipconfig /release ipconfig /renew正常情况下几秒内客户端就能拿到192.168.10.x网段的地址、默认网关和DNS。如果客户端依然卡在“获取网络地址”或拿到169.254.x.x说明中继链路中还有问题没解决直接进入第5章的排错链路。除了客户端侧看结果也可以在中继路由器或DHCP服务器上看租约记录。H3C设备上可以用display dhcp server ip-in-use查看当前下发的租约如果能看到来自192.168.10.x和192.168.20.x网段的记录证明中继、服务器、地址池三层配合都是正常的。4.2 中继统计里能看出什么问题在配置了中继的路由器上执行display dhcp relay statistics输出会显示中继进程接收和转发的报文统计。比如DHCP Relay Statistics: Received packets: 128 Forwarded packets: 126 Dropped packets: 2如果Forwarded一直是0说明中继没有把任何请求转出去问题大概率在中继配置、接口状态或路由可达性上。如果Forwarded有值但客户端还是拿不到地址那问题就转移到了服务器侧或者回程路径比如地址池耗尽、服务器防火墙拦截、交换机DHCP Snooping丢弃等。4.3 抓包确认Discover和Offer交互手边有条件的话建议在DHCP服务器侧抓一下UDP 67端口的数据包。确认中继是否正常工作最直接的证据是在抓包结果里看到来自192.168.100.1中继接口的单播Discover请求并且报文中的giaddr字段是客户端所在网段的网关IP。这样就能把中继、转发、地址池选择三个环节一次验证清楚。如果没有条件在服务器侧抓包可以在路由器上开启DHCP中继调试debugging dhcp relay packet生产环境慎用debug因为它会大量打印报文信息可能瞬间刷屏影响设备CPU。现场确认完问题立刻关闭操作的时候要注意当前设备负载。5. 实际排障中继配好但客户端拿不到IP的排查链路5.1 第一步确认中继接口配置没被覆盖先查看接口下的实际配置display current-configuration interface GigabitEthernet0/0确认存在dhcp select relay和dhcp relay server-address。有一个隐蔽的坑如果同一台路由器上还有其它接口配置了dhcp select server在部分旧版本中不同接口的DHCP工作模式之间可能存在干扰导致中继接口不生效。遇到这种情况最稳妥的办法是把不需要提供DHCP服务的接口全部改成不启用DHCP模式只保留中继接口和服务器侧的必要接口。5.2 第二步看中继有没有把请求转出去再一次强调要看display dhcp relay statistics。如果Forwarded为0回到第3节检查几个基础项全局是否已执行dhcp enable中继接口是不是三层接口接口下是否配置了dhcp select relay路由器到DHCP服务器是否可达可以直接ping 192.168.100.254验证这一套基础项能解决至少八成“中继不工作”的问题大多数情况都是漏了全局开启或者接口模式选错。5.3 第三步检查地址池与giaddr的匹配关系如果中继的转发统计正常但客户端依然拿不到地址接下来要检查服务器的地址池。在H3C服务器侧使用display dhcp server pool逐一核对每个地址池的network网段是否与giaddr对应gateway-list是否填写了中继接口IP。再查一下地址池剩余地址数display dhcp server free-address如果地址池已经满租也会表现成客户端一直拿不到IP。很多大型办公网络中这个情况非常隐蔽因为中继工作完全正常但池子已经没地址可分配了只有看剩余地址数才能发现。5.4 第四步排查交换机DHCP Snooping拦路很多园区交换机默认或人为开启了DHCP Snooping。这个功能本身是用来防止私接DHCP服务器欺骗客户端的它只允许从信任端口进入的DHCP服务器报文通过。如果中继侧连接交换机端口没有设置成信任口DHCP Offer报文会被交换机直接丢弃客户端自然收不到服务器的回应。在接入或汇聚交换机上确认并调整interface GigabitEthernet1/0/1 dhcp snooping trust端口对应关系要按实际拓扑来判断面向DHCP中继设备/合法服务器方向的端口要设为信任口面向普通终端的端口不用设置。5.5 第五步防火墙和UDP 67/68端口规则如果DHCP服务器部署在独立服务器或者安全区排查一下服务器防火墙有没有放行UDP 67/68端口。很多Windows管理员在配置DHCP角色时会顺手打开服务器管理里的防火墙规则但如果是自定义端口策略很容易漏掉DHCP服务对应的这个UDP端口段。从路由角度理解中继转发出去的报文源地址是路由器接口IP目的地址是DHCP服务器IP源目端口都是UDP 67/68。只要从路由器到服务器方向IP可达、端口没被防火墙阻断中继过程就可以正常完成。6. 版本差异和进阶配置建议6.1 H3C不同平台命令差异H3C设备目前主流是V5和V7两套体系。V7平台如MSR830、MSR900、MSR1000等命令比较统一就是本文前面一直用的这套写法。V5平台老款MSR20、MSR30系列在中继配置上也是dhcp select relay和dhcp relay server-address全局也有dhcp enable基本思路一致。但有些老设备在接口下需要额外指定dhcp relay server-address后还要确认giaddr填充方式不同版本的默认行为略有区别。建议配置前先执行display version确认当前软件版本再到对应产品的手册里检索一下命令格式避免把V5的配置直接套到V7上或者反过来。6.2 多DHCP服务器场景下的冗余选择如果网络里有主备两台DHCP服务器H3C中继接口支持配置多条dhcp relay server-address。中继会优先把请求转发给第一条配置的服务器第一条不可达时再尝试后续的服务器。这种机制非常适合简单的主备冗余场景配置时只要把一个接口下的多条服务器地址按优先级排好顺序即可。需要说明的是这个冗余粒度相对较粗它只保证“有服务器能收到请求”不保证两个服务器的地址池一定同步。生产环境里如果使用两台DHCP服务器最好还是先做好地址池同步方案再依赖中继的多服务器配置。6.3 中继与网关高可用的联动思路配置DHCP中继的接口通常就是客户端的网关接口中继本身就绑定在网关设备上。如果担心单台路由器故障导致整个网段失去IP分配能力可以考虑部署两台H3C路由器做VRRP让中继接口的IP作为虚拟网关IP。两台设备上都配置相同的中继命令指向同一台DHCP服务器。网关主备切换时中继功能也会随之平滑切换。不过以我个人观察在中小型办公网络里DHCP中继本身是一个非常轻量、稳定可靠的功能真正需要重点盯防的往往不是中继进程挂了而是地址池规划混乱、租约耗尽、交换机Snooping配置错误这些问题。与其盲目堆高可用不如先把基础配置和文档整理好。最后再分享一点实际体会我见过不少网管遇到“跨网段拿不到IP”时第一反应是去改DHCP服务器或者干脆在每台交换机上都起一个DHCP服务结果就是地址池分散、管理界面乱七八糟以后排查成本反而更高。其实DHCP中继这个机制非常成熟配置量很小它把“跨网段广播转发”的复杂度转移到了网络设备上。建议各位在动手之前先把网段、网关、地址池、服务器地址的对应关系画成一张表再上设备敲命令能少走不少弯路。