公司要搭一套带多网段的办公模拟环境,我顺手把 DHCP 实验整个过了一遍。结果发现一个挺有意思的现象:不少人以为 DHCP 就是个"自动发 IP 的小功能",真要动手配置时,卡住的点五花八门——有搞不清"一个 DHCP 服务器到底能发几个网段"的,有面对华为交换机一堆 display 命令不知道从哪查起的,还有内网明明已经有一台物理 DHCP 服务器、结果交换机一接就"偶发获取失败"的。这篇就围绕这几个高频问题,把实验过程、配置逻辑和排错链路完整拆开聊一遍。适合正在学网络基础、准备 HCIA 实验,或者在企业里维护局域网的同学参考。
1. 实验前置:先把"一个DHCP服务器能发几个网段"这件事讲透
1.1 DORA四次握手在实验中的实际表现
做实验之前,我习惯先把协议流程过一遍,不然配置出来的东西出了问题根本无从下手。DHCP 最核心的就是四次交互,简写为 DORA:
- Discover:客户端以广播形式发出,源 IP 是 0.0.0.0,目的 IP 是 255.255.255.255,MAC 是自己的网卡 MAC。它其实是在喊"网段里有没有 DHCP 服务器,给我个地址"。
- Offer:服务器收到后,从地址池里挑一个可用地址,回应一个 Offer 报文,携带候选 IP、租期、网关、DNS 等信息。如果服务器和客户端不在同一个广播域,这一步就需要中继帮忙。
- Request:客户端收到 Offer 后会再广播一个 Request,相当于说"我就要这个地址"。
- Ack:服务器确认,租约正式生效。客户端拿到完整的网络配置参数,然后开始正常通信。
我在实验里喜欢抓包看这四个过程。只要在客户端网卡上跑 Wireshark,过滤dhcp关键字,就能很直观地看到 Discover、Offer、Request、Ack 的先后顺序。有一个容易忽略的细节:如果同时存在多台 DHCP 服务器,客户端只会接受第一个到达的 Offer,但会在 Request 里带上它选中的服务器标识,选中的服务器才会回 Ack。这也是内网有物理 DHCP 服务器时,交换机如果配置不当会出现"分配混乱"的原因之一。
1.2 多网段分配的两种主流思路
"一个 DHCP 服务器,发几个网段"这个问题的本质,是 DHCP 请求大多基于广播。普通广播过不了三层,所以要么让交换机或路由器直接充当 DHCP 服务器,要么让网关设备把广播转成单播,转发给真正的服务器。对应到华为设备上,实验里最常用的是两条路:
- 交换机作为 DHCP Server:直接在设备上建多个地址池,每个地址池对应一个网段,VLANIF 接口作为网关。这是中小型网络最省事的做法,不用额外服务器硬件。
- DHCP 中继:内网已经有一台物理 DHCP 服务器,各网段的网关设备配置中继功能,把客户端的 Discover 报文封装成单播发给服务器,服务器根据报文里的 giaddr 字段判断该从哪个地址池分配。这样一台服务器就能服务整个园区,IP 地址统一管理。
这两个方案我在实验里都做了。如果只是练手学原理,推荐先做交换机直接分配;如果是为了贴近企业实际环境,强烈建议做一遍中继,因为大部分公司都是"物理服务器集中管理地址"的模型。
2. 华为交换机当DHCP Server:全局地址池与接口地址池的实战配置
2.1 实验拓扑与参数规划
我用一台华为交换机(型号无所谓,S5700、CE 系列都行,命令基本一致)划分了两个 VLAN 做验证:
- VLAN 10:办公网段 192.168.10.0/24,网关 192.168.10.1
- VLAN 20:监控网段 192.168.20.0/24,网关 192.168.20.1
交换机上创建对应的 VLANIF 接口作为各网段的网关。客户端分别接在 Access 口下,通过 VLAN 划分进入不同网段。实验前先把 VLAN 和接口放通搞定:创建 VLAN、把接口改成 Access 并加入指定 VLAN、给 VLANIF 配 IP。这一套基础配置做完,两台客户端能各自 ping 通网关,再开始开 DHCP,这样出了问题能知道是 DHCP 的事还是二层链路的事。
2.2 全局地址池配置:多网段场景首选
华为交换机上开 DHCP 全局服务,用dhcp enable开启。然后创建地址池,我推到实验里是这么写的:
[HUAWEI] dhcp enable [HUAWEI] ip pool vlan10 [HUAWEI-ip-pool-vlan10] network 192.168.10.0 mask 255.255.255.0 [HUAWEI-ip-pool-vlan10] gateway-list 192.168.10.1 [HUAWEI-ip-pool-vlan10] dns-list 114.114.114.114 [HUAWEI-ip-pool-vlan10] lease day 1 hour 0 minute 0 [HUAWEI] ip pool vlan20 [HUAWEI-ip-pool-vlan20] network 192.168.20.0 mask 255.255.255.0 [HUAWEI-ip-pool-vlan20] gateway-list 192.168.20.1 [HUAWEI-ip-pool-vlan20] dns-list 114.114.114.114 [HUAWEI] interface Vlanif10 [HUAWEI-Vlanif10] ip address 192.168.10.1 255.255.255.0 [HUAWEI-Vlanif10] dhcp select global [HUAWEI] interface Vlanif20 [HUAWEI-Vlanif20] ip address 192.168.20.1 255.255.255.0 [HUAWEI-Vlanif20] dhcp select global有几个点我在实验里反复确认过:
- 全局地址池模式下,
gateway-list必须和 VLANIF 接口的 IP 完全一致。我曾经把网关写错成 192.168.10.254,结果客户端能拿到 IP,但 ping 不通网关,排查了好一会儿才发现是网关参数写错了。 dhcp select global如果漏配,接口就不会调用全局池,客户端会一直拿不到地址。这个命令要逐个 VLANIF 都写上。- 地址池里的
network网段必须包含网关地址所在的网段,否则地址池不可用。如果规划了两个网段,就要建两个池,一个池对应一个网段。
这种方式的优点是配置集中,所有网段的地址池都放在一台交换机上,后续新增网段只需要建池、配网关 IP、加dhcp select global三步。缺点也明显:如果这台交换机挂了,全网都拿不到地址,所以生产环境中一般用双机做冗余,实验里不用纠结这个。
2.3 接口地址池配置:单网段场景更轻量
还有一种方式是接口地址池,直接在 VLANIF 接口下配,不需要单独建全局池:
[HUAWEI] interface Vlanif10 [HUAWEI-Vlanif10] ip address 192.168.10.1 255.255.255.0 [HUAWEI-Vlanif10] dhcp select interface [HUAWEI-Vlanif10] dhcp server gateway-list 192.168.10.1 [HUAWEI-Vlanif10] dhcp server dns-list 114.114.114.114接口地址池的网段自动继承接口 IP 所在的网段,所以不用写network,这比全局池省一步。但它只适用于"一个接口对应一个网段、且只需要一个地址池"的简单场景。如果这台交换机还要给别的接口分配地址,就得在多个接口上重复配置,后期维护比较碎。我的建议是:实验题、单网段小环境用接口池,多网段、需要统一管理时用全局池。
这里有个容易踩的坑:旧版华为设备上,接口池配置命令是dhcp select interface后跟dhcp server开头的一系列参数;新版 VRP 版本有些改动,但大体一致。实验前最好先display version看一下版本,再决定用哪种写法。
3. 内网已有一台物理DHCP服务器,交换机怎么做
3.1 二层直连:看似不用配,其实有三个隐藏前提
很多人的第一反应是:物理 DHCP 服务器和客户端在同一个二层网络里,交换机啥都不用配,服务器自己会响应。这个方向没错,但实验做下来发现有三个前提容易被忽略:
- 客户端和服务器必须真的在同一个广播域。如果中间隔着 VLAN,广播到不了服务器,DHCP 必然失败。所以要么把服务器接在同一个 VLAN 的接口下,要么把这个 VLAN 的广播域打通。
- 交换机上如果有 DHCP Snooping,默认情况下非信任端口的 DHCP 响应会被丢弃。启用 snooping 后必须把接服务器的端口设置为信任端口,否则服务器发回来的 Offer 和 Ack 全部被设备拦截,客户端一直卡在 Discover 状态。
- 交换机如果开启了 IP Source Guard 之类的防欺骗功能,也会影响 DHCP 流程。实验环境一般是关掉的,生产环境要结合具体情况评估。
在企业真实环境里,"偶发获取失败"或者"只有某些终端拿不到地址"的案例,很多就是这三条里出的问题,而不是 DHCP 本身坏了。
3.2 跨网段接入:DHCP中继配置与完整验证流程
如果物理服务器在 VLAN 100(比如 192.168.100.10),客户端的 VLAN 10 在另一个网段,那就必须做中继。华为交换机上的配置其实很短:
[HUAWEI] dhcp enable [HUAWEI] interface Vlanif10 [HUAWEI-Vlanif10] ip address 192.168.10.1 255.255.255.0 [HUAWEI-Vlanif10] dhcp select relay [HUAWEI-Vlanif10] dhcp relay server-ip 192.168.100.10 [HUAWEI] interface Vlanif20 [HUAWEI-Vlanif20] ip address 192.168.20.1 255.255.255.0 [HUAWEI-Vlanif20] dhcp select relay [HUAWEI-Vlanif20] dhcp relay server-ip 192.168.100.10中继的原理一句话说就是:客户端广播 Discover 到达网关接口,接口把广播包转成单播转发给指定的服务器 IP,并且在这个报文里填上接口的 IP 地址作为 giaddr。服务器收到后看到 giaddr 是 192.168.10.1,就知道"哦,这是 192.168.10.0/24 网段的请求",从而从对应的地址池里分配地址。这就是为什么"一台物理 DHCP 服务器能发多个网段"——靠的不是服务器上的广播监听,而是中继给它的上下文信息。
验证中继是否生效,我最常用的命令是:
display dhcp relay statistics看转发和接收的报文计数。如果从发现报文到中继转发的计数都在涨,说明广播确实到了网关,网关也成功把它单播给了服务器。如果转发计数为零,先检查dhcp select relay和dhcp relay server-ip是不是都配上去了,再看交换机到服务器的路由通不通。
3.3 虚拟化环境里的vNIC与服务器部署思路
现在不少环境里客户端并不都是物理机,云平台里虚机的 vNIC 同样走 DHCP 拿地址。实验里我用一台 VMware 虚机模拟过,vNIC 的网卡类型选 e1000 或者 vmxnet3 都行,重点是虚拟交换机的 VLAN 配置:如果 vNIC 要拿 VLAN 10 的地址,那么端口组要划到 VLAN 10 里,否则客户端发出的报文会被交换机当成本地 VLAN 的流量,服务器根本收不到。
反过来,如果 DHCP 服务器本身也是虚机,接在 vSwitch 上,同样要考虑端口组 VLAN 和信任关系。其实把 vNIC 理解成一块物理网卡就行——它有好几个虚拟网卡时,对应到交换机上就是好几个接口,每个接口属于哪个 VLAN,就决定了它能收到哪个广播域的 DHCP 请求。服务器为 vNIC 分配地址的逻辑,和给物理机分配地址完全一致,没有任何特殊之处,所以排错思路也能复用。
4. 验证与排错:华为交换机上的查看命令和真实翻车现场
4.1 查看DHCP配置与运行状态的命令组合
"华为交换机查看 DHCP 配置"是搜索热度很高的关键词,我在实验里实际用得最多的命令有下面这些,整理成一张表方便对号入座:
| 需求 | 命令 | 输出里重点看什么 |
|---|---|---|
| 看全局开关和接口选用的模式 | display dhcp enable、display current-configuration configuration dhcp | 确认dhcp enable已开、VLANIF 下选的是 global 还是 relay |
| 看地址池配置和分配情况 | display ip pool | 地址池总数、每个池的网段、已分配地址数、空闲地址数 |
| 看某个池的详细信息 | display ip pool name vlan10 | 起始地址、结束地址、网关、DNS、租期、冲突地址 |
| 看全局服务器统计 | display dhcp server statistics | Receive/Request、Send/Reply 计数,确认有没有收到请求、有没有回包 |
| 看中继统计 | display dhcp relay statistics | 中继转发数、接收数,排查中继链路 |
| 看接口下的地址绑定 | display dhcp server conflict、display dhcp server expired | 冲突和过期地址,这类地址最容易造成"换了个终端还是拿不到地址" |
有个小技巧:如果客户端拿不到地址,最简单的第一步是先在客户端上执行ipconfig /release和ipconfig /renew(Windows),同时用display dhcp server statistics刷新两次看计数是否变化。计数涨了,说明请求已到设备;计数不涨,问题在二层链路或者 snooping 拦截。
4.2 抓包与日志定位"拿不到地址"的三类原因
实验里最让人抓狂的就是"终端一直显示获取中"。抓包是最终极的手段,我一般在 DHCP 服务器侧和客户端侧同时抓,对比两端能否互相看到报文。归纳下来,"拿不到地址"基本就三类原因:
- 广播根本没到达服务器。客户端发 Discover,但中间链路不通、VLAN 不对、服务器接错接口,或者 snooping 把报文丢了。现象是客户端侧有 Discover,服务器侧什么都收不到。
- 服务器回了 Offer,但客户端收不到。最常见的是中继配置有问题:
dhcp relay server-ip配错了,或者 relay 模式没开。还有 snooping 把服务器的 Offer 当成攻击报文丢弃。 - 双方报文都在走,但分配失败。比如地址池耗尽、地址冲突、池里的网段跟网关不在同一网段。这种现象在统计里能看到 Request 增加但 Ack 不增加。
用华为设备时,还可以开 debug 看实时日志:
debugging dhcp server packet但这个命令输出量很大,生产环境慎用,实验环境没问题。开 debug 的好处是能直接看到设备收到哪种报文、失败在哪一步。
4.3 故障排查链路复现:一个典型的"分配失败"实例
我在实验里故意制造过一次故障:用全局池给 VLAN 20 分配地址,客户端一直拿不到。当时的排查链路是这样的:
第一步,在客户端上ipconfig /renew,同时打开display dhcp server statistics,发现 Receive 的 Discover 在涨,但 Send 的 Offer 没涨。
第二步,怀疑地址池没匹配上,执行display ip pool,发现 VLAN 20 的池确实存在,但详情里显示"该网段与接口网段不一致"之类的状态。仔细一看,VLANIF20 的 IP 配的是 192.168.30.1,而地址池写的是 192.168.20.0/24,两边不匹配。
第三步,把 VLANIF20 和地址池统一成 192.168.20.0/24,再ipconfig /renew,一次成功,统计里 Send 的 Offer 和 Ack 都开始涨了。
这类"接口 IP 和池网段不一致"的问题其实非常常见。很多教程只会写配置,不提醒这层对应关系,导致实验照抄都能错。后来我凡是做完一个 VLAN 的配置,都会主动核对两样东西:display ip interface brief看接口 IP,display ip pool看池网段,确保一一对应。
5. 实验收尾:误区对照和个人体会
5.1 常见误区对照表
实验做完,我把最容易翻车的地方整理成了对照表,方便以后照着检查:
| 误区 | 正确做法 | 翻车现象 |
|---|---|---|
只建地址池,忘了在 VLANIF 下写dhcp select global | 每个需要分配地址的接口都要选模式 | 客户端收不到 Offer |
| 全局池的网关跟接口 IP 不一致 | gateway-list 必须等于 VLANIF 的 IP | 能拿到 IP 但无法通过网关通信 |
| 一个网段建了多个池,地址冲突 | 每个网段只保留一个有效池 | IP 分配不稳定,周期性掉线 |
| 有 DHCP Snooping 但没配信任端口 | 接服务器的端口配置dhcp snooping trusted | 服务器回包被丢弃,获取失败 |
中继模式下忘配dhcp relay server-ip | relay 模式必须指定服务器 IP | Discover 到网关后无后续 |
| 地址池范围过大,把网关地址也包含进去分配 | 用excluded-ip-address排除网关和服务器 | 终端抢到网关地址,全网中断 |
前三条是配置层面的,后三条是安全特性或细节层面的,实验环境最容易漏掉的是第一条和第二条。尤其是用华为设备做实验时,不少人把dhcp enable一敲、池一建就以为完事了,结果接口没选模式,折腾半天。
5.2 一点个人体会
这个实验做完,我的核心感受是:DHCP 本身不难,难的是"请求从客户端走到服务器的整条链路上,每一环都可能出问题"。很多初学者配完一遍能通就觉得会了,一旦遇到获取失败就不知道该从哪里看起。我现在的做法是固定一套排查顺序:先确认链路二层通不通,再查设备统计看报文走向,然后核对地址池和接口网段的对应关系,最后才上抓包。这套顺序在实验里帮我把排错时间从半小时压到了几分钟。
如果还想继续深入,可以在这个实验基础上加一个 DHCP Snooping 的安全实验,做一做非信任端口丢弃非法 DHCP 服务器的报文,看看拓扑里出现"野 DHCP 服务器"时会发生什么。那部分玩明白之后,基本就能理解企业网管为什么总说要"管住 DHCP"了。