跳到正文
Lutong's Homepage

华为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 新手踩坑与注意事项

  1. 漏配 dhcp enable——症状:地址池、dhcp select 都配了但终端拿不到地址;怎么避:这是第一步,永远先配。
  2. gateway-list 与 Vlanif 地址不一致——症状:终端能拿到地址但上不了网;怎么避:两者必须一字不差。
  3. 排除地址只排了网关——症状:服务器手工地址与 DHCP 分配冲突;怎么避:把服务器区、监控区、AP 管理区都排除。
  4. 中继服务器地址与接口同网段——症状:中继配了但不转发;怎么避:服务器地址必须不同网段。
  5. 中继路径上没有路由——症状:统计里收到有转发为 0;怎么避:先 ping 通服务器。
  6. 服务器上没有中继网段的地址池——症状:中继收到了但服务器不回 OFFER;怎么避:服务器要按 giaddr 网段配置对应地址池。
  7. Snooping 信任口配反——症状:全楼终端都拿不到地址;怎么避:信任口只能配在上联(去服务器方向)的口上。
  8. dhcp relay server-ip 抄成 H3C 的 server-address——症状:命令报错或不生效;怎么避:华为 server-ip,H3C server-address。
  9. H3C 照抄华为的接口地址池——症状:命令不存在;怎么避:H3C 只有全局池,用 apply ip-pool 关联。
  10. exception 与 forbidden 位置混淆——症状:排除地址不生效;怎么避:华为在池内 excluded-ip-address,H3C 在系统视图 forbidden-ip。
  11. 租期设得太长导致改配置后更新慢——症状:网关改了但一半终端还指向旧网关;怎么避:改造前先把租期缩短到 1~2 小时。
  12. Option 43 的十六进制串手算错误——症状:AP 找不到 AC;怎么避:用工具换算,配置后抓包验证十六进制内容。
  13. 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 手算。

自测题

  1. 终端拿到 169.254 开头的地址,说明什么?排查顺序是什么?
  2. DHCP 中继为什么必须把 giaddr 填成客户端所在网段的网关地址?如果填错会怎样?
  3. 华为的接口地址池与全局地址池有什么区别?为什么 H3C 没有接口地址池?
  4. DHCP Snooping 为什么能防私接 DHCP 服务器?信任口配错会导致什么后果?
  5. 华为的排除地址命令和 H3C 的排除地址命令分别是什么?配在哪个视图下?
  1. 说明终端没有从 DHCP 服务器拿到地址,用了 APIPA(自动私有地址)。排查顺序:① 确认服务器上 dhcp enable 已配;② 确认接入该终端的接口(Vlanif)配了 dhcp select global/interface;③ 确认地址池网段与接口网段一致;④ display ip pool 看 Idle 是否还有空闲地址;⑤ 如果是中继场景,检查中继配置、服务器地址网段、路由与服务器端地址池;⑥ 检查接入层 DHCP Snooping 的信任口配置是否正确。
  2. 因为 DHPC 服务器可能同时服务几十个网段,它必须知道「这个请求是从哪个网段来的」,才能从对应网段的地址池里取地址;客户端只知道自己所在的广播域,填不了这个信息,所以由中继代理把自己的接口地址(即客户端网关地址)填入 giaddr。如果填错,服务器可能从错误的地址池分配地址,导致客户端拿到不属于本网段的地址而无法通信。
  3. 接口地址池是华为在 Vlanif 接口下直接配置的一套 DHCP 参数(dhcp select interface + dhcp server dns-list 等),分配范围自动取接口所在网段。全局地址池是先定义 ip pool NAME、在池内定义 network 等参数,再在接口上用 dhcp select global 关联。H3C 的 DHCP 实现采用「地址池 + 接口关联」的模型,功能上等价于全局地址池,没有接口地址池这种形式。
  4. DHCP Snooping 把接口分为信任与非信任:非信任口(用户口)收到 DHCP 服务器方向的报文(OFFER/ACK/NAK)会直接丢弃,只有信任口(上联口)才允许。用户私接的无线路由器发出的 OFFER 因此被丢弃,终端不会拿到错误地址。如果信任口配反(把用户口设成信任、上联口不信任),上联正常服务器的应答会被丢弃,整栋楼的终端都拿不到地址。
  5. 华为:excluded-ip-address 起始 结束,配置在地址池视图(ip pool 视图)内;接口地址池模式下用 dhcp server excluded-ip-address。H3C:dhcp server forbidden-ip 起始 结束,配置在系统视图下,全局生效。

关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录