主题
潇然PE启动高级使用 - 2.进阶篇 - 2.1.DHCP和TinyPXE
学习相关DHCP基础知识:BV1Gd4y1n7Xz
本视频将为大家实操TinyPXEServer并通过TinyPXEServer了解DHCP的相关原理
1. PXE 网络启动环境准备
首先确保 TinyPXE 服务器与客户端在同一局域网(同一 VLAN、同一广播域),服务器防火墙需放开以下 UDP 端口:
| 端口 | 协议 | 方向 | 用途 |
|---|---|---|---|
| 67 | UDP | 客户端 → 服务器 | DHCP/ProxyDHCP 监听端口 |
| 68 | UDP | 服务器 → 客户端 | DHCP 响应发送端口 |
| 69 | UDP | 客户端 → 服务器 | TFTP 文件传输 |
| 4011 | UDP | 客户端 → 服务器 | ProxyDHCP 请求端口(仅代理模式) |
2. DHCP 协议详解
对于更多 DHCP 与网络启动的分析,建议使用 Wireshark 进行抓包分析,实际观察报文交互过程。
2.1 DHCP 四步握手(DORA)
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是用于自动分配 IP 地址的应用层协议,基于 UDP 实现。标准流程包含四个步骤,称为 DORA:
mermaid
sequenceDiagram
participant C as 客户端(广播)
participant S as DHCP 服务器
C->>S: ① DHCP Discover(广播)<br/>← 客户端寻找可用的DHCP服务器
S-->>C: ② DHCP Offer(广播/单播)<br/>← 服务器提供IP地址配置
C->>S: ③ DHCP Request(广播)<br/>← 客户端确认接受某个服务器的Offer
S-->>C: ④ DHCP ACK(广播/单播)<br/>← 服务器确认分配,客户端配置生效为什么 Request 仍然广播?
客户端可能收到多个 DHCP 服务器的 Offer,Request 是广播发送的,目的是告知所有服务器它选择了哪一台,未被选中的服务器可以回收 Offer 中的 IP。
2.2 DHCP 报文格式(PDU)
DHCP 报文是固定长度头部 + 可变长度选项的结构。以下是一个完整的 DHCP Discover 报文示例(Wireshark 抓包):
固定头部(236 字节)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| op (1) | htype (1) | hlen (1) | hops (1) |
+---------------+---------------+---------------+---------------+
| xid (4) | ← 事务ID(Transaction ID)
+-------------------------------+-------------------------------+
| secs (2) | flags (2) |
+-------------------------------+-------------------------------+
| ciaddr (4) | ← 客户端IP(Discover时为0.0.0.0)
+---------------------------------------------------------------+
| yiaddr (4) | ← 服务器分配给客户端的IP
+---------------------------------------------------------------+
| siaddr (4) | ← 下一阶段服务器IP(TFTP服务器)
+---------------------------------------------------------------+
| giaddr (4) | ← DHCP中继代理IP
+---------------------------------------------------------------+
| chaddr (16) | ← 客户端硬件地址(MAC,6字节+10字节填充)
+---------------------------------------------------------------+
| sname (64) | ← 服务器主机名(可选)
+---------------------------------------------------------------+
| file (128) | ← 启动文件名(可选,PXE中很重要)
+---------------------------------------------------------------+
| magic cookie (4) | ← 固定值 99.130.83.99(标识DHCP选项开始)
+---------------------------------------------------------------+
| options(可变长度) | ← DHCP选项(TLV格式)
+---------------------------------------------------------------+实际抓包示例:DHCP Discover
Frame: Ethernet II, IPv4, UDP
─────────────────────────────────────────────────
Ethernet Header:
Destination: ff:ff:ff:ff:ff:ff ← 广播
Source: aa:bb:cc:dd:ee:ff ← 客户端MAC
IPv4 Header:
Source: 0.0.0.0 ← 客户端尚无IP
Destination: 255.255.255.255 ← 广播
UDP Header:
Source Port: 68 ← DHCP客户端端口
Dest Port: 67 ← DHCP服务器端口
DHCP Payload:
op = 0x01 (BOOTREQUEST) ← 请求
htype = 0x01 (Ethernet)
hlen = 0x06 (MAC地址长度6字节)
hops = 0x00
xid = 0x3903f326 ← 随机事务ID
secs = 0x0000
flags = 0x8000 ← 最高位为1表示广播响应
ciaddr = 0.0.0.0 ← 客户端IP(无)
yiaddr = 0.0.0.0 ← 待分配IP(无)
siaddr = 0.0.0.0 ← 服务器IP(无)
giaddr = 0.0.0.0 ← 中继IP(无)
chaddr = aa:bb:cc:dd:ee:ff:00:00:... ← 客户端MAC + 填充
Options (Magic Cookie: 0x63825363):
Option 53: DHCP Message Type = 0x01 (Discover)
Option 61: Client Identifier = 01:aa:bb:cc:dd:ee:ff
Option 55: Parameter Request List
- 01: Subnet Mask
- 03: Router
- 06: DNS Server
- 0c: Host Name
- 2b: Vendor Class Information
- 3c: Vendor Class Identifier = "PXEClient"
- 3d: Client Identifier
- 43: Vendor Specific Information
Option 60: Vendor Class Identifier = "PXEClient:Arch:00000:UNDI:002001"
Option 57: Maximum DHCP Message Size = 1260
Option 93: Client System Architecture = 0x0000 (x86 BIOS)
Option 94: Client Network Interface = 01:01:01
Option 60: End (0xff)实际抓包示例:DHCP Offer
DHCP Payload:
op = 0x02 (BOOTREPLY) ← 回复
htype = 0x01 (Ethernet)
hlen = 0x06
xid = 0x3903f326 ← 与Discover相同的事务ID
ciaddr = 0.0.0.0
yiaddr = 192.168.1.100 ← 分配给客户端的IP
siaddr = 192.168.1.1 ← DHCP服务器IP
giaddr = 0.0.0.0
chaddr = aa:bb:cc:dd:ee:ff
Options (Magic Cookie: 0x63825363):
Option 53: DHCP Message Type = 0x02 (Offer)
Option 54: Server Identifier = 192.168.1.1
Option 51: IP Address Lease Time = 86400s (24小时)
Option 01: Subnet Mask = 255.255.255.0
Option 03: Router = 192.168.1.1
Option 06: DNS Server = 192.168.1.1
[PXE相关选项 - 取决于服务器配置]
Option 66: TFTP Server Name = "192.168.1.1"
Option 67: Bootfile Name = "ipxe.efi"
Option 60: End2.3 PXE 相关的 DHCP 选项
PXE(Preboot Execution Environment)启动通过在 DHCP 选项中携带额外信息来引导客户端网络启动:
| 选项编号 | 名称 | 说明 | 示例值 |
|---|---|---|---|
| Option 60 | Vendor Class Identifier | 客户端标识自己为PXE设备 | PXEClient:Arch:00000:UNDI:002001 |
| Option 61 | Client Identifier | 客户端唯一标识(通常是MAC) | 01:aa:bb:cc:dd:ee:ff |
| Option 66 | TFTP Server Name | TFTP服务器地址或主机名 | 192.168.1.1 |
| Option 67 | Bootfile Name | 引导文件路径 | ipxe.efi、undionly.kpxe |
| Option 43 | Vendor Specific Info | 厂商自定义信息(含PXE菜单等) | 编码复杂,见下文 |
| Option 93 | Client System Arch | 客户端架构类型 | 0x0000=BIOS, 0x0007=x86_64 EFI |
| Option 94 | Client Network ID | 客户端网络接口信息 | 01:01:01 |
Option 93 架构代码对照
| 代码 | 架构 | 说明 |
|---|---|---|
0x0000 | Intel x86PC (BIOS) | Legacy BIOS 启动 |
0x0006 | EFI IA32 | 32位 UEFI |
0x0007 | EFI BC (x86_64) | 64位 UEFI(最常见) |
0x0009 | EFI x86_64 | 64位 UEFI(另一种标识) |
注意
不同 BIOS/UEFI 固件厂商的 Option 93 值可能不一致,部分旧固件甚至不发送此选项,这是多架构 PXE 启动兼容性问题的根源之一。
2.4 PXE 启动的完整 DHCP 交互流程
当一台支持 PXE 的客户端开机并选择网络启动时,完整的 DHCP 交互如下:
mermaid
sequenceDiagram
participant C as PXE客户端
participant D as DHCP服务器
participant T as PXE/TFTP服务器
C->>D: ① DHCP Discover(广播, 含Option 60="PXEClient")
D-->>C: ② DHCP Offer(含Option 66/67: TFTP服务器+引导文件)
C->>D: ③ DHCP Request(广播, 确认选择该服务器)
D-->>C: ④ DHCP ACK(确认分配, 再次携带引导文件信息)
C->>T: ⑤ TFTP Read Request: 引导文件(如 ipxe.efi / undionly.kpxe)
T-->>C: ⑥ TFTP Data: 引导文件内容
Note over C: ⑦ 客户端执行引导文件,加载iPXE/系统启动关键点
在标准 PXE 启动中,DHCP 服务器同时负责分配 IP 地址和提供引导文件信息(Option 66/67)。这意味着 DHCP 服务器必须知道如何处理 PXE 客户端的请求。
3. Proxy DHCP 原理
3.1 为什么需要 Proxy DHCP?
在实际生产环境中,网络中通常已经存在一台 DHCP 服务器(路由器、三层交换机、Windows Server 等),它负责为所有设备分配 IP 地址。但这台 DHCP 服务器通常不支持 PXE 启动选项,或者不方便修改其配置。
Proxy DHCP 解决了这个问题:它不分配 IP 地址,只提供 PXE 引导信息,可以与现有 DHCP 服务器共存,互不干扰。
3.2 为什么 Proxy DHCP 能下发 Option?
一个很自然的疑问是:网络中已经有一台主 DHCP 服务器了,Proxy DHCP 是怎么"插入"进去下发 PXE 引导选项的?
答案是:它不需要"插入"——它和主 DHCP 同时收到请求,同时回复,客户端的 PXE 固件被设计为能同时处理两者。
广播的"无差别"特性
DHCP Discover 是广播包(目标地址 255.255.255.255:67)。交换机会将广播泛洪到同一 VLAN 内的所有端口(除源端口),因此同一广播域中所有监听 UDP 67 的设备都会收到:
mermaid
flowchart TD
A["客户端发送 DHCP Discover\n广播 → 255.255.255.255:67"] --> B[交换机泛洪广播]
B --> C{"同一广播域(VLAN)"}
C --> D["主DHCP服务器(路由器)\n← 收到广播,回复 Offer"]
C --> E["TinyPXEServer\n← 也收到广播,回复 Offer"]这和 TCP 不同——TCP 连接是独占的,但 UDP 广播是"共享"的,一个广播包可以被多个进程/设备同时接收。两个服务器各自独立处理,各自回复,互不干扰。
客户端收到两份 Offer 后如何处理?
客户端的 PXE 固件(PXE ROM)被设计为能够处理多个 Offer。它通过 yiaddr(Your IP Address)字段来区分:
| 判断依据 | 主 DHCP Offer | Proxy DHCP Offer |
|---|---|---|
| yiaddr 字段 | 非零(如 192.168.1.100) | 零(0.0.0.0) |
| Option 54(Server ID) | 主 DHCP 的 IP | Proxy DHCP 的 IP |
| 是否含 Option 66/67 | 通常不含 | 包含 |
PXE 固件的内置逻辑(由 Intel PXE Spec v2.1 定义):
- 收集所有 Offer
- 选择 yiaddr 非零 的那台作为主 DHCP(完成标准 DORA 流程获取 IP)
- 记住 yiaddr = 0.0.0.0 的那台作为 Proxy DHCP 服务器
- 完成主 DHCP 的 DORA 后,主动向 Proxy DHCP 的 4011 端口单播请求引导文件信息
mermaid
sequenceDiagram
participant C as PXE客户端
participant M as 主DHCP服务器
participant P as Proxy DHCP服务器
C->>M: ① Discover(广播)
C->>P: ① 广播泛洪
M-->>C: ② Offer(yiaddr=192.x.x.x)
P-->>C: ② Offer(yiaddr=0.0.0.0 + Option 66/67)
Note over C: 客户端区分:yiaddr≠0 → 主DHCP<br/>yiaddr=0 → ProxyDHCP
C->>M: ③ Request(广播,选主DHCP)
M-->>C: ④ ACK
C->>P: ⑤ ProxyDHCP 请求(单播→4011)
P-->>C: ⑥ ProxyDHCP ACK一句话总结
Proxy DHCP 不需要"插入"任何交互——它利用 DHCP 广播的"无差别接收"特性,与主 DHCP 同时收到 Discover、同时回复 Offer。客户端 PXE 固件通过 yiaddr 字段区分两者,分别完成 IP 分配和引导文件获取。
3.3 标准 DHCP vs Proxy DHCP 对比
| 特性 | 标准 DHCP 模式 | Proxy DHCP 模式 |
|---|---|---|
| IP 地址分配 | ✅ TinyPXE 分配 | ❌ 由现有 DHCP 服务器分配 |
| PXE 引导信息 | ✅ TinyPXE 提供 | ✅ TinyPXE 提供 |
| 是否需要修改现有 DHCP | — | ❌ 无需修改 |
| 监听端口 | UDP 67/68 | UDP 67 + UDP 4011 |
| 客户端交互 | 4步(DORA) | 仅2步(Offer + ACK) |
| 网络影响 | 替换现有 DHCP 服务器 | 与现有 DHCP 并存 |
3.4 Proxy DHCP 完整交互流程
当网络中存在主 DHCP 服务器 + Proxy DHCP 服务器时,PXE 客户端的交互过程如下:
mermaid
sequenceDiagram
participant C as PXE客户端
participant M as 主DHCP服务器
participant P as Proxy DHCP服务器
participant T as TFTP服务器
C->>M: ① DHCP Discover(广播,含Option 60="PXEClient")
C->>P: ① 广播泛洪
M-->>C: ② DHCP Offer(含IP地址,无引导)
P-->>C: ② ProxyDHCP Offer(无IP,含引导文件)
C->>M: ③ DHCP Request(广播,确认主DHCP)
M-->>C: ④ DHCP ACK(确认IP分配)
C->>P: ⑤ ProxyDHCP 请求(客户端主动请求,获取引导文件信息)
P-->>C: ⑥ ProxyDHCP ACK(返回引导文件信息)
C->>T: ⑦ TFTP: 下载引导文件关键步骤详解
步骤② ProxyDHCP Offer:Proxy DHCP 服务器同时监听 UDP 67 端口(与主 DHCP 相同)和 UDP 4011 端口。当它在 67 端口收到 DHCP Discover 广播时,会发送一个特殊的 Offer,其中不包含 IP 地址(yiaddr = 0.0.0.0),但包含 PXE 引导选项(Option 66/67)。
步骤⑤ ProxyDHCP ACK:客户端在完成与主 DHCP 的 IP 分配后,会向 Proxy DHCP 服务器的 4011 端口单播发送一个请求(此时客户端已有 IP,使用单播),Proxy DHCP 服务器用 ACK 回复完整的引导文件信息。
为什么客户端能知道 Proxy DHCP 的地址? 在步骤②中,Proxy DHCP 的 Offer 报文源地址就是 Proxy DHCP 服务器的 IP,客户端会记住这个地址,并在步骤⑤中使用它。
为什么需要 4011 端口? 因为步骤③的 DHCP Request 是广播到 67 端口的,主 DHCP 会在 67 端口回复 ACK。如果 Proxy DHCP 也在 67 端口回复,客户端会收到两份 ACK,造成混乱。4011 端口是 PXE 规范为 Proxy DHCP 专门定义的,客户端在完成主 DHCP 流程后,单独在 4011 端口与 Proxy DHCP 通信,避免了冲突。
3.5 Proxy DHCP 报文的关键字段
ProxyDHCP Offer(步骤②)
DHCP Payload:
op = 0x02 (BOOTREPLY)
xid = 0x3903f326 ← 与客户端Discover相同的事务ID
ciaddr = 0.0.0.0
yiaddr = 0.0.0.0 ← 关键:不分配IP地址!
siaddr = 192.168.1.50 ← Proxy DHCP服务器IP
giaddr = 0.0.0.0
chaddr = aa:bb:cc:dd:ee:ff
Options:
Option 53: DHCP Message Type = 0x02 (Offer)
Option 54: Server Identifier = 192.168.1.50 ← Proxy DHCP标识
Option 60: Vendor Class Identifier = "PXEClient"
Option 43: Vendor Specific Info = ... ← 包含PXE菜单等
Option 67: Bootfile Name = "ipxe.efi"
Option 60: End客户端发送给 Proxy DHCP 的请求(步骤⑤)
DHCP Payload:
op = 0x01 (BOOTREQUEST)
xid = 新的随机事务ID
ciaddr = 192.168.1.100 ← 已获得的IP地址
siaddr = 0.0.0.0
giaddr = 0.0.0.0
chaddr = aa:bb:cc:dd:ee:ff
Options:
Option 53: DHCP Message Type = 0x01 (Discover)
Option 60: Vendor Class Identifier = "PXEClient"
Option 54: Server Identifier = 192.168.1.50 ← 指定要联系的Proxy DHCP
Option 93: Client System Architecture = 0x0007
Option 60: EndProxy DHCP ACK(步骤⑥)
DHCP Payload:
op = 0x02 (BOOTREPLY)
xid = 与步骤⑤相同的事务ID
ciaddr = 192.168.1.100
yiaddr = 0.0.0.0 ← 仍不分配IP
siaddr = 192.168.1.50 ← TFTP服务器地址
chaddr = aa:bb:cc:dd:ee:ff
Options:
Option 53: DHCP Message Type = 0x05 (ACK)
Option 54: Server Identifier = 192.168.1.50
Option 60: Vendor Class Identifier = "PXEClient"
Option 66: TFTP Server Name = "192.168.1.50"
Option 67: Bootfile Name = "ipxe.efi" ← 引导文件
Option 43: Vendor Specific Info = ... ← PXE菜单信息
Option 60: EndProxy DHCP 的一个关键细节
Proxy DHCP 使用 Option 54(Server Identifier) 来标识自己,客户端通过这个选项区分 Proxy DHCP 响应和主 DHCP 响应。主 DHCP 和 Proxy DHCP 的 Server Identifier 必须不同。
4. TinyPXEServer 实现原理
4.1 TinyPXEServer 的工作模式
TinyPXEServer 是一个轻量级的 Windows 绿色软件,集成了以下服务:
| 服务组件 | 功能 | 监听端口 |
|---|---|---|
| DHCP 服务器 | 分配 IP 地址 + 提供 PXE 引导信息 | UDP 67 |
| Proxy DHCP 服务器 | 仅提供 PXE 引导信息(不分配 IP) | UDP 4011 |
| TFTP 服务器 | 提供引导文件下载 | UDP 69 |
| HTTP 服务器 | 提供 HTTP 方式下载文件 | TCP 80 |
4.2 代理模式(Proxy)与独立模式
代理模式(Proxy DHCP 勾选)
当勾选 Proxy 时,TinyPXEServer 以 Proxy DHCP 模式工作:
mermaid
flowchart TD
A[监听 UDP 67 端口] --> B[收到 DHCP Discover
Option 60 包含 "PXEClient"]
B --> C{检查 Option 93
客户端架构}
C -->|0x0000 BIOS| D[返回 undionly.kpxe]
C -->|0x0007/0x0009 x64 EFI| E[返回 ipxe.efi]
D --> F[发送 ProxyDHCP Offer
yiaddr=0.0.0.0,含Option 66/67]
E --> F
F --> G[等待客户端在 4011 端口的请求]
G --> H[发送 ProxyDHCP ACK
含完整引导文件信息]注意:在代理模式下,主 DHCP 服务器不应下发 Option 66/67,否则客户端可能收到两份引导信息,导致冲突。
独立模式(Proxy 取消勾选)
当取消勾选 Proxy 时,TinyPXEServer 以标准 DHCP 服务器模式工作:
mermaid
flowchart TD
A[监听 UDP 67 端口] --> B[收到 DHCP Discover]
B --> C[从地址池中选择一个可用 IP]
C --> D[发送 DHCP Offer
含分配的IP + Option 66/67]
D --> E[收到 DHCP Request]
E --> F[发送 DHCP ACK
确认IP分配 + 引导文件信息]
F --> G[客户端通过 TFTP 下载引导文件]4.3 TinyPXEServer 的架构识别与引导文件选择
TinyPXEServer 通过读取 DHCP Option 中的客户端架构信息来决定发送哪个引导文件:
mermaid
flowchart TD
A[客户端发送 DHCP Discover] --> B[TinyPXEServer 解析 Option 93]
B -->|"0x0000 (x86 BIOS)"| C["undionly.kpxe\niPXE Legacy BIOS 引导"]
B -->|"0x0007 (EFI x86-64)"| D["ipxe.efi\niPXE UEFI x64 引导"]
B -->|"0x0006 (EFI IA32)"| E["ipxeia32.efi\niPXE UEFI IA32 引导"]
B -->|"0x0009 (EFI x86-64 另一标识)"| D实际抓包验证
可以在 TinyPXEServer 运行时,用 Wireshark 抓包观察 DHCP 交互。在 TinyPXEServer 的日志窗口中,也会显示每个 DHCP 请求的详细信息(客户端 MAC、分配的 IP、选择的引导文件等)。
4.4 iPXE 引导流程
TinyPXEServer 通常使用 iPXE 作为引导加载程序。iPXE 加载后的完整引导链:
mermaid
flowchart TD
A["PXE固件"] --> B["iPXE (undionly.kpxe / ipxe.efi)"]
B --> C["iPXE 通过 TFTP/HTTP 加载 menu.ipxe"]
C --> D["menu.ipxe 显示启动菜单,用户选择"]
D --> E[根据选择加载对应系统(WIM/ISO等)]
E --> F["bootmgr.exe → 加载 PE 系统"]iPXE 脚本示例(menu.ipxe):
ipxe
#!ipxe
menu iPXE Boot Menu
item winpe Windows PE
item linux Linux Live
choose target && goto ${target}
:winpe
set 209:uuid pxelinux.cfg/default
set 210:uuid http://${next-server}/
kernel wimboot
initrd bootmgr.exe bootmgr.exe
initrd boot/bcd boot/bcd
initrd boot/boot.sdi boot/boot.sdi
initrd sources/boot.wim boot.wim
boot
:linux
kernel http://${next-server}/vmlinuz
initrd http://${next-server}/initrd.img
boot5. TinyPXEServer 配置实操
5.1 场景一:代理模式(已有路由器 DHCP)
适用场景:家庭、办公室、机房等已有路由器或 DHCP 服务器的环境。
配置步骤:
- 下载并解压 TinyPXEServer
- 将
ipxe.efi(UEFI)和undionly.kpxe(BIOS)放入 TinyPXEServer 目录 - 配置 TinyPXEServer:
- 勾选 Proxy(代理 DHCP)
- Boot File:
ipxe.efi(UEFI)或undionly.kpxe(BIOS) - Listen Interface:选择与客户端在同一网段的网卡
- 确保主 DHCP 服务器未设置 Option 66/67(Boot Server / Boot File)
- 点击 Start 启动
mermaid
flowchart LR
C[客户端] <--> R["路由器\n主DHCP,分配IP"]
C <--> T["TinyPXEServer\nProxy DHCP,提供引导文件"]
C <--> F["TinyPXEServer\nTFTP,下载引导文件"]5.2 场景二:独立模式(无路由器环境)
适用场景:独立局域网、临时搭建、没有路由器的机房等。
配置步骤:
- 手动设置 TinyPXEServer 所在机器的 IP 地址(如
192.168.1.1/255.255.255.0) - 配置 TinyPXEServer:
- 取消勾选 Proxy
- IP Pool:设置 DHCP 地址池范围(如
192.168.1.100~192.168.1.200) - Boot File:
ipxe.efi或undionly.kpxe - Subnet Mask:
255.255.255.0 - Gateway:填写服务器 IP(
192.168.1.1)
- 点击 Start 启动
重要
独立模式下,服务器的 IP 地址必须手动配置为静态 IP,不能使用系统自动分配的 169.254.x.x 地址(APIPA)。客户端的 IP 由 TinyPXEServer 从地址池中分配。
5.3 注意事项
- 如果连续处理多个网络,最好重启 TinyPXEServer 以重载相关配置
- TinyPXEServer 的 HTTP 服务器性能较弱,大文件传输建议使用专业 HTTP 服务器
- 部分网络环境下 TFTP 传输速度较慢,建议优先使用 HTTP 协议(iPXE 支持)
6. 限制与不可用场景
6.1 网络拓扑限制
| 限制条件 | 说明 | 解决方案 |
|---|---|---|
| 跨 VLAN/子网 | DHCP Discover 是广播包,无法穿越路由器 | 使用 DHCP Relay(IP Helper)转发 |
| 跨路由器 | 广播域被路由器隔离 | 配置路由器的 DHCP Relay 功能 |
| 无线网络 | 大部分无线 AP 隔离客户端广播 | 使用有线网络,或配置 AP 允许广播转发 |
跨 VLAN 的原理
当客户端和 TinyPXEServer 在不同 VLAN 时,需要在路由器/三层交换机上配置 DHCP Relay(也叫 IP Helper)。DHCP Relay 将客户端的 DHCP 广播包单播转发到指定的 DHCP 服务器地址,并在 DHCP 报文的 giaddr(网关地址)字段中填入客户端所在子网的网关 IP,以便 DHCP 服务器知道从哪个地址池分配 IP。
在 Proxy DHCP 模式下,DHCP Relay 还需要转发 UDP 4011 端口的流量到 Proxy DHCP 服务器。
6.2 DHCP 服务器冲突
| 限制条件 | 说明 | 解决方案 |
|---|---|---|
| 主 DHCP 开启"强制DHCP" | 部分路由器/交换机支持"唯一DHCP"或"强制DHCP",会丢弃其他 DHCP 响应 | 关闭此功能 |
| 主 DHCP 下发 Option 66/67 | 与 Proxy DHCP 的引导信息冲突 | 在主 DHCP 中移除 PXE 相关选项 |
| 多个 DHCP 服务器 | 多个 DHCP 响应导致客户端混乱 | 确保网络中只有一个主 DHCP + 一个 Proxy DHCP |
| Windows Server DHCP | Windows Server 的 DHCP 服务有自己的 PXE 配置(WDS/SCCM) | 需要额外配置或禁用 WDS |
"强制 DHCP" 问题
部分路由器(如某些企业级交换机)有"强制 DHCP"(Forced DHCP / DHCP Snooping Strict)功能,开启后会过滤来自非信任端口的 DHCP 响应。这会导致 Proxy DHCP 的 Offer 被交换机丢弃,客户端无法获取引导文件信息。需要在交换机上将 TinyPXEServer 所在端口配置为 DHCP Snooping Trusted。
6.3 安全与防火墙限制
| 限制条件 | 说明 | 解决方案 |
|---|---|---|
| Windows 防火墙 | 默认阻止入站 UDP 67/68/69/4011 | 添加防火墙例外规则 |
| 企业防火墙 | 可能阻止 DHCP/TFTP 流量 | 联系网络管理员开放端口 |
| DHCP Snooping | 交换机安全特性,阻止非法 DHCP 服务器 | 配置信任端口或关闭此功能 |
| 802.1X 认证 | 未认证设备可能无法发送 DHCP 请求 | 先完成 802.1X 认证 |
6.4 客户端兼容性限制
| 限制条件 | 说明 | 解决方案 |
|---|---|---|
| 不支持 PXE 的网卡 | 旧网卡或虚拟网卡无 PXE ROM | 使用 iPXE ISO/USB 引导 |
| UEFI Secure Boot | 安全启动可能阻止未签名的 iPXE 加载 | 关闭 Secure Boot 或使用签名版 iPXE |
| 某些虚拟机 | Hyper-V 默认不支持 PXE(Gen1 Legacy) | 使用 Gen2 或手动配置 |
| Option 93 不一致 | 部分固件发送错误的架构代码 | 使用支持多架构匹配的 DHCP 服务器(如 Dnsmasq) |
6.5 性能与环境限制
| 限制条件 | 说明 | 解决方案 |
|---|---|---|
| TFTP 速度慢 | TFTP 基于 UDP,无流控,大文件传输慢 | 使用 iPXE + HTTP 替代 |
| TinyPXEServer HTTP 弱 | 内置 HTTP 服务器性能有限 | 使用 Nginx/Apache/Caddy 等专业 HTTP 服务器 |
| Windows 平台限制 | TinyPXEServer 仅支持 Windows | 使用 Dnsmasq(Linux)等替代方案 |
| 地址池耗尽 | 大量客户端同时请求时 IP 可能不够用 | 扩大地址池范围或缩短租约时间 |