
开头先讲个真事。前两年给一家两百多人的公司做网络整改他们一直用Windows Server当DHCP服务器。某个周一早上全公司电脑集体转圈office那边所有终端获取不到IP一查是那台服务器在前一天夜里装完系统补丁之后DHCP服务直接起不来了。那天上午基本瘫痪了两个多小时最后我远程让值班同事把DHCP服务手动拉起才恢复。也就是从那次之后我只要碰到规模不大不小、需要高稳定性的内网方案里都会优先考虑直接把DHCP服务器配置做到华为核心交换机上省一台服务器、少一层依赖、稳定得离谱。这篇就把我这几年在华为核心交换机上做DHCP服务器配置的完整过程和排错思路整理出来适合正在做企业内网改造、或者刚接手华为数通设备还不太熟悉DHCP这块的运维同行。标题说是核心交换机实际上华为的S5700、S6700、CE系列三层交换机甚至小到S2700只要支持DHCP功能的型号配置思路都差不多。下面尽量把命令原理、参数设计和坑都讲透别只看命令不看逻辑不然换个环境照样翻车。1. 什么情况下适合把DHCP服务搬到核心交换机上1.1 独立DHCP服务器和交换机内置DHCP的取舍这是很多人在方案设计阶段就会纠结的问题。独立服务器方案听着灵活加域、DNS、DHCP全放Windows Server上还能做日志审计。但真放到几百人的中小网络里问题其实也不少。先说维护成本。Windows服务器每个月要打补丁补丁装完没人盯着就可能在凌晨自动重启你的DHCP服务、网卡驱动、防火墙策略任何一个环节出问题全公司终端跟着遭殃。而华为核心交换机上的DHCP服务是设备软件功能的一部分随系统跑不受补丁周期影响只要设备本身不重启这个服务就一直在线。再说稳定性。终端通过广播报文寻找DHCP服务器如果中间隔着二层设备那就要做DHCP Relay多一层配置就多一层风险。而核心交换机本身就是终端的网关地址池、网关、DNS全部在同一台设备上逻辑闭环不需要依赖外部链路。DHCP请求广播一上来交换机本地就给你分配了延迟极低。当然独立服务器也有不可替代的场景比如要做复杂的IPAMIP地址管理规划、要和AD域控联动做基于用户组的差异化策略输出、要跨多个分公司统一管理地址池等。这类场景用独立DHCP服务器是对的。但如果你只是想让一个园区、一栋楼、一二百台终端的网络省心把DHCP架在核心交换机上性价比确实更高。1.2 核心交换机DHCP服务的能力边界与适用规模很多第一次尝试在交换机上做DHCP的同行总担心设备扛不住。这里说实话华为交换机内置DHCP服务器的地址池规格是跟着设备型号走的。像S5700系列的EI型号单台设备的DHCP租约数量做到一两千个基本没问题S6700和CE系列更不用说了。对中小企业或者一个中型园区的接入终端来说性能完全够用。但它也确实有短板。交换机的DHCP实现更偏向基础、稳定、可靠不会像Windows Server那么花哨。比如你不容易做到按MAC地址段差异化分配DNS、按接入位置分配不同网段这种精细策略高级报表和审计能力也基本没有。所以我的建议是网络规模在5000终端以下、地址池相对规整、不需要花哨动态策略的大胆用交换机DHCP要做精细化、策略化、集中化管理的再考虑独立服务器方案。还有一个点容易被忽略交换机内置DHCP和DHCP Snooping、IPSGIP Source Guard、ARP Detection这些安全特性是天然联动的。后面我会详细讲这套联动在防私接路由器、防ARP欺骗方面非常给力这是Windows DHCP替代不了的。2. 配置前必须想清楚的参数VLAN、租期、排除地址2.1 一个VLAN一个网段地址池与VLANIF的对应关系最理想的内网设计是一个VLAN对应一个三层网段。比如VLAN 10对应192.168.10.0/24VLAN 20对应192.168.20.0/24。终端的网关就是VLANIF接口上的IP地址也就是192.168.10.1和192.168.20.1。要注意的是华为交换机的DHCP地址池分两种类型全局地址池和接口地址池。全局地址池在系统视图下创建需要手动指定网段、网关、DNS然后用的时候在VLANIF下调用接口地址池则直接吃掉VLANIF接口自己所在的那个网段不用单独写网段和网关。我见过不少同事在配置全局地址池的时候把network和gateway-list填错。有个很典型的案例VLANIF 10是192.168.10.1结果地址池里network写成了192.168.20.0网关写成了192.168.20.1。终端从VLAN 10发DHCP Discover交换机虽然回了Offer但Offer里面告诉终端你的网关是192.168.20.1这个网关对192.168.10网段的终端来说根本不可达结果就是IP能拿到、上不了网。所以配置之前的网络规划一定要理清楚终端在哪个VLAN、网关是谁、地址池网段应该和VLANIF保持一致。这里没有捷径画一张VLAN和IP规划的表格贴在工位上比啥都强。2.2 租期、DNS和排除地址影响上线稳定性的三个细节先聊租期。华为设备默认的租期是1天也就是lease day 1。这个参数对办公网络来说其实可以有讲究如果你的终端固定工位、基本不挪动租期设成3天、7天能明显减少DHCP续租报文减少不必要的广播如果是访客WiFi、会议室这种终端流动性强的场景租期反而要设短比如1小时、半天让地址尽快释放回池子。再说DNS。这是很多人配置DHCP的时候随手一填但填错了查半天的一个点。内网有域控或者内部DNS解析需求的一定要把内网DNS写在前面比如dns-list 10.0.0.2 114.114.114.114让终端优先用内网DNS做解析否则加域、访问内部OA系统全都会出问题。纯粹对外的场景就用公共DNS114.114.114.114、223.5.5.5、119.29.29.29都行。最后是排除地址。这个特别容易掉坑。任何网段里都有一些地址是不能动态分配出去的网关地址本身、交换机和上行口的互联地址、打印机、门禁控制器、视频会议终端、服务器这些需要固定IP的设备。这些地址如果不放进excluded-ip-address里面DHCP服务器很可能把一个已经手工配置到打印机上的IP分配给了某台电脑冲突就来了。3. 全局地址池配置从dhcp enable到地址分配成功3.1 三步开启DHCP全局服务并创建地址池先上一个最小可用的配置。假设场景是这样的VLAN 10网段192.168.10.0/24网关192.168.10.1DNS用公共DNS动态分配的地址范围避开前面20个地址和最后10个地址。system-view sysname CoreSW dhcp enable ip pool vlan10 gateway-list 192.168.10.1 network 192.168.10.0 mask 255.255.255.0 dns-list 114.114.114.114 223.5.5.5 lease day 1 hour 0 minute 0 excluded-ip-address 192.168.10.1 192.168.10.20 excluded-ip-address 192.168.10.240 192.168.10.254逐条说下我的习惯。sysname CoreSW不是必须的但强烈建议改。后面排查的时候看一眼命令行提示符就知道自己在哪台设备上尤其当你有几台交换机要同时操作的时候这个习惯能救你命。dhcp enable是全局总开关这一条忘了后面所有配置都白搭。我排障的时候甚至碰到过前面的人配置了地址池、配置了VLANIF下的dhcp select global就是没开全局dhcp enable结果客户端一直获取不到地址查了半天才发现是总开关没打。ip pool vlan10是创建全局地址池名字可以随便起但建议和VLAN编号对应比如vlan10、vlan20后期看配置一目了然。进入地址池视图之后gateway-list是给客户端下发的网关地址network是真正用于动态分配的网段。这两个参数必须和对应VLANIF的网段匹配否则就会出现前一节说到的拿到IP但上不了网。lease day 1 hour 0 minute 0是显式设置租期一天其实设备默认就是一天但写出来有两个好处一是提醒自己这里有个参数可调二是后续排查配置的人能一眼看到你这个池子的租期设计意图。还有一个细节mask这里我习惯写完整的255.255.255.0虽然华为较新版本也支持mask 24这种写法但写完整掩码在跨版本兼容性上更稳妥尤其你手头设备软件版本比较老的时候。3.2 在VLANIF接口上绑定DHCP服务配置完地址池还要让对应的三层接口知道去用这个池子。假设VLAN 10的三层接口是VLANIF 10在接口视图下绑定interface vlanif 10 ip address 192.168.10.1 255.255.255.0 dhcp select globaldhcp select global的意思很直白在这个接口上当收到终端发来的DHCP请求时从全局地址池里挑一个匹配的来分配。这是手工创建的全局地址池的标准玩法。注意一个隐含前提VLANIF 10要能正常参与转发VLAN 10必须存在而且至少要有一个属于VLAN 10的二层接口在UP状态。否则VLANIF 10起不来后面配的dhcp select global也就无从谈起。所以配置顺序我建议是先在系统视图创建VLAN、把物理口加入VLAN再创建VLANIF并配置IP最后做DHCP相关配置。如果你需要在这个VLANIF接口下覆盖DNS也可以直接加一句dhcp server dns-list 114.114.114.114接口级配置的优先级是高于全局地址池参数的这个特性在做特殊VLAN差异化配置时很有用。3.3 用三条命令完成配置验证配置敲完之后先别急着走人。验证这一步我做得很固定基本就是三条命令display ip pool vlan10 all display ip pool vlan10 used display dhcp snooping user bindingdisplay ip pool vlan10 all看的是什么主要是地址池的配置参数和动态分配状态。网络、网关、DNS、租期、排除范围有没有按预期写进去一目了然。如果这里显示的状态跟你的预期不一致先别怀疑DHCP客户端回去检查地址池配置。display ip pool vlan10 used是用来确认实际被占用的地址有哪些。如果这个地址池已经跑了很久used列表里还能看到某个IP对应的MAC地址你可以判断是哪台终端占着这个IP也方便判断地址池压力。地址池快用完的时候这个命令的输出会非常直观地提醒你下面该考虑扩容网段或优化租期了。display dhcp snooping user binding这条我是在配置了DHCP Snooping之后必看的它显示的是交换机通过Snooping学习到的IP-MAC绑定表。顺便说一句这个绑定表是后面要做ARP Detection、IPSG的数据基础表里信息对不对直接决定了安全策略准不准。另外验证终端侧Windows上就是ipconfig /release再ipconfig /renewLinux就是dhclient或者nmcli重新连一次。拿到地址之后先ping网关再ping外网一层层排除别一上来就怪DHCP。4. 接口地址池和固定IP分配两种进阶玩法4.1 接口地址池的适用场景全局地址池适合多网段、参数统一管理的场景。但如果你手头只是一个很小的分支比如一台交换机、一个VLAN、一个C类网段用接口地址池会更简单。接口地址池的思路是不单独创建ip pool直接让VLANIF接口吃自己所在网段然后用dhcp select interface开启。典型配置interface vlanif 20 ip address 192.168.20.1 255.255.255.0 dhcp select interface dhcp server dns-list 114.114.114.114 dhcp server lease day 3注意看接口地址池模式下network和gateway-list都不用写了。地址池的网段自动等于接口所在网段网关自动等于接口IP。这种设计就从根本上消除了地址池和VLANIF网段不匹配的问题可以说是给懒人和急性子准备的解决方案。它的缺点是灵活性低。一个接口地址池就是接口自己的网段想在这下面单独排除某一段地址或者想配一个差异化的option参数还得靠接口视图下的dhcp server系列命令去堆比全局地址池麻烦一些。所以在多VLAN、多网段的园区场景我还是用全局地址池为主接口地址池作为补充。4.2 基于MAC的固定IP分配固定IP分配这个需求几乎百分之百会遇到打印机需要固定IP、考勤机需要固定IP、财务的加密狗要求固定IP、监控NVR需要固定IP。在企业内网里用DHCP静态绑定也叫基于MAC地址的固定IP分配比一台台登录设备手动配IP要高效率一个量级。全局地址池下的静态绑定ip pool vlan10 static-bind ip-address 192.168.10.100 mask 255.255.255.0 static-bind mac-address aaaa-bbcc-ddee接口地址池下的静态绑定interface vlanif 10 dhcp server static-bind ip-address 192.168.10.100 mask 255.255.255.0 dhcp server static-bind mac-address aaaa-bbcc-ddee这里必须重点强调一个细节华为设备里写MAC地址格式是xxxx-xxxx-xxxx带的是短横线不是Windows或者部分文档里写的冒号。我第一次配的时候就是按Windows的MAC格式把冒号写上去了结果设备直接报错后来才反应过来。另外这里的mask必须写即使你想绑定的地址在一个24位掩码网段里这个255.255.255.0也不能省。还有一个容易忽略的点静态绑定的IP地址最好从动态分配范围里排除掉。举个例子你的地址池是192.168.10.0/24你把192.168.10.100静态绑给了打印机但你没在动态地址池里排除它。那么愤怒的事件就会发生DHCP服务器可能把这个IP也分配给某台电脑形成IP冲突。所以静态绑定和排除地址控制要一起设计。比较稳妥的做法是规划网段时把后面一段比如.200-.254专门留给静态绑定设备同时把这些地址全部写进excluded-ip-address让动态池永远碰不到它们。5. DHCP Snooping联动配置防私接路由器和ARP攻击的基础5.1 为什么私接路由器会让全网掉线这应该是每个运维都经历过的噩梦某天早上办公室网络集体掉线查了半天发现是某个员工在工位上私接了一个家用路由器当无线AP用。家用路由器的LAN口又把内网线插上了而它的WAN口根本没用等于这个路由器变成了一个野生DHCP服务器在同一个广播域里抢先回应终端的DHCP Discover。更糟的是终端一旦拿到它分配的IP网关就变成了192.168.1.1这种家用网段完全上不了外网。这就是典型的内网DHCP冲突也是DHCP Snooping要解决的核心问题。DHCP Snooping的原理一句话交换机在二层广播域里监听DHCP报文。它把所有面向终端的接口默认为非信任口只允许这些口发出DHCP Discover和Request所有DHCP服务器回应报文Offer、ACK等只在信任口才被放行。终端侧主动发上来的Offer/ACK一律掐掉。这样即使有人私接路由器它的Offer报文也根本过不了交换机自然欺骗不了其他终端。5.2 信任口与非信任口的设置华为设备上配置DHCP Snooping的完整逻辑分三步。第一步全局开启第二步在对应VLAN上使能第三步设置信任口dhcp snooping enable vlan 10 dhcp snooping enable interface gigabitethernet0/0/1 dhcp snooping trust这里有三种情况要说清楚。第一种DHCP服务器就在核心交换机自己身上也就是我们前面配的全局/接口地址池方案那只需要确保面向终端的接口是非信任口默认即是信任口其实可以不配或只配上联核心的口。第二种DHCP服务器是一台独立设备挂在交换机某个端口下面那这个接服务器的端口必须设为dhcp snooping trust。如果忘了设服务器回给终端的Offer和ACK会被交换机当成非信任口上来的非法报文直接丢弃终端将一直卡在获取IP中这是我在实际排障里碰到最多的Snooping误伤场景。第三种交换机是汇聚或者接入设备上联是核心交换机、DHCP服务在核心或者更上级那么上联口必须设为信任口。因为DHCP回应报文要从上联口下来流经你的设备这个口不是信任口的话会被自己的Snooping策略丢掉。我建议你把信任口当成一种允许DHCP回应报文流经的方向来理解而不要机械地背命令。凡是DHCP服务器或者更上层的DHCP中继所在的方向就是信任方向。配置完Snooping之后还可以加两条实用策略。一条是按端口限制DHCP用户数interface gigabitethernet0/0/2 dhcp snooping max-user-number 5另一条是告警某个端口DHCP报文速率异常的时候上报网管。这对排查环路和私接路由器很管用毕竟Snooping防的是结果非法地址分配而告警能让你更早发现异常。5.3 为什么ARP Detection必须先配DHCP Snooping很多同学在配置华为的ARP防攻击功能时会看到一句提示ARP Detection依赖DHCP Snooping绑定表。热搜词里也经常能看到arp detect 通过dhcp snooping必须要配置这种半截问题。这里把逻辑理顺。交换机上的ARP Detection要做的事情是检查收到的ARP报文中的IP和MAC是不是跟DHCP Snooping学习到的IP-MAC绑定表一致。如果一致放行如果不一致说明有人在伪造ARP或者私自改了IP丢弃。关键问题来了绑定表从哪来就是DHCP Snooping在正常DHCP交互过程中学习来的。终端通过DHCP拿到某个IP交换机就记住这个MAC对应这个IP。所以你不开DHCP Snooping绑定表就是空的ARP Detection就没有比对依据自然无法工作。这就是为什么华为设备的配置文档里做ARP防攻击之前总是会让你先把DHCP Snooping配好。而且注意一个细节只有通过DHCP获得地址的终端才会被记录进绑定表。如果有些终端是你手工配的静态IPSnooping表里根本没有它那ARP Detection反而可能把它当非法设备处理。所以做这套联动之前一定要先梳理清楚网段里的静态IP设备给它们也单独做静态绑定表项或者在ARP Detection策略里放行。这是我在真实项目里踩过的一个坑财务那边有一台老式激光打印机用的静态IP开了ARP Detection之后打印机直接失联。6. 客户端获取不到地址时的排查链路6.1 六步排查法从终端回推核心配置下面的排查顺序我基本是固定操作按这个顺序走绝大多数获取不到IP的问题十分钟内能定位。第一步先看终端侧。Windows命令行敲ipconfig /release再ipconfig /renew观察终端能不能收到IP。如果用无线先确认WiFi本身能连上别在无线认证环节就开始怀疑DHCP。第二步看核心交换机上对应的VLANIF接口状态。display interface vlanif 10重点看接口是不是UP。如果VLANIF 10是Down那就说明这个VLAN下没有UP的物理接口终端虽然在VLAN 10里但交换机根本没法给它提供网关DHCP自然无法工作。这种情况十有八九是交换机接入端口没划对VLAN或者物理线缆有问题。第三步检查DHCP总开关。display current-configuration | include dhcp enable确认全局dhcp enable有没有配。前面说了这个开关太容易漏了。第四步检查地址池配置。display ip pool vlan10 all看网段、网关、排除范围对不对。这一步能揪出绝大多数网络和网关填错的问题。第五步看地址池余量。display ip pool vlan10 free如果free列表已经空掉说明地址池耗尽了。这种情况多见于租期设太长、地址池规划太小或者有终端被异常占用。第六步如果前三步都正常但终端还是拿不到地址就开始怀疑DHCP Snooping。检查信任口配置是否正确尤其是独立DHCP服务器或者上联口是否设了dhcp snooping trust。这个我在前面已经反复强调过了。6.2 高频翻车场景案例分析挑几个我实际遇到过的案例展开讲一下这些场景在网络上被问的频率也很高。案例一地址池配置好了VLANIF也配了dhcp select global但终端一直拿不到IP。后来查配置发现全局dhcp enable漏了。这个太经典了属于明明每个零件都在发动机没点火。案例二VLANIF接口是Down的。终端接到交换机端口上端口access VLAN 10但VLAN 10在交换机上没有创建或者创建了口没加进去导致VLANIF 10起不来。DHCP请求到了交换机交换机要处理的接口都不存在自然没有回应。案例三DHCP服务器是独立设备接在G0/0/24口上。交换机开启了DHCP Snooping但G0/0/24没有配置dhcp snooping trust。结果服务器的Offer和ACK全被交换机当非法数据丢掉了客户端卡在获取IP中。这种是最冤的配置看起来都对但其实Snooping把服务器回包堵死了。案例四静态绑定和动态池范围重叠。前面说的打印机占用了192.168.10.100这个IP同时又在动态池里结果DHCP服务器把这个IP动态分配给了另一台电脑打印机和电脑不断报IP冲突。解决办法就是在地址池里排除静态绑定的地址段。案例五地址池租期设置太长。某个访客网络把租期设成了7天两百个IP的池子三天就被占满新访客再也拿不到地址。访客场景租期一定要短半天甚至一两个小时就能把池子循环起来。6.3 eNSP模拟器与真实设备的差异提醒很多人学配置都会在eNSP上练这没错但有几条差异你得心里有数。eNSP模拟器对DHCP基本功能的模拟是比较完整的全局地址池、接口地址池、作为客户端获取地址都能跑通适合练习命令和流程。但模拟器对一些安全特性的支持有限比如DHCP Snooping的某些明细行为、信任口和非信任口的报文处理细节跟真实硬件设备不完全一致。你在eNSP里配置完Snooping可能因为模拟器本身限制并不会严格模拟出非信任口丢弃Offer的效果这时候别误以为自己配置错了。另外一个老朋友了eNSP里重启设备之后配置就没了。我见过不少新手在eNSP里好不容易把DHCP配通了高兴地关掉模拟器第二天打开发现所有配置归零。在练习的时候养成做完配置就敲save的习惯生产环境则是在维护窗口里配置完成后也执行一次save确保设备重启后配置还在。真实设备上还有一个模拟器不体现的细节终端拿不到地址时你会看到设备上日志刷的DHCP相关告警和调试信息这些在模拟器环境里体验不完整。所以我的建议是eNSP用来练命令、顺逻辑真要判断一个复杂的现网问题还是得在真机上用debugging dhcp、display logbuffer这些手段结合着查。顺带分享一个小习惯每次在华为设备上做完DHCP相关变更我都习惯等到第二天早上上班前远程看一眼display ip pool的分配情况和日志确认一晚上客户端的续租都正常再收工。DHCP这个服务就是这样配置完那一刻没有炸不代表它稳定要跑过完整的租期续租、重启分配、多终端并发之后你才能真正放心。这套东西没有太多玄学逻辑理顺、参数规划好、Snooping位置摆对基本不会出大问题。