3. DHCP 服务器配置:ISC DHCP vs dnsmasq,option 66/67/43/60/97 的配置实战

DHCP 服务器是网络启动的核心。没有它,客户端连 IP 都拿不到,更别提下载启动文件了。这一章我们重点聊聊两个主流方案:ISC DHCP 和 dnsmasq,以及那些让 PXE 正常工作的关键 option。

3.1 ISC DHCP vs dnsmasq:怎么选?

先说说我的个人习惯。生产环境里,我倾向于用 ISC DHCP。它功能全、配置灵活,适合复杂网络。dnsmasq 呢?轻量、简单,适合小规模或嵌入式环境。你想想看,一个只有几十台设备的实验室,用 dnsmasq 完全够用,还省资源。

特性 ISC DHCP dnsmasq
功能丰富度 高,支持 failover、多子网、动态更新 DNS 中等,基础 DHCP + DNS + TFTP
配置复杂度 较高,需要理解参数含义 低,一行一个 option
性能 高,适合大规模部署 中等,适合小规模
PXE 支持 原生支持,option 灵活 支持,但需要手动配置
日志 详细,可定制 简单,默认输出到 syslog
我的建议:如果你在搭建一个超过 200 台设备的网络启动环境,直接上 ISC DHCP。如果是家庭实验室或小型办公网络,dnsmasq 更省心。

3.2 关键 Option:66/67/43/60/97 实战

这些 option 是 PXE 的灵魂。说白了,它们告诉客户端:你的启动文件在哪、怎么下载、用什么协议。我刚开始接触时也搞混过,尤其是 option 43 和 60,很多人分不清。

Option 60:客户端标识

客户端发送 DHCP Discover 时,会带上 option 60,告诉服务器“我是 PXE 客户端”。服务器根据这个来匹配后续的 option。没有它,服务器可能不会下发 PXE 相关的参数。

Option 66:TFTP 服务器地址

指定 TFTP 服务器的 IP 或主机名。客户端拿到这个地址后,就去那里下载启动文件。注意:如果用了 option 67,option 66 必须正确配置。

Option 67:启动文件名

指定客户端要下载的文件名,比如 pxelinux.0 或 bootx64.efi。这个文件通常放在 TFTP 服务器的根目录下。

Option 43:厂商特定信息

这是个大坑。Option 43 是厂商自定义的,不同厂商的 PXE 实现可能不一样。比如 Intel 的 PXE 需要特定的子 option。我曾经在一个项目中,因为 option 43 格式写错了,折腾了两天。

Option 97:客户端 UUID

用于标识客户端。有些场景下,服务器需要根据 UUID 来分配不同的启动文件。比如,不同型号的机器用不同的内核。

避坑指南:我曾经遇到过一个问题:客户端能拿到 IP,但就是无法启动。后来发现是 option 66 写成了主机名,但 DNS 解析失败。建议直接用 IP 地址,省去 DNS 依赖。

3.3 ISC DHCP 配置实战

下面是一个典型的 PXE 配置片段。注意看 option 的写法。

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;
  option routers 192.168.1.1;
  option domain-name-servers 192.168.1.1;

  # PXE 相关 option
  option vendor-class-identifier "PXEClient";
  next-server 192.168.1.10;  # TFTP 服务器 IP
  filename "pxelinux.0";

  # 针对不同架构的配置
  class "pxeclients" {
    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
    option vendor-encapsulated-options "PXEClient";
  }
}

这里有个细节:next-server 就是 option 66,filename 就是 option 67。ISC DHCP 用关键字代替了数字,更直观。

3.4 dnsmasq 配置实战

dnsmasq 的配置更简洁。一行一个参数。

# DHCP 地址池
dhcp-range=192.168.1.100,192.168.1.200,12h

# PXE 配置
dhcp-option=66,192.168.1.10
dhcp-option=67,pxelinux.0

# 针对 UEFI 客户端
dhcp-match=set:efi-x64,option:client-arch,7
dhcp-boot=tag:efi-x64,bootx64.efi,192.168.1.10

注意 dhcp-match 这一行。它根据客户端架构(option 93)来匹配不同的启动文件。UEFI 和 BIOS 的启动文件不一样,这个配置能自动区分。

关键点:dnsmasq 的 option 写法是 dhcp-option=数字,值。数字就是 option 编号。比如 66 是 TFTP 服务器,67 是启动文件名。

3.5 DHCP 地址池与租约管理

地址池的大小直接影响网络启动的并发能力。我见过一个项目,地址池只有 50 个 IP,但同时有 100 台机器启动,结果一半拿不到 IP。

参数 说明 建议值
地址池大小 可分配的 IP 数量 至少是并发数的 1.5 倍
租约时间 客户端持有 IP 的时间 PXE 环境建议 10-30 分钟
保留地址 为特定设备固定 IP 用于服务器、网关等

租约时间要特别注意。PXE 启动完成后,客户端通常不再需要 DHCP 分配的 IP。如果租约时间太长,IP 会被占用,导致其他设备无法获取。我习惯把租约时间设短一些,比如 15 分钟。

3.6 多子网环境下的 DHCP 中继

当客户端和 DHCP 服务器不在同一个子网时,就需要 DHCP 中继。说白了,中继把客户端的广播请求转发给服务器,再把服务器的响应转发回来。

配置 DHCP 中继很简单。在路由器或三层交换机上启用 ip helper-address 指向 DHCP 服务器即可。

interface Vlan10
 ip address 192.168.10.1 255.255.255.0
 ip helper-address 192.168.1.10  # DHCP 服务器地址

注意:中继会修改 DHCP 报文中的 giaddr 字段,服务器根据这个字段知道客户端来自哪个子网,从而分配正确的地址池。

避坑指南:我曾经在一个多子网环境中,发现某些子网的客户端能拿到 IP,但无法启动。排查后发现是中继设备没有转发 option 60 和 66。检查中继设备的配置,确保它支持 DHCP option 的透传。

3.7 知识体系图

下面这张图展示了 DHCP 服务器配置的核心逻辑。从选择服务器软件,到配置关键 option,再到地址池管理和中继,每一步都环环相扣。

DHCP 服务器配置核心逻辑 选择 DHCP 服务器 ISC DHCP dnsmasq 配置关键 Option:66/67/43/60/97 地址池与租约管理 多子网环境:DHCP 中继 说明:从选择服务器软件开始,到配置 option、管理地址池,再到多子网中继,每一步都影响网络启动的成功率。

嗯,这一章的内容就到这里。DHCP 配置是网络启动的基础,但也是最容易出问题的地方。记住:option 66 和 67 是必须的,option 43 和 60 是辅助的,option 97 是特定场景用的。多子网环境下,别忘了配置 DHCP 中继。