DHCP协议详解:从DORA原理到华为路由器中继与Snooping配置
1. 项目概述为什么要折腾一台DHCP服务器我一直觉得DHCP这个东西属于那种“没有的时候不觉得一旦断网就五雷轰顶”的基础设施。你想想一个办公室五十台电脑要是全靠手工填IP、掩码、网关、DNSIT同事光是跑腿就得跑一天。而DHCP做的就是把“谁用什么地址”这件事交给服务器统一分配客户端开机时“伸手要”服务器回应“你拿去用”整个过程不需要人参与。这次实验的目标就是把这一整套流程从头到尾搭起来包括单网段分配、跨网段中继、以及内网已有物理DHCP服务器时交换机的配合方式。适合谁看两类人。一类是刚接触网络工程、准备考华为HCIA或者思科CCNA的学员实验里每一步都能在你自己的模拟器上复现另一类是负责公司内网运维的朋友尤其是那种“明明有DHCP服务器但个别网段的机器就是拿不到地址”的场面看完这篇多少能少走点弯路。实验本身不复杂但配置背后的原理值得掰开揉碎讲清楚——这也是我写这篇的初衷。2. 实验拓扑设计与核心原理2.1 一张图看懂DHCP工作流程要配置DHCP先得知道协议是怎么跑的。DHCP全称是Dynamic Host Configuration Protocol动态主机配置协议基于UDP工作客户端用端口68服务器用端口67。整个分配过程通常叫DORA四步Discover发现、Offer提供、Request请求、ACK确认。客户端开机后不知道网段里有谁在提供地址服务所以它会向255.255.255.255这个广播地址发一个Discover报文相当于站在路口喊“有没有人管地址分配”DHCP服务器收到后从地址池里挑一个可用IP通过Offer报文回应“这个地址给你用拿着”注意Offer仍然是以广播形式发的因为此刻客户端还没有IP。客户端收到一个或多个Offer后选择第一个或者最合适的再广播一个Request报文说“我就要这个地址”。服务器收到Request确认无误后发ACK客户端这才把IP正式配置到网卡上。整个过程看起来有点绕但广播这一步恰恰是理解中继的关键——广播不能跨网段所以跨网段时必须有DHCP中继来“转达”。2.2 实验拓扑一台路由器同时做服务器和中继这次实验我把拓扑精简成三台设备加两台PC全部在华为eNSP里完成。拓扑规划如下设备接口IP地址角色R1GigabitEthernet0/0/0192.168.10.1/24DHCP服务器、网关R1GigabitEthernet0/0/1192.168.20.1/24DHCP服务器、网关R1GigabitEthernet0/0/2192.168.30.1/24DHCP中继入口SW1VLAN 10---二层接入DHCP Server可用真机模拟192.168.20.10/24独立DHCP服务器20网段内的物理服务器20网段安装一台独立的DHCP服务软件Windows Server、Linux的dnsmasq都行专门给10、20、30三个网段分配地址。R1的G0/0/0和G0/0/1接口配置成“全局地址池模式”G0/0/2接口配中继模式把IP请求转移到20网段的那台物理服务器上。这样一来实验覆盖了“路由器自身做DHCP服务器”和“路由器做中继连接独立DHCP服务器”两种主流场景。2.3 为什么不用交换机直接配地址池有人会问华为的S系列交换机也可以配dhcp select global为什么我非要绕一圈用路由器做中继因为生产环境里交换机通常只是二层设备地址分配一般由核心路由器或者专门的DHCP服务器承担。交换机接口数量多如果每台接入交换机都配一个地址池地址空间会被切得七零八落后期排障会非常痛苦。中继模式的意义就在于DHCP服务器集中管理所有网段的地址池交换机或者接入路由器只负责把客户端的请求“转交”给服务器这样维护成本最低地址规划也最清晰。3. 实操配置路由器直接分配地址3.1 配置全局地址池前面提到VLAN 10和20由R1直接分配地址我们先把地址池建起来。华为路由器上全局地址池的配置思路是“先建池子再绑网关再定DNS”一步一步来system-view sysname R1 # 配置各接口地址 interface GigabitEthernet0/0/0 ip address 192.168.10.1 255.255.255.0 dhcp select global quit interface GigabitEthernet0/0/1 ip address 192.168.20.1 255.255.255.0 dhcp select global quit # 配置VLAN 10地址池 ip pool pool10 network 192.168.10.0 mask 255.255.255.0 gateway-list 192.168.10.1 dns-list 223.5.5.5 114.114.114.114 excluded-ip-address 192.168.10.201 192.168.10.254 lease day 7 hour 0 minute 0 quit # 配置VLAN 20地址池 ip pool pool20 network 192.168.20.0 mask 255.255.255.0 gateway-list 192.168.20.1 dns-list 223.5.5.5 114.114.114.114 excluded-ip-address 192.168.20.201 192.168.20.254 quit这里有个关键点接口上的dhcp select global意味着该接口接收到的DHCP请求会从全局地址池里选地址。华为的匹配逻辑是根据接口IP所在的网段去匹配地址池所以接口IP是192.168.10.1它就会去pool10里找地址。excluded-ip-address这一段非常实用。我把.201到.254这段地址预留出来是为了避免DHCP把地址发给打印机、门禁控制器或者临时接入的网管终端。你在生产环境里也建议提前把服务器、网络设备、打印机这类需要固定IP的终端排除掉不然过一段时间地址池的状态能把你逼疯。3.2 客户端验证PC怎么确认自己拿到了地址配置完成后在eNSP里把PC1的IP获取方式改成DHCP等上几秒钟PC会自动完成DORA四步。如果你想确认客户端到底拿到什么可以用命令行查看ipconfig ipconfig /all重点看IPv4地址、子网掩码、默认网关和DNS服务器。正常情况下PC1应该拿到192.168.10.x网段的一个地址网关是192.168.10.1DNS是223.5.5.5。然后在R1上用display ip pool查看地址池使用情况display ip pool输出会显示每个地址池的总地址数、已分配数、空闲数和排除地址数。再看更细的display ip pool name pool10 used这条命令会列出具体哪些IP分给了哪台设备还包括租约过期时间。排障时这条命令的价值在于你能立刻判断出到底是地址池耗尽还是某台设备反复获取导致地址被占用。3.3 设置静态绑定让特定终端永远拿同一个IP有些场景比如监控主机、无线AP、财务打印机你希望它每次拿到的IP都一样但又不想手工在终端上配置静态IP。这时可以用DHCP静态绑定ip pool pool10 static-bind ip-address 192.168.10.100 mac-address 5489-98c1-472a quit需要注意static-bind 与普通动态地址是两套逻辑静态绑定优先匹配MAC命中后直接分配固定地址没命中的设备才走动态池。配置完成后可以用display ip pool name pool10 static查看绑定的结果。这种方案比在终端上手工配静态IP要优雅得多终端搬走或者换网卡也不会因为和别的设备IP冲突而断网。4. 跨网段与DHCP中继一个服务器管三个网段4.1 中继为什么存在前面说过DHCP的Discover、Offer都是广播报文广播天然不能穿过路由器。VLAN 30里的PC如果直接发送广播请求R1收到后会直接丢弃因为它不知道这个请求该由谁来回答。这时候就需要在R1的入接口上配置DHCP中继功能R1收到VLAN 30的广播请求后把广播变成单播转发给指定的DHCP服务器服务器回应的Offer也先发到R1R1再转回给客户端。简单说中继就是“广播转单播”的翻译官。4.2 中继配置的关键命令假设那台独立的DHCP服务器在192.168.20.10现在要让190.168.30.0/24网段的PC也能从这台服务器获取IP。先确保服务器地址池里有30网段的范围然后在R1上interface GigabitEthernet0/0/2 ip address 192.168.30.1 255.255.255.0 dhcp select relay dhcp relay server-ip 192.168.20.10 quit光在R1上配中继还不够那台DHCP服务器上必须知道“我要为30网段的客户端分配地址”。以华为模拟器自带的服务器或者Windows DHCP为例你要在DHCP作用域里添加192.168.30.0/24网段网关设置成192.168.30.1路由器选项也填192.168.30.1DNS保持内网或公网DNS都可以。如果服务器上只有20网段的作用域30网段的客户端请求即使被中继到达服务器服务器也会因为没有可用的作用域而静默丢弃客户端永远拿不到地址。4.3 多网段共享一个DHCP服务器的常见坑把三个网段全部放到一台服务器上管理表面上命令很简单实际容易踩坑的点不少我挑几个高频的中继接口上忘记敲dhcp select relay。常见现象是客户端一直“正在获取地址”抓包能看到Discover一直在重发。中继接口上指定了server-ip但R1到达该IP的路由不通。比如20网段down了R1虽然能转发报文但服务器不可达中继自然失效。服务器的地址池没建全。你有三个网段但服务器只配置了10和2030的客户端请求到了服务器也没回应。多网段时地址池里的DNS、网关选项必须写对尤其网关写错的话客户端能拿到IP但上不了网。很多刚学的人以为地址分配成功就万事大吉结果Ping网关都不通一查全是选项配错。我在做这个实验时习惯把服务器的所有作用域建好后再查看中继。验证完成后在PC上执行ipconfig /renew再用display dhcp relay statistics看看中继有没有转发数据如果Relay转发计数一直往上走说明中继链路是通的。5. 内网已有物理DHCP服务器交换机该怎么配合5.1 冲突场景分析很多时候内网并不是从零搭建的而是“以前有一台物理DHCP服务器现在新增了几个网段的交换机”又或者“IT部门想知道交换机是否和现有DHCP服务器冲突”。题目里的“内网有物理DHCP服务器交换机如何配置”在真实场景里分两种情况第一种交换机直接透传不参与任何DHCP逻辑叫“偷懒做法”第二种交换机开启DHCP Snooping把合法服务器的报文放行把私设的DHCP服务器报文掐掉叫“安全做法”。我的建议是永远选第二种。因为物理服务器的地址池管理再规范也架不住有人偷偷在办公室里接了一个家用路由器它内置的DHCP功能可能瞬间把你的地址规划打乱。你能想象一整个部门突然变成192.168.1.x吗我见过这种现场排查起来极其痛苦。5.2 DHCP Snooping配置步骤以华为S5700交换机为例配置DHCP Snooping的思路是“全局开启VLAN开启接口设置信任”三层缺一不可system-view dhcp enable dhcp snooping enable # 进入业务VLAN vlan 10 dhcp snooping enable quit # 上联口连接合法DHCP服务器/路由器设为信任 interface GigabitEthernet0/0/1 dhcp snooping trusted quit # 下联口接PC默认不信任 interface GigabitEthernet0/0/2 dhcp snooping enable quit华为、思科默认情况下开启Snooping后并非所有端口都是不信任的不同版本有差异。最稳妥的办法是全局开启后在关键接口上显式配置trusted和untrueted永远不要靠默认值。配置完成后查看命令是display dhcp snooping enable display dhcp snooping trusted display dhcp snooping statistics遇到私设DHCP服务器时display dhcp snooping statistics里会有丢弃计数同时日志里也会记录 “DHCP SNOOPING DROP” 之类的信息。看到一个IP地址在反复发Offer基本就能锁定是哪台设备了。5.3 物理服务器与虚拟化网卡vNIC的注意事项现在环境里有个热搜词提到“dhcp服务器为vnic”意思是DHCP给虚拟机的虚拟网卡分配地址。如果你用VMware或者VirtualBox做实验虚拟网卡在桥接模式下会直接从物理交换机上获取IP相当于一台真实主机。但如果用的是NAT模式虚拟机是从宿主机自己运行的虚拟DHCP服务拿地址和外面交换机没有关系。一个很常见的坑是物理机安装了虚拟化软件后宿主机上会出现多个vNIC这些虚拟网卡也会发DHCP请求从而“抢走”地址池里的地址。你打开地址池一看分配出去的IP比设备总数还多不用怀疑多半是虚拟机网卡在反复获取。解决办法有两种要么在地址池里把虚拟机网卡所在的MAC排除要么在虚拟机的虚拟交换机上关掉DHCP改成手动指定IP。我个人更推荐后者因为虚拟机的IP变化太频繁会加剧地址池碎片化。6. 实战排障那些让我半夜加班的DHCP问题6.1 PC获取不到IP先从客户端和服务端两头查这是最经典的故障。排查路径要遵循“由近到远从中心到边缘”的原则我一般按这个顺序来先确认客户端网线、网卡驱动、交换机接口正常可以在客户端手工配置一个同网段的静态IPPing网关。不通说明问题根本不在DHCP而是链路问题。再用display dhcp server statistics看服务器收没收到Discover。如果R1上Discovery报文计数是0说明广播根本没到路由器十有八九是二层链路问题或者接口没配dhcp select global。如果在Discovery计数有但Offer计数为0说明地址池没匹配上或者地址池已耗尽。用display ip pool查看空闲地址数如果空闲为0把租期调短或者扩容网段。如果Offer有但客户端没拿到就要抓包看看是不是多台DHCP服务器同时回应客户选择了错误的Offer。常见于私设路由器开启了DHCP这时需要启用上一节的Snooping。6.2 客户端拿到错误网段的IP多半是地址池匹配顺序问题华为路由器上如果客户端从G0/0/0接口进来它希望匹配192.168.10.0/24的地址池但如果地址池配置错误比如你把pool20的network写成192.168.10.0或者接口上漏了dhcp select global客户端可能会拿到一个完全不相干的IP。更隐蔽的问题是全局地址池里同时存在多个网段并且接口IP不在任何池的范围内华为会按照池的创建顺序挑第一个合适的池分配。比如接口是192.168.40.1/24但你没建40网段的池客户端就可能请求时被分到192.168.10.x网段客户端拿到后发现网关不通一直显示“未识别的网络”。所以配置完地址池后一定要用display ip pool核对一下别想当然。6.3 华为设备查看DHCP配置的命令速查多看几遍这些命令排障效率会高很多需求命令查看所有地址池信息display ip pool查看某个池的分配明细display ip pool name pool10 used查看DHCP服务器统计display dhcp server statistics查看中继统计display dhcp relay statistics查看Snooping状态display dhcp snooping enable查看信任端口display dhcp snooping trusted开启调试debugging dhcp server packet调试命令在生产环境慎用它会打印大量报文内容实测下来CPU占用会明显升高。我一般在模拟器里抓包用Wireshark过滤bootp关键字就够了真实设备上则先看统计再决定是否开启debugging。6.4 地址冲突与租期问题地址冲突是另一种常见故障。客户端拿到IP后发现网关或者同网段其他设备也用了同一地址表现出来就是“网络时通时断”。在华为上可以开启ARP冲突检测也可以在地址池里用excluded-ip-address把服务器和打印机先排除出去。租期方面办公网络建议租期设置24小时或者7天太短会导致广播报文频繁刷屏太长则会让地址池释放变慢。移动设备多的访客网络可以把租期设成2小时反正访客终端每次重新连接都愿意等待。7. 最后的实践建议这套实验做下来我的最大感受是DHCP配置本身不难难的是理解它背后的三层逻辑——广播请求、中继转发、地址池匹配。配置命令背得再熟不理解“为什么30网段的请求要到20网段的服务器上拿地址”出问题时照样抓瞎。给后来者几个建议。第一测试环境务必搭建完整的三个角色客户端、路由器/交换机、独立DHCP服务器别图省事把所有功能堆在一台设备上否则排障时你会分不清是路由器的问题还是地址池的问题。第二养成用display ip pool查看地址池现状的习惯它比ping一万个IP有用得多。第三模拟器里能复现的故障尽量全复现一遍比如删掉地址池、停掉中继、私设一台假DHCP服务器经历过这几种故障后你再遇到类似问题就会条件反射地排查。DHCP这个协议做到了解透彻其实也就是把DORA四步和地址池的匹配规则搞得明明白白而已。