老实说,做了这么多年网络运维,每次给学生讲 DHCP 我都会多留一个心眼。这门课刚结束,趁着热乎劲把心得和踩过的坑整理出来。DHCP 这东西看着简单——无非就是分配 IP、下发网关、下发 DNS,但真正在现网里跑起来,各种怪问题层出不穷,尤其是热词里提到的"一个 DHCP 服务器下发几个网段""内网已有物理 DHCP 服务器交换机怎么配""华为交换机查看 DHCP 配置"这些场景,稍微不留神就把整个网络搞瘫。这篇内容不完全照搬课程讲义,更多的是结合我一线的实操经验,把原理、配置、排查思路重新捋了一遍,适合刚入门需要系统理解 DHCP 的同行,也适合被多网段分配、物理服务器共存问题折磨过的运维朋友。
1. DHCP 原理复盘:交互流程和租约里藏着的坑
1.1 四步交互:Discover、Offer、Request、Ack
DHCP 全称是 Dynamic Host Configuration Protocol,本质就是"终端开机后不知道自己是谁,问网络要一个身份"的过程。完整的交互分成四步:客户端发 Discover 广播找服务器,服务器回 Offer 广播或者单播提供一个可用地址,客户端再发 Request 确认"我要这个",最后服务器回 Ack 拍板"给你"。
这里有个坑必须提:Offer 阶段服务器其实只是"预分配",并没有真正把地址锁定给这台设备。只有收到 Request 之后,服务器才会在地址池里做正式扣除并生成租约记录。所以如果你在地址池里看到某个 IP 状态是"已分配",但交换机上的地址表里找不到对应 MAC,多半就是交互停在了 Offer 到 Request 之间——最常见的原因是客户端网卡驱动有问题,或者中途有人把 DHCP 报文给丢了。
另一个容易忽略的点是广播域。Discover 是广播报文,在没有配置 DHCP Relay 的情况下只能在当前二层广播域内传播。这就是内网存在物理 DHCP 服务器时很多同学困惑的根源:为什么我明明在服务器上建好了地址池,PC 就是拿不到地址?十有八九是 VLAN 隔离导致广播到不了服务器端口。你需要在交换机上做 Relay 或者在服务器侧部署代理,这个后面展开。
1.2 租约机制:T1、T2 和续租时间点
很多人以为 DHCP 分配地址是一次性的,其实它是"租约制"。默认租期通常 24 小时,但运行中真正起作用的不是这个 24 小时,而是两个比例时间点:T1 是租期 50% 的时刻,客户端会尝试向原服务器单播续租;如果 T1 没成功,到 T2(租期 87.5%)时客户端会改为广播续租,此时任何一台 DHCP 服务器都能响应。
我在课堂上反复强调这个机制,是因为现网里很多"间歇性断网"就是它引发的。比如你内网有两台设备在同时提供 DHCP 服务(一台物理服务器、一台交换机开启了 DHCP),客户端租约到期前走 T1 续租,如果原服务器响应慢或者网络路径有问题,到了 T2 广播阶段另一台服务器响应了,地址就可能被重新分配,客户端拿到的网关、DNS 一变,网络自然"断"了。
排查技巧很简单:在客户端持续ipconfig /all观察租约获取时间和服务器 IP,如果服务器地址在变化,基本可以断定内网存在多 DHCP 源冲突。这时候不要急着删配置,先用抓包或日志确认两个源分别是谁,再决定关闭哪一边。
1.3 地址池、排除地址、保留地址的正确理解
地址池是 DHCP 的核心资源,但很多课程只讲"建一个网段",忽略了池子内部的精细化管理。一个标准的池子应该包含四类信息:可分配的 IP 段、排除掉不能分配的地址、保留给特定 MAC 的固定地址、以及随租约下发的网关和 DNS 等选项。
排除地址和保留地址的区别一定要分开理解。排除地址是"这块 IP 谁都别动",通常用于物理服务器、打印机、网络设备管理地址;保留地址是"这块 IP 只给特定 MAC 用",用于需要固定 IP 的终端或虚拟机。如果你在部署内网物理 DHCP 服务器时,没有把交换机、防火墙、打印机的管理 IP 全部排除,用不了几天就会撞 IP。
踩过一次很典型的坑:某机房里的服务器网卡配置了静态 IP,但 DHCP 地址池没有排除对应范围,结果一台新终端接入后被分配了与服务器冲突的 IP,整个房间的监控全部掉线。排查花了两个小时,最后就是一条exclude-address语句的事。所以地址规划这事,宁可多排除一百个,也别少排除一个。
2. 一个 DHCP 服务器多个网段:架构设计与 Relay 配置
2.1 多网段的三种承载方式
热词里"一个 DHCP 服务器,发几个网段"是后台留言问得最多的。先明确结论:可以,但不是无脑配置。根据网络架构不同,有四种常见做法:
第一种,所有网段在同一个二层广播域内,DHCP 服务器上建多个作用域,客户端广播 Discover 后服务器按不同地址池分别应答。这种做法适合大二层扁平网络,但广播域太大,实际生产环境已经很少见。
第二种,网段隔离在不同 VLAN,三层交换机负责路由,DHCP 服务器通过 DHCP Relay 将客户端的请求报文转发到服务器所在的网段。这是楼宇网络、校园网最常见的方式。
第三种,DHCP 服务器本身在核心交换机上做虚拟化,一台物理服务器通过虚拟网卡接入多个 VLAN,分别监听不同 VLAN 的广播。这个在云平台和虚拟化环境里越来越多,等会儿聊 vNIC 时再细说。
第四种,干脆把所有 DHCP 功能上收给核心交换机,交换机直接作为 DHCP Server 为多个 VLAN 的终端下发地址。很多中小型网络直接这么干,省一台服务器。
选择哪种,核心就看两个问题:广播域能不能控制住、故障点能不能明确。我在现网里建议优先用第二种或者第四种,因为广播隔离清晰,排障路径最短。
2.2 跨网段必须用 DHCP Relay
跨 VLAN 分配地址这件事,所有同学都该刻在脑子里一句话:不带 Relay,DHCP 广播出不了 VLAN。DHCP Relay 的原理其实不复杂——三层设备收到终端发来的 DHCP Discover 广播后,不直接丢弃,而是修改报文源地址为自己的接口 IP,然后单播转发给 DHCP 服务器;服务器回包时也先发给 Relay 设备,Relay 再转给终端。
正是因为报文经过了一次"地址转换",所以 Relay 配置里有一个关键参数叫"giaddr"(Gateway IP Address),服务器是依据这个字段来选地址池的。这个字段就是终端所在网段的三层接口地址。也就是说,DHCP 服务器必须能根据 giaddr 找到对应的地址池,否则即使 Relay 通了,终端也拿不到正确网段的地址。
实际配置时还要注意,Relay 设备的接口必须开启 DHCP Relay 功能,有些华为交换机默认关闭,需要在 VLANIF 接口下执行dhcp relay命令打开。部分设备上还需要写清楚服务器地址,比如dhcp relay server-address 192.168.1.10。很多新手漏掉了这一步,导致 Relay 配置了但报文根本没发出去。
2.3 实操配置:一台 DHCP 服务器下发多个 VLAN
我拿一套常见的办公网架构来演示。假定核心交换机有 VLAN 10(192.168.10.0/24)、VLAN 20(192.168.20.0/24)、VLAN 30(192.168.30.0/24),有一台物理 DHCP 服务器在 VLAN 10 里,地址 192.168.10.10。
在华为交换机上,关键是三层接口(VLANIF)配置 Relay。以 VRP 平台为例,大致思路如下:
interface Vlanif10 ip address 192.168.10.1 255.255.255.0 dhcp relay dhcp relay server-address 192.168.10.10 interface Vlanif20 ip address 192.168.20.1 255.255.255.0 dhcp relay dhcp relay server-address 192.168.10.10 interface Vlanif30 ip address 192.168.30.1 255.255.255.0 dhcp relay dhcp relay server-address 192.168.10.10DHCP 服务器那边(Windows 或 Linux),则要建三个作用域:192.168.10.0、192.168.20.0、192.168.30.0,并分别指定各自的网关选项(003 Router)、DNS 选项(006 DNS Server)。
配置完不是结束,要验证。重点检查两件事:第一,终端在 VLAN 20 里能不能拿到地址;第二,拿到的地址是不是 192.168.20.0/24 网段、网关是不是 192.168.20.1。我见过不少情况是 Relay 通了、地址也发下来了,但服务器作用域里网关选项写成了别的 VLAN 的地址,结果终端能拿到 IP 却上不了网。这类问题抓包看不出来,必须逐个作用域检查选项配置。
3. 华为交换机 DHCP 部署:查看命令、配置步骤与 Snooping
3.1 华为交换机查看 DHCP 配置的关键命令
"华为交换机查看 dhcp 配置"这个热搜词说明很多人配好后不知道怎么看、怎么验证。华为 VRP 平台的命令和 Cisco 有差异,而且不同版本(VRP5、VRP8)有局部变化,但核心几条是通用的,整理如下:
查看全局 DHCP 开关状态:
display dhcp status查看全局地址池配置:
display dhcp server global configuration查看接口下的 DHCP 配置(接口地址池或 Relay):
display dhcp server interface configuration查询 DHCP 租约和绑定表(最实用):
display dhcp server binding display dhcp snooping binding查看 DHCP Relay 配置和统计信息:
display dhcp relay configuration display dhcp relay statistics查看 DHCP Snooping 信任端口配置:
display dhcp snooping trusted我自己的习惯是先display dhcp status确认设备开启了 DHCP 相关功能,再针对具体接口或地址池排查。如果看到接口下配置不生效,优先检查全局有没有执行dhcp enable,华为设备很多 DHCP 功能是需要在系统视图下先开启总开关的,这个顺序错了,配置写再多也不生效。
3.2 交换机直连场景下的 DHCP 服务配置
有些场景下交换机本身就当 DHCP Server 用,省掉外部服务器。华为交换机上地址池有全局地址池和接口地址池两种。
接口地址池适合接口下直连用户,配置直观。比如给 VLAN 100 的下联终端分配 192.168.100.0/24 网段,可以这样:
dhcp enable interface Vlanif100 ip address 192.168.100.1 255.255.255.0 dhcp select interface dhcp server dns-list 114.114.114.114 8.8.8.8 dhcp server gateway-list 192.168.100.1全局地址池则适合多个 VLAN 共用一台交换机的情况,需要先创建地址池再绑定接口:
dhcp enable ip pool vlan200 network 192.168.200.0 mask 24 gateway-list 192.168.200.1 dns-list 114.114.114.114 excluded-ip-address 192.168.200.1 192.168.200.20 interface Vlanif200 ip address 192.168.200.1 255.255.255.0 dhcp select global很多同学问接口地址池和全局地址池怎么选。我的经验是:单接口直连、规模小、地址池独立,就用接口地址池;多接口共用同样策略或需要集中管理地址池,就用全局地址池。另外注意,接口地址池在华为设备上默认以接口主地址作为网关,如果要下发多个子网或排除批量地址,全局地址池灵活度更高。
3.3 DHCP Snooping 配置及防私接思路
DHCP Snooping 是网络安全里和 DHCP 关系最密切的功能,它的核心作用不是分配地址,而是防欺骗——防止私接路由器、假 DHCP 服务器乱发地址,同时记录终端 IP、MAC、VLAN、接口之间的绑定关系。
在华为交换机上开启 Snooping 的基本逻辑是:默认所有接口都是"非信任"状态,只允许信任接口收到 DHCP Offer、Ack 报文并转发给终端,非信任接口收到的这类报文直接丢弃。配置信任接口是第一步,通常把上联核心或 DHCP 服务器所接端口设置为信任口:
dhcp snooping enable interface GigabitEthernet0/0/1 dhcp snooping trusted interface Vlanif100 dhcp snooping enable这里有个容易翻车的细节:很多同学只在全局dhcp snooping enable,没在 VLAN 或接口下打开,结果功能看起来开了实际上一点作用没有。华为设备 Snooping 需要全局、VLAN、接口三层联动,具体来说:
- 全局开启
dhcp snooping enable; - 需要防护的 VLAN 下再执行
dhcp snooping enable; - 接口下如需做强校验,再单独配置接口绑定检查和信任状态。
配好之后,用display dhcp snooping binding就能看到终端 IP 和 MAC 的绑定记录。排障时这个表非常有用,比如客户上报 IP 冲突,你先看绑定表里有没有两条记录,如果有,大概率是有人私接小路由器,把 DHCP 请求转到了错误网段。
4. 物理 DHCP 服务器与交换机共存:冲突规避与联合配置
4.1 双层 DHCP 冲突的三个典型症状
内网已经有物理 DHCP 服务器,交换机又不想关掉自身 DHCP 功能,或者有人无意中开了接口 DHCP 服务,就会出现"双层 DHCP"冲突。我总结过最常见的三种症状:
第一种,终端拿到的地址不稳定,一会儿是 10.1.x.x,一会儿是 192.168.1.x,网关相应变化。这通常是 DHCP 服务器和交换机地址池范围重叠,或者交换机在某个接口下偷偷开了dhcp select interface。
第二种,终端能拿地址但无法上网,网关指向了一个没有路由回程的地址。原因是两台 DHCP 服务器下发的网关选项不一样,而终端当前租到的是错误的那台服务器给的选项。
第三种,地址池被快速耗尽。同一网段连续上线几百台设备,两台服务器都在分配地址,又没有共享租约信息,很快就分光了。这种情况在办公网大规模终端接入时特别明显。
这三种症状的共同原因就是地址池、网关、排除范围的规划没有做统一。解决思路不是"关掉一个就行",而是要建立一个清晰的 DHCP 服务边界:谁是权威源、谁做兜底、哪些地址必须排除,先说清楚再动手改配置。
4.2 交换机侧的正确配合姿势
内网已有物理 DHCP 服务器时,交换机的角色通常是"透传 + 中继 + 防护",而不是"再开一个 DHCP 服务"。
透传指的是终端和服务器在同一个二层广播域内,交换机只需保证广播报文能正常到达服务器,不需要额外做任何 Relay。这种情况下交换机上需要注意:连接服务器的端口不要配置端口隔离,否则广播到不了;VLAN 划分要正确,终端和服务器必须在同一 VLAN 里。
如果服务器所在的 VLAN 和终端 VLAN 不同,交换机就要承担 Relay 角色。配置方式和前面多网段案例一样,关键是三层接口dhcp relay server-address指向物理服务器 IP。
同时,交换机一定要打开 DHCP Snooping,并把物理服务器所连端口设为信任口。这么做的好处是双重防护:即使有人私接了一台假 DHCP 服务器在某个接入端口,它也永远无法广播 Offer 给别的终端。
还要强调一点:如果交换机本身已经开启了全局dhcp enable且某些接口下配置了dhcp select global/interface,要逐个检查并关闭,否则你一边做 Relay、一边又在本机发地址,等于自己给自己制造冲突。关闭命令是在接口视图下执行undo dhcp select,再确认全局地址池是否也需要删除。
4.3 一台物理 DHCP 服务器 + 核心交换机的完整案例
我结合一个真实改造过的场景来讲。某单位内网原来只有一台物理 DHCP 服务器,随着新楼接入,新增了 VLAN 50(192.168.50.0/24),服务器在 VLAN 10。原规划直接让服务器增加 VLAN 50 的作用域,但新楼终端在 VLAN 50 里广播 Discover 到不了服务器的 VLAN。调整方案是:
在核心交换机上给 VLANIF50 开启 Relay 指向服务器:
interface Vlanif50 ip address 192.168.50.1 255.255.255.0 dhcp relay dhcp relay server-address 192.168.10.10物理 DHCP 服务器侧需要做三件事:
- 新建 192.168.50.0 作用域,启用授权;
- 作用域选项里网关填 192.168.50.1,DNS 填内网 DNS;
- 排除地址段 192.168.50.1-192.168.50.10(保留给网络设备和管理终端)。
交换机同时打开 Snooping,并把上联服务器的接口设为信任口,其他接入接口保持非信任。display dhcp snooping binding就能看到 VLAN 50 新终端的绑定记录。
这套方案落地后,VLAN 50 的终端全部秒级获取地址,也没有再出现抢答和冲突。关键点就是:物理服务器只管建作用域、配选项,交换机负责把广播正确地引过去,同时用 Snooping 拦住非法 DHCP 源。
5. DHCP 故障排查实录:拿不到地址、分错网段的定位思路
5.1 客户端拿不到地址,从哪个方向查
终端右下角一直转圈显示"无 Internet 访问",排查顺序比排错技本身更值得记住。我习惯从下往上一层一层看:
第一步看物理链路。插网线或者连 Wi-Fi 是否起来,交换机端口有没有 up,VLAN 有没有配上。这一步很多老手爱忽略,结果排查半天发现网线没插紧。
第二步看 DHCP 报文能不能到服务器。最好直接在 DHCP 服务器上开抓包工具过滤bootp协议。如果客户端发了 Discover 但服务器完全没收到,问题在二层广播可达性——查 VLAN、查端口隔离、查 Relay 配置。如果服务器收到 Discover 但没有回 Offer,问题在服务器本身——查地址池、查授权、查 scope 状态。
第三步看报文回程。服务器回了 Offer,但客户端没反应,多半是双向链路里有人丢了报文,比如交换机端口安全限制、DHCP Snooping 非信任接口丢弃了 Offeer,或者服务器和客户端不在同一广播域且 Relay 配置不完整。
第四步看客户端本地。Windows 下执行ipconfig /release再ipconfig /renew,确认网卡是不是禁用了 DHCP 客户端服务。极少数情况下是防火墙拦截了 DHCP 报文,把防火墙临时关一下试试也无妨。
5.2 地址拿到了但网段不对
这个问题的根因通常不在客户端,而在服务器作用域选择逻辑。前面提过,服务器选择作用域的依据是 Relay 报文里的 giaddr 字段,或者是直接收到广播包的接口 IP。
举个例子,内网有两个地址池:192.168.1.0 和 192.168.2.0。如果交换机上 VLANIF 的 IP 写错,或者 Relay 配置指向了不匹配的地址池,终端就会拿到其他网段的地址,而网关又不对,网络自然不通。
排查时先确认终端实际拿到的 IP 和网关,再对照交换机 VLANIF 的 IP 配置。如果交换机接口 IP 是 192.168.1.1,而服务器却分配了 192.168.2.x,那就是服务器按 giaddr 选池的逻辑有问题,或者服务器上建了自动超级作用域,导致顺序选择错误。把多余的作用域临时停用,能快速定位。
还有一种隐蔽情况:两个 DHCP 服务器同时在线,一个响应快且给的是正确网段,另一个响应慢且给的是错误网段。客户端往往先到先得,于是表现成"时好时坏"。这种情况只能靠协议抓包看 Offer 来源 IP,确认后关闭多余服务器,或者用 Snooping 信任机制把非法源拦掉。
5.3 vNIC 虚拟网卡场景下的 DHCP 注意事项
现在越来越多的终端其实是虚拟机,DHCP 请求不是在物理网卡上发出,而是虚拟网卡(vNIC)。这个场景下有几个容易踩的坑。
第一个坑是 MAC 地址冲突。虚拟机迁移或克隆时,如果模板里没有重新生成 MAC,多台虚拟机的 vNIC 会共用一个 MAC。DHCP 服务器按照 MAC 做保留地址时就会把同一个 IP 分配给多台机器,结果就是地址冲突、丢包。解决办法是虚拟化平台里开启 MAC 地址自动生成策略,并确保每次克隆后 MAC 都是新的。
第二个坑是虚拟交换机的 Snooping 配置。很多虚拟化平台默认不对虚拟机之间的 DHCP 流量做过滤,如果宿主机上某个虚拟机私开了 DHCP 服务,整个物理主机内的所有虚拟机都可能被误导。建议在虚拟交换机层面开启 DHCP Snooping 或端口安全策略,把上行链路设为信任口,虚拟机接入口全部非信任。
第三个坑是跨主机广播域。虚拟机在不同宿主机间迁移后,可能已经从原来的广播域换到了另一个广播域,但 DHCP 租约还保留着旧网段的地址。此时要确保 DHCP 服务器地址池覆盖迁移目标网段,否则虚拟机迁移后要手动 renew 或重启网卡才能拿到新地址。在云平台里,这个通常靠 DHCP Relay 加多作用域解决,一台 DHCP 服务器为多个 vNIC 网段服务是标配。
5.4 高频问题速查表
| 现象 | 可能原因 | 快速定位手段 |
|---|---|---|
| 拿不到地址 | VLAN/广播域不通 | 抓包看 Discover 是否到达服务器 |
| 拿不到地址 | 服务器作用域无可用 IP | 查看地址池利用率 |
| 拿到的地址网段不对 | giaddr/作用域不匹配 | 查看交换机 VLANIF IP 与地址池 |
| 间歇性断网 | 多台 DHCP 源抢答 | 抓包看 Offer 来源 IP |
| IP 冲突 | 排除/保留地址规划不全 | 查看 DHCP 绑定表和静态配置清单 |
| 虚拟机能上网但续租失败 | vNIC MAC 冲突 | 检查虚拟化平台 MAC 策略 |
| 私接路由器后全网瘫痪 | 非法 DHCP Server | 开启 DHCP Snooping 并设信任口 |
| 交换机配置了但不生效 | 全局 dhcp enable 没开 | 执行 display dhcp status |
这张表建议直接存一份,遇到问题先对照现象,少走弯路。
课程结束之后,我自己又复盘了一遍实验环境里的 DHCP 抓包记录,最深的感触是:DHCP 不是"配置完就不用管"的东西,它背后牵扯的地址规划、广播域边界、设备信任边界,每一项都是网络稳定性的基础。学这门课之前我总觉得 DHCP 很简单,等真正处理过几次因为多 DHCP 源夺权导致的全网瘫痪之后,才明白它为什么能成为网络课程里永远保留的一章。如果你也正在搭 DHCP 服务器、排查 DHCP 问题,记住一句话:先分清谁能发地址、谁能被信任、哪些地址绝对不能动,剩下的配置都是水到渠成。