DHCP 靠广播,而广播出不了路由器,所以「服务器放别的网段」本来行不通。 中继代理把广播捡起来、转成单播发出去,一台服务器就能管全网。
5.5.2 的四步里有三步是广播,这一节讲「广播怎么跨网段」。 5.3.4 讲 RARP 死在「不能跨网段」,这里是 DHCP 的解法。
一、它做了一件很简单的事
中继代理(Relay Agent)通常就是网关路由器自己,它做的事只有一件:把 DHCP 广播转成单播。
| 步 | 发生什么 | 关键点 |
|---|---|---|
| 1 | 客户端广播 Discover | 只在本网段 |
| 2 | 中继改成单播发给服务器 | 带上「我是哪个网段」 |
| 3 | 服务器按网段选地址池 | 回单播给中继 |
| 4 | 中继转发回客户端 | 客户端以为服务器就在本地 |
第二步那个「带上我是哪个网段」是全部的关键:它在报文里填一个「网关 IP 地址」字段, 服务器看到就知道「该从哪个池子里拿地址」。 没有这个字段,一台服务器管不了多个网段。 第四行「客户端以为服务器在本地」是透明的效果:客户端完全不知道中间有中继, 它照样发广播、照样收 Offer。 这种透明让部署变得简单——客户端一行配置都不用改。
二、省了多少台服务器
算一下就明显了:
| 网段数 | 没有中继 | 有中继 |
|---|---|---|
| 10 | 10 台服务器 | 1 台 |
| 50 | 50 台 | 1 台 |
| 200 | 200 台 | 1 台 |
「200 台变 1 台」不只是省钱: 地址池、保留地址、选项(比如 PXE 启动的服务器地址)全在一个地方配,改一次全网生效。 而分散部署时,「改 200 个地方还漏了几个」是常态。 所以实际部署里中继几乎是默认开着的:「DHCP 服务器在别的网段」是常态,不是特例。
三、一个常见的坑
中继要能工作,有两个前提常被忽略:
| 前提 | 不满足会怎样 | 怎么查 |
|---|---|---|
| 服务器要有回程路由 | Offer 发不回来 | 服务器上 ping 客户端网段 |
| 中间防火墙放行 67/68 | 单播被拦 | 看防火墙策略 |
第一行是最常见的: 中继把请求转过来了,服务器也选了地址,但「回给中继」的那一步路由不通—— 结果就是「客户端一直重试,服务器日志里却一切正常」。 第二行是「UDP 端口」的问题:DHCP 用 67(服务器)和 68(客户端), 这两个端口如果被拦,中继就白设了。
四、动手 Demo:DHCP 中继为什么必需
把「广播只能在本网段」这件事走一遍,看中继在哪一步插手。 注意第四步:客户端全程不知道有中继。
steps = [('客户端广播 Discover', '只在本网段'),
('中继改单播发出', '带上「我是哪个网段」'),
('服务器按池子选地址', '回单播给中继'),
('中继转回客户端', '客户端以为在本地')]
for a, b in steps:
print(a, b)
实跑输出:
--------------------------------------------------------------------
DHCP 中继为什么必需
--------------------------------------------------------------------
**DHCP 的第一步是广播,而广播出不了路由器。**
**所以「服务器放在别的网段」这件事,本身是行不通的。**
**中继代理(Relay Agent)就是那个「把广播捡起来、转成单播发出去」的角色**:
**它通常就是网关路由器自己。**
步 发生什么 关键点
----------------------------------------------------------------------------
**1** **客户端广播 Discover** **只在本网段**
**2** **中继收到,改成单播发给服务器** **带上「我是哪个网段」**
**3** **服务器按网段选地址池** **回单播给中继**
**4** **中继转发回客户端** **客户端以为服务器就在本地**
**第二步那个「带上我是哪个网段」是核心**:**它在 DHCP 报文里填一个「网关 IP 地址」字段**,
**服务器看到就知道「该从哪个池子里拿」。**
**没有这个字段,一台服务器管不了多个网段。**
**算一下「省了多少台服务器」**:
**20 个网段,如果没有中继,就要 20 台 DHCP 服务器**;**有了中继,只要 1 台。**
**这就是「集中管理」的价值**:**地址池、保留、选项全在一个地方配,改一次全网生效。**
**实际部署里中继几乎总是开着的**:**因为「每个网段放一台 DHCP」既不划算也不好维护。**
**所以「DHCP 服务器在另一个网段」是常态,不是特例。**
「带上我是哪个网段」靠的是 giaddr 字段:它是报文里固定的一位, 中继填自己面向客户端的那个接口地址。服务器拿它去匹配「哪一个地址池」,这是全部的逻辑。 「客户端以为在本地」这件事有副作用: 抓包时如果只在客户端抓,你完全看不出「服务器其实在另一个网段」, 所以「查 DHCP 问题」要在中继设备上抓一份对照。 中继和「DHCP Snooping」是两件事,别混:前者让广播跨网段,后者防「私接 DHCP 服务器」。 企业网络里两个通常都开,因为「有人插一个家用路由器当 DHCP」是很常见的故障源。
30 秒实验
- 算一下:50 个网段,没有中继要几台 DHCP 服务器?
- 想一下:中继为什么要在报文里填「我是哪个网段」?
- 想一下:为什么「服务器日志正常但客户端拿不到地址」?
常见误区
- 以为「DHCP 服务器必须在同一网段」。 不必,靠中继就能跨网段。
- 以为「中继是独立设备」。 通常就是网关路由器,开一个功能而已。
- 以为「配了中继就一定通」。 还要回程路由和端口放行,缺一个都不行。
自测三问(点开对答案)
1. 中继代理做了什么? —— **把 DHCP 广播转成单播发给远端服务器**,并在报文里填上客户端所在网段。 2. 为什么「一台服务器管全网」是可能的? —— **因为服务器靠「网关 IP 地址」字段区分不同网段的地址池。** 3. 中继工作的两个前提是什么? —— **服务器要有回程路由,中间要放行 UDP 67/68。**下一节讲另一件「地址不够用」的补丁:NAT。
- ☐ (本节完,下一节 5.6.1 NAT定义)