华为H3C实战 | 第8章 DHCP 服务配置
📚 本系列共 43 篇(第 8 / 43 篇) · 第一卷 基础篇 —— 交换机的骨架
← 上一篇:第 7 章 VRRP 网关冗余 下一篇:第 9 章 MAC 地址表与端口安全 →
本章导读:一千台电脑手工填 IP、网关、DNS,改一次网关就得跑一天。DHCP 就是酒店前台:给房号(IP)、告诉你走廊怎么走(网关)、餐厅在哪儿(DNS),还记租期。本章重点不在"怎么开",而在地址池设计、中继和防住私接的假服务器。
本章结构:
- 8.1 功能原理与业务场景 —— DORA 四报文交换过程、租期为什么是设计精髓
- 8.2 华为设备配置详解 ——
dhcp enable是总开关、全局地址池 vs 接口地址池、排除地址的工程实践、租期怎么定、DHCP 中继的两条硬规则、Option 系列参数、DHCP Snooping 与速率限制(是两条命令,别只抄一条) - 8.3 H3C 设备配置详解 —— H3C 的地址池与中继写法差异
- 8.4 命令对照表 —— 两家并排
- 8.5 配置验证 ——
display ip pool看 Idle/Used、绑定表 - 8.6 排错与故障树 —— 第一步先分清角色:这台设备是服务器、中继,还是中间二层?三者关注点完全不同
- 8.7 新手踩坑 —— 终端拿到 169.254 地址、地址池耗尽、假 DHCP 服务器
- 8.8 本章小结 —— 要点清单 + 自测题
重点提示:终端拿不到地址时,先问一句"DHCP 服务器在哪",再按 8.6 的角色表选命令,别上来就查地址池。地址池显示 Used 为 0,多半是接口没关联池或网段对不上——8.6 表里有对应判据。 关联章节:地址池所在网段的网关见第 6 章;静态地址分配与 MAC-IP 绑定的配合见第 9 章;AP 通过 DHCP 拿管理 IP 与 Option 43 见第 19 章;BRAS 上的地址分配见第 33、34 章。
8.1 功能原理与业务场景
8.1.1 这功能是干嘛的(通俗版)
一千台电脑,每台都要有 IP 地址、子网掩码、网关地址、DNS 服务器地址。如果让你一台台手工填,不但累,而且一旦网关换了地址(比如网络改造),你得挨个去改——这活儿一天都干不完。
动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)[4] 就是那个「酒店前台」。你入住(开机联网)时报一声「我要个房间」,前台(DHCP 服务器)翻一下房态本,给你一个还没人住的房号(IP 地址)、告诉你走廊怎么走(网关)、餐厅在哪儿(DNS),然后登记「这个人住到几号退房」(租期)。住满了就告诉你没房了(分配失败);住到期了你可以续住(续租),也可以退房(释放)。
这种「租」的模式是 DHCP 设计的精髓:地址不是你永久的财产,而是从地址池里借出来的。终端下线后地址会回池,供别人使用。这样即使公司有一万人在用网,也可能只需两千个地址——因为不是所有人都同时在。当然,也有代价:如果终端「不告而别」(比如笔记本拔网线走了),地址会在一段时间内被占着不放。
DHCP 解决的不只是「填地址」的手工活,更重要的是中心化管理:所有网络参数集中在一处配置,改一次全网生效;哪个终端拿了什么地址,服务器上都有记录可查。
8.1.2 在网络里怎么落地(设计视角)
DHCP 的交互是经典的「四报文」流程,业界叫 DORA:
DHCP 客户端(PC) DHCP 服务器(交换机/路由器)
| |
| ① DHCP DISCOVER(广播) |
| 「谁是 DHCP 服务器?我想租个地址」 |
|------------------------------------------->|
| | 从地址池挑一个可用地址
| ② DHCP OFFER(单播/广播) |
| 「我这有个 192.168.10.100 给你」 |
|<-------------------------------------------|
| |
| ③ DHCP REQUEST(广播) |
| 「好,我要 192.168.10.100」 |
|------------------------------------------->|
| | 标记该地址已使用
| ④ DHCP ACK(单播/广播) |
| 「确认,租期 24 小时,网关 x.x.x.x」 |
|<-------------------------------------------|
| |
| 配置生效,可以正常上网 |
除了这四个主报文,还有几个补充报文需要知道:
| 报文 | 方向 | 用途 |
|---|---|---|
| DISCOVER | 客户端 → 服务器(广播) | 寻找 DHCP 服务器 |
| OFFER | 服务器 → 客户端 | 提供地址 |
| REQUEST | 客户端 → 服务器(广播) | 请求确认使用该地址 |
| ACK | 服务器 → 客户端 | 确认分配 |
| NAK | 服务器 → 客户端 | 拒绝(地址不合适、租约已失效) |
| DECLINE | 客户端 → 服务器 | 客户端拒绝(地址冲突,我要换一个) |
| RELEASE | 客户端 → 服务器 | 主动释放地址 |
| INFORM | 客户端 → 服务器 | 只要参数(已有地址,想拿 DNS 等) |
几个关键字段必须理解,否则排错时就只能干看日志:
| 字段 | 含义 | 为什么重要 |
|---|---|---|
yiaddr |
服务器分配给客户端的 IP(your IP) | 这就是最终拿到的地址 |
ciaddr |
客户端已有的 IP(client IP) | 续租时填 |
siaddr |
服务器 IP(server IP) | 用于引导场景 |
giaddr |
中继代理 IP(gateway IP) | 中继的核心:告诉服务器「这个请求来自哪个网段」 |
chaddr |
客户端 MAC | 服务器按 MAC 分配地址 |
option 53 |
报文类型 | 区分上面那几种报文 |
租期(Lease)机制:租期到期前,客户端会在 T1 = 租期的 50% 时向原服务器单播续租,如果失败,在 T2 = 租期的 87.5% 时向所有服务器广播续租,都失败就到期后放弃地址重新 DISCOVER。理解这个「50% / 87.5%」规律,对判断「为什么终端地址会变」很有帮助。
在网络里,DHCP 部署有三种形态:
形态一:DHCP 服务器直连业务网段(本地 DHCP)。服务器就在网关设备上,收到的 DISCOVER 广播直接处理。适用于单台核心就能覆盖整网的小型网络。
形态二:DHCP 中继(Relay)。DHCP 服务器集中在一台服务器上,但客户端分布在几十个网段里。客户端广播发不出去(路由器不转发广播),于是在每个网关上配「DHCP 中继」,把广播转成单播发给服务器,并在 giaddr 里填上网关地址,服务器就知道「该给哪个网段分配地址」。这是大中型网络的标配形态。
形态三:DHCP Snooping + 私接防控。为防止有人私接一台无线路由器当 DHCP 服务器(给全楼发错误的网关),在接入交换机上开 DHCP Snooping,只信任上联口的 DHCP 报文,其他口发来的 OFFER/ACK 直接丢弃。这是接入层安全的基础配置。
适用版本:华为 VRP V200R019 及以上、H3C Comware V7(R2610 及以上)。Note:H3C V7 **没有「接口地址池」**这个概念(那是华为的独有实现),H3C 用全局地址池 + 接口关联;厂商差异请见 7.4。
8.2 华为设备配置详解
8.2.1 命令行基础速览(本章会用到的那几条)
| 命令 | 在哪敲 | 干什么 |
|---|---|---|
dhcp enable |
系统视图 | 开启 DHCP 服务(必须第一步) |
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 |
地址池视图 | 下发的 DNS |
excluded-ip-address A B |
地址池视图 | 排除不分配的地址 |
lease day 1 hour 0 minute 0 |
地址池视图 | 租期 |
static-bind ip-address X mac-address Y |
地址池视图 | 静态绑定 |
dhcp select global |
Vlanif 视图 | 用全局地址池 |
dhcp select interface |
Vlanif 视图 | 用接口地址池 |
dhcp select relay |
Vlanif 视图 | 启用 DHCP 中继 |
dhcp relay server-ip 10.200.1.10 |
Vlanif 视图 | 指定中继服务器 |
dhcp snooping enable |
系统视图 | 开启 DHCP Snooping |
dhcp snooping trusted |
接口视图 | 设为信任口 |
display ip pool |
任意视图 | 看地址池使用情况 |
8.2.2 完整配置模板
下面是一台三层核心交换机做 DHCP 服务器(全局地址池方式)的完整配置:
# 华为三层核心交换机
system-view
sysname CORE-SW1
# 第一步:全局开启 DHCP 服务(漏了这一步后面全不生效)
dhcp enable
# 建业务 VLAN
vlan batch 10 20
quit
# ===== 全局地址池 POOL10(VLAN 10 用)=====
ip pool POOL10
# 可分配网段
network 192.168.10.0 mask 255.255.255.0
# 下发的网关(就是 Vlanif10 的地址)
gateway-list 192.168.10.1
# 下发的 DNS
dns-list 223.5.5.5 114.114.114.114
# 排除地址:网关以外的保留地址,
# 比如服务器区 .2 ~ .20,共 19 个,这里用区间写法
excluded-ip-address 192.168.10.2 192.168.10.20
# 租期 1 天
lease day 1 hour 0 minute 0
# 静态绑定:服务器固定拿 .30
static-bind ip-address 192.168.10.30 mac-address 00e0-fc12-3430
quit
# ===== 全局地址池 POOL20(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
excluded-ip-address 192.168.20.2 192.168.20.20
lease day 1 hour 0 minute 0
quit
# ===== 每个网段的 Vlanif 上指定用全局地址池 =====
interface Vlanif 10
ip address 192.168.10.1 255.255.255.0
dhcp select global
quit
interface Vlanif 20
ip address 192.168.20.1 255.255.255.0
dhcp select global
quit
quit
save
同一台设备改用接口地址池方式(不建全局地址池,直接用接口所在的网段分配):
# 华为:接口地址池方式
system-view
dhcp enable
vlan batch 30
quit
interface Vlanif 30
ip address 192.168.30.1 255.255.255.0
# 使用接口地址池:直接用本接口网段分配
dhcp select interface
# 排除 .1~.99(服务器区)
dhcp server excluded-ip-address 192.168.30.1 192.168.30.99
# 下发 DNS
dhcp server dns-list 223.5.5.5
# 租期 8 小时
dhcp server lease day 0 hour 8 minute 0
quit
quit
save
DHCP 中继配置:一台二层接入交换机把 DHCP 请求转发到远端的 DHCP 服务器:
# 华为:VLANIF 上配 DHCP 中继
system-view
sysname ACC-SW1
dhcp enable
vlan batch 40
interface Vlanif 40
ip address 192.168.40.1 255.255.255.0
# 指定为 DHCP 中继模式
dhcp select relay
# 指定远端 DHCP 服务器地址
dhcp relay server-ip 10.200.1.10
# 开启 Option 82,让服务器知道请求来自哪个 VLAN/接口
dhcp relay information enable
quit
quit
save
速率限制是两条命令,别只抄一条:dhcp snooping check dhcp-rate enable 只是「打开开关」,真正设阈值的是 dhcp snooping check dhcp-rate <pps>(如 50 表示每秒最多 50 个 DHCP 报文上送处理单元,超出的丢弃)。只开开关不设阈值,限速值取设备缺省,起不到针对性防护作用。官方推荐还需配合告警:dhcp snooping alarm dhcp-rate enable + dhcp snooping alarm dhcp-rate threshold <值>,这样一旦发生 DHCP 泛洪攻击能收到告警而不是静默丢包。
DHCP Snooping防私接配置(接入交换机):
# 华为:DHCP Snooping(只信任上联口)
system-view
sysname ACC-SW1
# 全局开启 DHCP Snooping
dhcp snooping enable
# 上联口设为信任口(只有这个口发来的 DHCP 应答才被接受)
interface GigabitEthernet0/0/24
dhcp snooping trusted
quit
# 用户接入口一般不需要额外配置(缺省就是非信任口)
# 防 DHCP 泛洪:先使能速率检测,再设定上送处理单元的报文速率上限
dhcp snooping check dhcp-rate enable
# 允许上送 DHCP 报文处理单元的速率最大值为 50 pps
dhcp snooping check dhcp-rate 50
quit
save
8.2.3 逐行讲解
dhcp enable 是总开关,这一步漏了,后面的地址池、dhcp select 全部是「配置存在但不生效」。它排在本章新手坑的第一位。
| 命令 | 作用 | 新手常错 |
|---|---|---|
dhcp enable |
全局开关 | 忘了配,其他命令全不生效 |
ip pool POOL10 |
建全局地址池 | 名字随意,但建议与 VLAN 对应 |
network 192.168.10.0 mask 255.255.255.0 |
定义网段 | 掩码写成 /24 报错,必须点分格式 |
gateway-list |
网关 | 必须与 Vlanif 地址一致,写错终端上不了网 |
excluded-ip-address |
排除范围 | 不排除网关本身也可能被分配出去(部分版本会自动排除网关,部分不会,建议显式排除) |
lease day 1 hour 0 minute 0 |
租期 | 由 day/hour/minute 三段组成,可只写一段(如 lease day 1),但不要写错位 |
static-bind |
静态绑定 | 绑定的地址必须在 network 内 |
dhcp select global |
接口绑全局池 | 漏配,接口不提供 DHCP |
dhcp select interface |
接口地址池 | 与 global 互斥,二选一 |
dhcp relay server-ip |
中继服务器 | 必须与中继接口不同网段(重要!) |
dhcp snooping trusted |
信任口 | 配在上联口,配错了用户口会造成全楼拿不到地址 |
全局地址池 vs 接口地址池是华为的一个特有设计,必须讲清两者的差别与选型:
| 对比项 | 全局地址池 | 接口地址池 |
|---|---|---|
| 配置位置 | ip pool NAME 系统视图 |
直接在 Vlanif 下配 dhcp server xxx |
| 网段关系 | network 可以任意定义 |
自动使用接口地址所在网段 |
| 地址池数量 | 一个池对应一个网段 | 每个接口一个池 |
| 灵活性 | 高(可跨网段、可精细控制) | 低(受接口地址约束) |
| 适用场景 | 多网段、需要统一管理 | 单网段、临时部署、小网络 |
| H3C 是否支持 | 支持(等价于 H3C 的 dhcp server ip-pool) |
不支持(H3C 无此概念) |
选择建议:有多个网段、需要集中管理地址池的,一律用全局地址池;只有在「就一个网段、临时配一下」的场景才用接口地址池。而且因为 H3C 没有接口地址池,跨厂商混编时要保证「两边都用全局地址池」,才能让配置模板通用。
排除地址(excluded-ip-address)的工程实践。规范做法是:每个网段预留以下地址不分配:
| 预留范围 | 用途 |
|---|---|
.1 |
网关 |
.2 ~ .20 |
服务器/网络设备固定地址 |
.200 ~ .254 |
预留(监控、打印机、AP 管理地址等) |
| 中间段 | 动态分配池 |
这样终端拿到的地址集中在 .21 ~ .199,服务器拿固定地址,互不冲突。不要把所有地址都放开让 DHCP 分配,否则会撞上手工配了固定 IP 的服务器和打印机,造成地址冲突。
DHCP 中继的两条硬规则:
第一条,中继服务器地址不能与中继接口同网段。这是官方文档明确写明的限制,原因是如果同网段,报文其实不需要中继(服务器就在本地),配了反而可能引起环路或异常。所以中继接口的网段(如 192.168.40.0/24)与服务器地址(10.200.1.10)必须不同网段。
第二条,中继路径上必须有到服务器的路由。中继把报文用单播发给服务器,如果路由表里没有到 10.200.1.10 的路由,报文发不出去,客户端永远拿不到地址。这是中继排错的第一检查项:先 ping 通服务器再谈其他。
Option 系列参数。DHCP 的 Option 字段是承载「额外参数」的容器,每个 Option 有编号:
| Option | 名称 | 用途 | 命令(华为全局池) |
|---|---|---|---|
| 43 | Vendor Specific Information | 厂商自定义,AC 的地址就是靠它下发 | option 43 sub-option 2 ip-address 10.200.1.5 |
| 60 | Vendor Class Identifier | 客户端厂商类型标识,服务器据此区分设备类型 | 服务器侧按 option 60 匹配地址池与参数 |
| 66 | TFTP Server Name | 引导服务器地址(PXE / IP 电话) | option 66 ascii 10.200.1.100 |
| 67 | Bootfile Name | 引导文件名(PXE / IP 电话配置) | option 67 ascii phones.cfg |
| 82 | Relay Agent Information | 中继信息(VLAN、接口),用于精确定位客户端位置 | dhcp relay information enable |
Option 43 是无线章节(第 19 章)的关键:AP 上电后通过 DHCP 拿到地址,同时收到 Option 43 得到 AC 的 IP,然后才能找 AC 上线。华为与 H3C 在 Option 43 的填写格式上不同——华为支持 sub-option 语法直观填写 AC 地址(这里 sub-option 2 是对华为 AP 约定的子选项号,具体以 AC/AP 型号文档为准),H3C 需要用十六进制字符串手工拼装。这个差异在第 19 章会详细展开,本章只需建立「Option 43 = AC 地址下发通道」的认知。
# 华为:在地址池里下发 Option 43(指向 AC 的地址)
[HUAWEI] ip pool POOL-AP
[HUAWEI-ip-pool-POOL-AP] network 192.168.40.0 mask 255.255.255.0
[HUAWEI-ip-pool-POOL-AP] gateway-list 192.168.40.1
[HUAWEI-ip-pool-POOL-AP] option 43 sub-option 2 ip-address 10.200.1.5
若还要下发引导服务器与引导文件名(IP 电话常用),在同一个地址池里追加两条:
# 华为:下发 Option 66 / 67(引导服务器与引导文件名)
[HUAWEI-ip-pool-POOL-VOICE] option 66 ascii 10.200.1.100
[HUAWEI-ip-pool-POOL-VOICE] option 67 ascii voice-config.cfg
租期的设计。租期长短是个权衡:
| 租期 | 优点 | 缺点 | 适用 |
|---|---|---|---|
| 短(1~4 小时) | 地址回收快、改配置生效快 | DHCP 报文量大、网络抖动时地址易丢 | 会议室、公共 WiFi、访客 |
| 中(8~24 小时) | 平衡 | — | 普通办公网 |
| 长(7~30 天) | 报文少、稳定 | 地址占用久、改网关后终端更新慢 | 固定办公、服务器 |
有一条经验:如果你预计会改网关或 DNS,租期要短;否则改完要等一个租期长度才能全网生效,中间会有一半终端上不了网。
DHCP Snooping 的原理与配置。DHCP Snooping 的核心是「信任端口」模型:
- 信任端口(trusted):允许回 DHCP OFFER/ACK 等应答报文,一般是上联口。
- 非信任端口(untrusted):丢弃所有 DHCP 服务器方向的报文(OFFER/ACK/NAK),只允许客户端方向的报文(DISCOVER/REQUEST)。
这样,如果有人在用户口私接了一台无线路由器(它自带 DHCP 服务器),它发出的 OFFER 会在非信任口被丢弃,终端就不会拿到错误的网关。同时 Snooping 会建立一张「DHCP Snooping 绑定表」,记录「MAC-IP-VLAN-接口」的对应关系,后续可以给 IP Source Guard、ARP 检测等功能使用(第 9 章)。
8.3 H3C 设备配置详解
8.3.1 命令行基础速览
| 命令 | 在哪敲 | 干什么 |
|---|---|---|
dhcp enable |
系统视图 | 开启 DHCP |
dhcp server ip-pool POOL10 |
系统视图 | 创建全局地址池(H3C 只有这一种) |
network 192.168.10.0 mask 255.255.255.0 |
地址池视图 | 可分配网段 |
gateway-list 192.168.10.1 |
地址池视图 | 网关 |
dns-list 223.5.5.5 |
地址池视图 | DNS |
expired day 1 |
地址池视图 | 租期 |
dhcp server forbidden-ip A B |
系统视图 | 全局排除地址 |
dhcp server apply ip-pool POOL10 |
接口视图 | 接口关联地址池 |
dhcp select relay |
接口视图 | 开启中继 |
dhcp relay server-address 10.200.1.10 |
接口视图 | 中继服务器地址 |
dhcp snooping enable |
系统视图 | DHCP Snooping |
dhcp snooping trust |
接口视图 | 信任口 |
display dhcp server ip-in-use |
任意视图 | 看已分配地址 |
8.3.2 完整配置模板
同样的 DHCP 服务器场景,H3C 侧的完整配置如下,注意地址池命令与排除地址的位置差异:
# H3C 三层核心交换机做 DHCP 服务器
system-view
sysname CORE-SW1
# 开启 DHCP
dhcp enable
vlan 10
quit
vlan 20
quit
# ===== 全局地址池 POOL10 =====
dhcp server 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
# 租期(关键字 expired,此处为 1 天)
expired day 1
# 静态绑定
static-bind ip-address 192.168.10.30 mask 255.255.255.0 hardware-address 00e0-fc12-3430
quit
dhcp server 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
expired day 1
quit
# ===== 排除地址:H3C 在系统视图用 forbidden-ip =====
dhcp server forbidden-ip 192.168.10.2 192.168.10.20
dhcp server forbidden-ip 192.168.20.2 192.168.20.20
# ===== 接口上关联地址池 =====
interface Vlan-interface 10
ip address 192.168.10.1 255.255.255.0
dhcp server apply ip-pool POOL10
quit
interface Vlan-interface 20
ip address 192.168.20.1 255.255.255.0
dhcp server apply ip-pool POOL20
quit
quit
save force
H3C 的 DHCP 中继配置如下,注意服务器地址命令是 dhcp relay server-address:
# H3C:DHCP 中继
system-view
sysname ACC-SW1
dhcp enable
vlan 40
interface Vlan-interface 40
ip address 192.168.40.1 255.255.255.0
# 设为中继模式
dhcp select relay
# 指定服务器地址(注意:不能与接口同网段)
dhcp relay server-address 10.200.1.10
# 开启 Option 82
dhcp relay information enable
quit
quit
save force
H3C 的 DHCP Snooping 配置,信任口命令是 dhcp snooping trust(少一个 ed):
# H3C:DHCP Snooping
system-view
sysname ACC-SW1
dhcp snooping enable
# 上联口设为信任口
interface GigabitEthernet1/0/24
dhcp snooping trust
quit
quit
save force
8.3.3 逐行讲解
| H3C 命令 | 对应华为 | 差异要点 |
|---|---|---|
dhcp server ip-pool POOL10 |
ip pool POOL10 |
H3C 前缀是 dhcp server |
network ... mask ... |
相同 | 相同 |
gateway-list / dns-list |
相同 | 相同 |
expired day 1 |
lease day 1 hour 0 minute 0 |
命令名与参数个数不同 |
static-bind ip-address X mask Y hardware-address Z |
static-bind ip-address X mac-address Y |
H3C 必须带 mask,MAC 关键字不同 |
dhcp server forbidden-ip A B |
excluded-ip-address A B(在池内) |
位置不同:H3C 在系统视图全局配,华为在池内配 |
dhcp server apply ip-pool POOL10 |
dhcp select global |
H3C 指定池名,华为只说明「用全局池」 |
dhcp select relay |
dhcp select relay |
相同 |
dhcp relay server-address IP |
dhcp relay server-ip IP |
server-address vs server-ip |
dhcp snooping trust |
dhcp snooping trusted |
trust vs trusted |
三处最容易抄错的:
第一,forbidden-ip 与 excluded-ip-address 的位置不同。华为的排除地址写在地址池内部,H3C 写在系统视图全局,且作用于全局(同一个地址在各个池里都被排除)。这意味着 H3C 的排除是「跨池生效」的,配置时要想清楚影响范围。
第二,dhcp relay server-address 少一个字母就用不了。华为是 server-ip,H3C 是 server-address。这行命令抄错,中继全部失效,而且报错信息不一定明显。
第三,H3C 的中继服务器地址同样不能与接口同网段。这条限制两家一致,H3C 文档也明确写了「指定的 DHCP 服务器 IP 地址不能与 DHCP 中继的接口 IP 地址在同一网段,否则可能导致客户端无法获得 IP 地址」。
H3C 没有「接口地址池」。这是两家最本质的差异。华为可以在 Vlanif 下直接写 dhcp server dns-list、dhcp server excluded-ip-address,各接口独立一套参数;H3C 必须建地址池再关联。如果从华为迁移到 H3C,接口地址池那套配置要全部重写为「全局池 + apply ip-pool」。
H3C 的静态绑定必须带掩码。static-bind ip-address X mask Y hardware-address Z 三个参数缺一不可,而华为的 static-bind ip-address X mac-address Y 只需要两个——这个差异在批量脚本里很容易漏。
H3C 的 Option 配置
H3C 的 Option 43 需要手工构造十六进制串,格式为「子选项号 + 长度 + 内容」:
# H3C:Option 43(AC 地址)需要按 hex 格式填写
# 格式说明:子选项类型(1字节) + 子选项长度(1字节) + AC地址(4字节)
# 例如 AC 地址 10.200.1.5 = 0A C8 01 05
# 华为 AP 约定的子选项类型 2,长度 4
[H3C-dhcp-pool-POOL-AP] option 43 hex 02040AC80105
这个十六进制串的含义是:02 = 子选项 2(华为 AP 约定),04 = 长度 4 字节,0AC80105 = AC 地址 10.200.1.5。如果 AC 地址变了,这个串必须重算——这是 H3C 配 Option 43 最容易出错的地方。华为的 sub-option 2 ip-address 写法可以直接写 IP,不用算十六进制,可读性好得多。
⚠ 版本差异:H3C 是否支持 option 43 sub-option 便于阅读的写法与型号/版本相关;option 43 hex 是通用稳妥的写法。AP 的 Option 43 子选项格式与厂商约定强相关,对接华为 AP 时用华为的格式,对接 H3C AP 时用 H3C 的格式,混用 AP 与 AC 时务必查对应型号文档。
Option 66/67:
# H3C:Option 66 / 67
[H3C-dhcp-pool-POOL-VOICE] option 66 ascii 10.200.1.100
[H3C-dhcp-pool-POOL-VOICE] option 67 ascii voice-config.cfg
DHCP 报文为什么在交换网络里会「迷路」
DHCP 的 DISCOVER 是广播报文,目的 MAC 是 ff-ff-ff-ff-ff-ff、目的 IP 是 255.255.255.255、UDP 端口 67/68。这里就埋下了两个结构性限制:
限制一:广播不能跨三层设备。 路由器不会转发目的地址为 255.255.255.255 的报文,所以一个 DHCP 服务器无法直接服务另一个网段的客户端——必须靠中继。
限制二:客户端拿不到地址前,自己没有任何三层地址。 它连自己的源 IP 都没有(全 0),服务器也没法用单播回它。所以 OFFER 和 ACK 通常也是广播(或者用目的 MAC 单播到客户端网卡地址),这取决于客户端的 BROADCAST 标志位。
正因为这样,DHCP 的「广播」特性是最容易被网络安全机制破坏的:
- DHCP Snooping 拦截服务器方向的报文(这是它的设计目的)。
- 端口隔离 会让广播无法在同隔离组的端口间传播——如果服务器不在隔离组的另一侧,客户端就永远拿不到地址。
- ACL 如果误拦了 UDP 67/68,DHCP 会静默失败(非常难查)。
- STP 阻塞 如果阻塞了通往服务器的那条链路,也会导致广播到不了。
所以「DHCP 拿不到地址」这个问题,一半的原因在网络侧而不在 DHCP 本身。排查时一定要想清楚「这个广播报文能不能到达服务器」,而不只是看着服务器配置发呆。
DHCP 安全风险全景
DHCP 是典型的「无认证协议」:服务器不验证客户端的身份,客户端也不验证服务器的身份(除了 Snooping 这种旁路机制)。由此衍生出四类常见攻击:
| 攻击类型 | 攻击方式 | 危害 | 防护手段 |
|---|---|---|---|
| 伪造 DHCP 服务器(私接路由器) | 在接入网口接一台带 DHCP 的路由器 | 终端拿到错误网关/DNS,被劫持 | DHCP Snooping(非信任口丢弃 OFFER/ACK) |
| DHCP 饿死攻击 | 伪造大量不同 MAC 的 DISCOVER | 地址池被瞬间耗尽,正常终端拿不到地址 | 限制接口 DHCP 报文速率、MAC 学习限制(第 9 章) |
| 伪造 DHCP 客户端(MAC 伪造) | 不停地换 MAC 申请地址 | 地址池耗尽、Snooping 绑定表膨胀 | 端口安全(限制每口 MAC 数)、Snooping 绑定表容量保护 |
| 中间人(DHCP 劫持) | 抢先应答 OFFER 并把自己设为网关 | 流量被窃听/篡改 | Snooping + ARP 防欺骗 + 802.1X 认证 |
「DHCP 饿死攻击」值得单独讲,因为它非常容易实施:攻击者只要用一个脚本,伪造几百个不同源 MAC 的 DISCOVER 报文发出去,服务器就会为每个 MAC 分配一个地址(即使客户端从不真的使用),几分钟就能把 /24 的池子掏空。防护靠两层:一是限制每个接口的 DHCP 报文速率(dhcp snooping check dhcp-rate enable 之类),二是限制每个接口能学习的 MAC 数量(端口安全,第 9 章)。一个口只允许学到 1~3 个 MAC,饿死攻击根本发不起来。
DHCP 与无线、语音的配合
在实际的园区网里,DHCP 还要服务 AP 和 IP 电话,这两个场景有特殊要求:
AP 上线:AP 需要「先拿到地址、再拿到 AC 地址」。地址是 DHCP 给的,AC 地址则通过 DHCP Option 43 下发(或者通过 DNS 解析 AC 域名、或者通过广播/组播发现)。所以 AP 业务 VLAN 的 DHCP 地址池必须配 Option 43,否则 AP 拿到地址后找不到 AC,会一直停在「等待上线」的状态。这是无线网络部署里最高频的一个问题,第 19 章会详细展开。
IP 电话:话机除了地址、网关、DNS,还需要知道「配置文件服务器在哪」(Option 66)和「配置文件叫什么」(Option 67)。话机从 TFTP 服务器下载配置后才知道自己的账号、注册服务器、VLAN 等。所以 语音 VLAN 的 DHCP 地址池通常要配 Option 66/67。
小结一下「不同 VLAN 的 DHCP 池要配什么」:
| VLAN 类型 | 必配项 | 备注 |
|---|---|---|
| 办公终端 | network / gateway / dns / 租期 | 常规配置 |
| 无线用户 | network / gateway / dns / 租期 | 与办公类似,租期可短些 |
| AP 管理 | 上述 + Option 43 | 关键 |
| IP 电话 | 上述 + Option 66/67 | 关键 |
| 服务器 | 一般不用 DHCP | 手工配固定地址更稳 |
| 管理网 | 一般手工配 | 交换机/AP 管理地址应固定 |
DHCP 与 IP 地址规划的联动
DHCP 的「地址池」不是独立存在的,它必须与 IP 规划表严格对应。工程上建议维护这样一份表:
| VLAN | 网段 | 网关 | DHCP 池范围 | 排除范围 | 租期 | 特殊 Option |
|---|---|---|---|---|---|---|
| 10 | 192.168.10.0/24 | .1 | .21 ~ .199 | .2 ~ .20、.200 ~ .254 | 1 天 | — |
| 20 | 192.168.20.0/24 | .1 | .21 ~ .199 | .2 ~ .20、.200 ~ .254 | 1 天 | — |
| 40(AP) | 192.168.40.0/24 | .1 | .11 ~ .250 | .2 ~ .10 | 7 天 | Option 43 = AC |
| 50(语音) | 192.168.50.0/24 | .1 | .11 ~ .250 | .2 ~ .10 | 7 天 | Option 66/67 |
| 99(管理) | 10.200.99.0/24 | .1 | 不用 DHCP | — | — | — |
这张表的价值在于:任何人拿到它,都能独立完成配置,不需要再问「这个池子该排除哪些地址」。这也是本书推荐录进运维文档的格式。
8.4 华为 / H3C 命令对照表
| 功能 | 华为(VRP) | H3C(Comware V7) | 差异说明 |
|---|---|---|---|
| 开启 DHCP | dhcp enable |
dhcp enable |
相同 |
| 建地址池 | ip pool POOL10 |
dhcp server ip-pool POOL10 |
命令名不同 |
| 网段 | network X mask Y |
network X mask Y |
相同 |
| 网关 | gateway-list X |
gateway-list X |
相同 |
| DNS | dns-list X |
dns-list X |
相同 |
| 租期 | lease day 1 hour 0 minute 0 |
expired day 1 |
命令名与参数不同 |
| 排除地址 | excluded-ip-address A B(池内) |
dhcp server forbidden-ip A B(系统视图) |
位置不同 |
| 静态绑定 | static-bind ip-address X mac-address Y |
static-bind ip-address X mask Y hardware-address Z |
H3C 要 mask |
| 接口用全局池 | dhcp select global |
dhcp server apply ip-pool POOL |
H3C 要指定池名 |
| 接口地址池 | dhcp select interface + dhcp server xxx |
不支持 | 华为独有 |
| 中继 | dhcp select relay |
dhcp select relay |
相同 |
| 中继服务器 | dhcp relay server-ip X |
dhcp relay server-address X |
server-ip vs server-address |
| Option 82 | dhcp relay information enable |
dhcp relay information enable |
相同 |
| Option 43 | option 43 sub-option 2 ip-address X |
option 43 hex 0204XXXXXXXX |
写法差异大 |
| Option 66/67 | option 66 ascii X |
option 66 ascii X |
相同 |
| Snooping 开 | dhcp snooping enable |
dhcp snooping enable |
相同 |
| Snooping 信任 | dhcp snooping trusted |
dhcp snooping trust |
trusted vs trust |
| 看已分配 | display ip pool |
display dhcp server ip-in-use |
命令不同 |
| 看剩余 | display ip pool name POOL10 used |
display dhcp server free-ip |
命令不同 |
DHCP 服务器的选型:设备内置还是独立服务器
一个实际的架构问题:DHCP 应该跑在交换机上,还是跑在一台独立服务器(Windows Server / Linux)上?
| 方案 | 优点 | 缺点 | 适用规模 |
|---|---|---|---|
| 设备内置 DHCP(交换机/路由器) | 无需额外设备、延迟低、可靠性跟设备走 | 地址池容量与功能受限、不好做多池集中管理、日志能力弱 | 小型网络、单台核心覆盖全网的场景 |
| 独立 DHCP 服务器 | 容量大、可集中管理几十个池、日志与审计完善、可与 IPAM 系统联动 | 需要额外服务器与维护、必须部署中继 | 中大型网络、多楼栋多网段 |
工程上的主流选择是:小型办公网或单楼栋用设备内置 DHCP;超过几百台终端、跨多栋楼的园区网用独立服务器 + 中继。独立服务器的好处在故障排查时体现得最明显——/var/log/dhcpd.log 或者 Windows 的 DHCP 审计日志会记下每一次分配,而设备上的日志容量与查询能力都很有限。
还有一个折中方案值得知道:华为/H3C 设备可以与独立的 DHCP 服务器配合,也可以只做中继。这样既有集中管理,又不需要在所有核心上都维护地址池。
8.5 配置验证
第一步:确认 DHCP 服务已开启。这一步最容易被跳过,但它是所有失败的头号原因:
<HUAWEI> display current-configuration | include dhcp enable
看到 dhcp enable 才算开了。
第二步:确认地址池与分配情况:
<HUAWEI> display ip pool
正常输出:
Pool-name : POOL10
Pool-No : 0
Position : Local Status : Unlocked
Gateway-0 : 192.168.10.1
Mask : 255.255.255.0
Network : 192.168.10.0
Boot server : -
DNS server : 223.5.5.5
Domain name : -
DNS relay : -
Netbios server : -
Idle : 178
Used : 21
Expired : 0
Conflict : 0
Disable : 0
Total : 254
Lease time : 1 0 0
关键读法:Used 表示已分配,Idle 表示可用,Total 是总地址数,Lease time 是 天 时 分。如果 Used 接近 Total,说明地址池快耗尽;Conflict 有值说明存在地址冲突(有人手工配了池里的地址)。
# 看具体分配给了谁
<HUAWEI> display ip pool name POOL10 used
输出会列出每个已分配地址、对应 MAC、剩余租期、所在接口——这张表是「查某个终端是不是 DHCP 拿的、拿到什么」的最快入口。
第三步:在终端侧验证。Windows 上用:
C:\> ipconfig /all
能看到 DHCP 已启用: 是、已获得租约、租约过期 时间,以及 DHCP 服务器 的地址。如果显示 169.254.x.x,说明没拿到 DHCP 地址(APIPA 自动私有地址),需要回来查服务器侧。
第四步:中继验证:
# 华为:查看中继配置与统计
<HUAWEI> display dhcp relay statistics
<HUAWEI> display dhcp relay all
display dhcp relay all 会显示每个接口的中继配置;统计里能看到收到的 DISCOVER 数量和转发的数量,如果收到很多转发 0,说明转发路径(路由)有问题。
第五步:Snooping 验证:
# 华为:查看 Snooping 绑定表(这张表就是 MAC-IP-接口的对应关系)
<HUAWEI> display dhcp snooping user-bind all
正常输出:
DHCP dynamic Bind-table:
IP Address MAC Address VLAN Interface Lease
192.168.10.101 00e0-fc12-3465 10 GigabitEthernet0/0/1 86350
192.168.10.102 00e0-fc12-3466 10 GigabitEthernet0/0/2 86348
如果这张表是空的但终端拿到了地址,说明 Snooping 没生效或者报文没有经过 Snooping 设备。
H3C 的验证命令:
<H3C> display dhcp server ip-in-use
<H3C> display dhcp server free-ip
<H3C> display dhcp server pool
<H3C> display dhcp relay server-address
<H3C> display dhcp snooping binding
H3C display dhcp server ip-in-use 输出格式:
IP address Client identifier/ Lease expiration Type
Hardware address
192.168.10.101 00e0-fc12-3465 Feb 20 10:12:00 2024 Auto(C)
Type 列的 Auto(C) 表示动态分配,Static 表示静态绑定。
8.6 排错与故障树
DHCP 排错的第一步永远是分清角色:这台设备是服务器、是中继,还是中间的二层设备?三种角色的关注点完全不同:
| 角色 | 关注什么 | 首选命令 |
|---|---|---|
| DHCP 服务器 | 地址池、绑定表、报文收发计数 | display ip pool |
| DHCP 中继 | 转发统计、服务器地址、路由 | display dhcp relay statistics |
| 中间二层设备 | Snooping 信任口、VLAN 是否放行、端口隔离 | display dhcp snooping user-bind all、display vlan |
如果角色都分不清,就先问一句「DHCP 服务器在哪」,然后从服务器端往回查。
| 症状 | 可能原因 | 排查命令 | 定位方法 |
|---|---|---|---|
| 终端拿到 169.254 地址 | 没开 dhcp enable / 服务器不在本网段 |
display current-configuration | include dhcp enable |
补开服务 |
| 终端完全没地址 | 接口没配 dhcp select |
display current-configuration interface Vlanif 10 |
补 dhcp select global/interface |
| 地址池显示 Used 为 0 | 接口没关联池 / 网段不匹配 | display ip pool |
检查 network 与接口网段 |
| 地址池耗尽 | 租期太长 / 地址太少 | display ip pool 看 Idle |
缩短租期、扩大网段、清理僵尸租约 |
| 终端拿到地址但上不了网 | gateway-list 写错 |
display ip pool 看 Gateway |
修正网关地址 |
| 中继不工作 | server-ip 与接口同网段 / 路由不通 |
display dhcp relay statistics、ping 服务器 |
改地址;补路由 |
| 中继后客户端拿不到地址 | 服务器上没有对应网段的地址池 | 服务器端 display ip pool |
服务器要能看到 giaddr 网段 |
| 部分终端拿不到 | Snooping 信任口配错 | display dhcp snooping user-bind all |
信任口必须是上联口 |
| 有终端拿到错误网关 | 有人私接 DHCP 服务器 | 日志查 DHCP Snooping 丢弃记录 |
开 Snooping,非信任口丢弃 |
| 地址冲突告警 | 手工配了池内地址 | display ip pool 看 Conflict |
排除手工地址或改 DHCP 池范围 |
| Option 43 不生效、AP 上不了线 | 十六进制串写错(H3C)/ 子选项号错 | 在 AP 侧抓包看 Option 43 | 重算 hex,或核对型号约定 |
| 租期改了但终端地址没变 | 终端还在租期内 | display ip pool name POOL used 看 Lease |
等租期,或 reset ip pool 强制回收 |
故障树(「终端拿不到地址」):
终端拿不到地址(169.254)
|
+-- 服务器侧开 dhcp enable 了吗?--> 没有就开
|
+-- 接口配 dhcp select 了吗?--> 没有就配
|
+-- 地址池网段与接口网段匹配吗?--> 不匹配就改
|
+-- 地址池还有空闲地址吗?(display ip pool 看 Idle)
| +-- Idle = 0 -> 扩容/缩租期/清理
|
+-- 本网段是否是中继场景?
| +-- 是 -> 中继配置对不对?服务器地址与接口同网段吗?
| 路由通吗?服务器端有对应池吗?
|
+-- 接入层是不是开了 DHCP Snooping 而信任口配错?
+-- 用户口被配成信任、上联口没信任 -> 报文被丢
8.7 新手踩坑与注意事项
- 漏配
dhcp enable——症状:地址池、dhcp select都配了但终端拿不到地址;怎么避:这是第一步,永远先配。 gateway-list与Vlanif地址不一致——症状:终端能拿到地址但上不了网;怎么避:两者必须一字不差。- 排除地址只排了网关——症状:服务器手工地址与 DHCP 分配冲突;怎么避:把服务器区、监控区、AP 管理区都排除。
- 中继服务器地址与接口同网段——症状:中继配了但不转发;怎么避:服务器地址必须不同网段。
- 中继路径上没有路由——症状:统计里收到有转发为 0;怎么避:先 ping 通服务器。
- 服务器上没有中继网段的地址池——症状:中继收到了但服务器不回 OFFER;怎么避:服务器要按
giaddr网段配置对应地址池。 - Snooping 信任口配反——症状:全楼终端都拿不到地址;怎么避:信任口只能配在上联(去服务器方向)的口上。
dhcp relay server-ip抄成 H3C 的server-address——症状:命令报错或不生效;怎么避:华为server-ip,H3Cserver-address。- H3C 照抄华为的接口地址池——症状:命令不存在;怎么避:H3C 只有全局池,用
apply ip-pool关联。 exception与forbidden位置混淆——症状:排除地址不生效;怎么避:华为在池内excluded-ip-address,H3C 在系统视图forbidden-ip。- 租期设得太长导致改配置后更新慢——症状:网关改了但一半终端还指向旧网关;怎么避:改造前先把租期缩短到 1~2 小时。
- Option 43 的十六进制串手算错误——症状:AP 找不到 AC;怎么避:用工具换算,配置后抓包验证十六进制内容。
- DHCP 地址池跨了 VLAN——症状:终端拿到别的网段地址;怎么避:每个 VLAN 一个池,
dhcp select配在对应的Vlanif上。
8.8 本章小结
- 四报文 DORA:DISCOVER(找服务器)→ OFFER(给地址)→ REQUEST(要确认)→ ACK(确认),补充报文 NAK/DECLINE/RELEASE/INFORM。
- 租期机制:T1 = 50% 租期单播续租,T2 = 87.5% 广播续租,到期重来。
giaddr是中继的灵魂:它把「请求来自哪个网段」告诉远端服务器,服务器据此选地址池。- 华为两种地址池:全局池(
ip pool+dhcp select global)与接口池(dhcp select interface);H3C 只有全局池。 - 排除地址位置不同:华为池内
excluded-ip-address,H3C 系统视图dhcp server forbidden-ip。 - 中继两条硬规则:服务器地址不能与中继接口同网段;到服务器必须有路由。
- DHCP Snooping 靠信任口模型:上联口 trusted/trust,用户口默认非信任,非信任口丢弃服务器方向的报文。
- Option 43 是 AC 下发通道:华为可用
sub-option写法,H3C 需hex手算。
自测题
- 终端拿到 169.254 开头的地址,说明什么?排查顺序是什么?
- DHCP 中继为什么必须把
giaddr填成客户端所在网段的网关地址?如果填错会怎样? - 华为的接口地址池与全局地址池有什么区别?为什么 H3C 没有接口地址池?
- DHCP Snooping 为什么能防私接 DHCP 服务器?信任口配错会导致什么后果?
- 华为的排除地址命令和 H3C 的排除地址命令分别是什么?配在哪个视图下?
- 说明终端没有从 DHCP 服务器拿到地址,用了 APIPA(自动私有地址)。排查顺序:① 确认服务器上
dhcp enable已配;② 确认接入该终端的接口(Vlanif)配了dhcp select global/interface;③ 确认地址池网段与接口网段一致;④display ip pool看Idle是否还有空闲地址;⑤ 如果是中继场景,检查中继配置、服务器地址网段、路由与服务器端地址池;⑥ 检查接入层 DHCP Snooping 的信任口配置是否正确。 - 因为 DHPC 服务器可能同时服务几十个网段,它必须知道「这个请求是从哪个网段来的」,才能从对应网段的地址池里取地址;客户端只知道自己所在的广播域,填不了这个信息,所以由中继代理把自己的接口地址(即客户端网关地址)填入
giaddr。如果填错,服务器可能从错误的地址池分配地址,导致客户端拿到不属于本网段的地址而无法通信。 - 接口地址池是华为在 Vlanif 接口下直接配置的一套 DHCP 参数(
dhcp select interface+dhcp server dns-list等),分配范围自动取接口所在网段。全局地址池是先定义ip pool NAME、在池内定义network等参数,再在接口上用dhcp select global关联。H3C 的 DHCP 实现采用「地址池 + 接口关联」的模型,功能上等价于全局地址池,没有接口地址池这种形式。 - DHCP Snooping 把接口分为信任与非信任:非信任口(用户口)收到 DHCP 服务器方向的报文(OFFER/ACK/NAK)会直接丢弃,只有信任口(上联口)才允许。用户私接的无线路由器发出的 OFFER 因此被丢弃,终端不会拿到错误地址。如果信任口配反(把用户口设成信任、上联口不信任),上联正常服务器的应答会被丢弃,整栋楼的终端都拿不到地址。
- 华为:
excluded-ip-address 起始 结束,配置在地址池视图(ip pool视图)内;接口地址池模式下用dhcp server excluded-ip-address。H3C:dhcp server forbidden-ip 起始 结束,配置在系统视图下,全局生效。
关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录
本人保留对侵权者及其全家发动因果律武器的权利
版权提醒
如无特殊申明,本站所有文章均是本人原创。转载请务必附上原文链接:https://www.elliot98.top/post/huawei-h3c-book/08/。
如有其它需要,请邮件联系!版权所有,违者必究!