3、DHCP服务器搭建:DHCP协议原理、安装dhcpd、配置subnet和option 66/67、启动与验证
DHCP 服务器,说白了就是网络设备的「地址管理员」。没有它,你得一台一台手动配 IP。有了它,设备插上网线就能上网。但 PXE 网络启动场景下,DHCP 不只是给 IP,还得告诉客户端「去哪下载启动文件」。这就是 option 66 和 67 的活儿。
我个人习惯把 DHCP 比作酒店前台。客户端入住时,前台给房卡(IP 地址),还告诉你去几楼吃饭(TFTP 服务器地址)、吃什么菜(启动文件名)。嗯,这个比喻虽然糙,但道理不糙。
核心要点:PXE 环境下的 DHCP 必须同时提供 IP 地址和启动引导信息。缺少 option 66/67,客户端拿到 IP 也启动不了。
3.1 DHCP 协议原理速览
DHCP 基于 UDP,客户端用端口 68,服务器用端口 67。交互过程分四步,业内叫 DORA:
- Discover(发现):客户端广播,问「有人能给我个 IP 吗?」
- Offer(提供):服务器回应,说「我给你这个 IP,要不要?」
- Request(请求):客户端确认,「好,我就要这个。」
- Acknowledge(确认):服务器最终确认,「成交,拿去用。」
PXE 启动时,客户端在拿到 IP 后,还会额外请求 option 66(TFTP 服务器地址)和 option 67(启动文件名)。如果服务器没给这两个选项,客户端就不知道下一步该找谁要文件。
我曾经遇到过一个问题:客户端能拿到 IP,但就是启动不了。抓包一看,DHCP Offer 里根本没有 option 66。折腾了半天,原来是配置里忘了加。从那以后,我每次配完 DHCP 都会先抓包确认一下。
3.2 安装 dhcpd
主流 Linux 发行版用的 DHCP 服务器软件是 isc-dhcp-server(CentOS/RHEL 上叫 dhcp)。安装很简单:
# Debian/Ubuntu
sudo apt update
sudo apt install isc-dhcp-server -y
# CentOS/RHEL/Rocky/Alma
sudo yum install dhcp -y
安装完成后,先别急着启动。默认配置文件是空的,甚至可能不存在。你需要手动创建或编辑 /etc/dhcp/dhcpd.conf(Debian 系)或 /etc/dhcp/dhcpd.conf(RHEL 系,路径一样)。
小技巧:Debian 系安装后,系统会问你要监听哪个网卡。如果你跳过了,可以手动编辑 /etc/default/isc-dhcp-server,设置 INTERFACESv4="eth0"。
3.3 配置 subnet 和 option 66/67
这是本章的重头戏。一个典型的 PXE 启动 DHCP 配置长这样:
# /etc/dhcp/dhcpd.conf
# 全局设置
option domain-name "pxe.lab";
option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
# 定义 PXE 专用选项
option space pxelinux;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
# 子网声明
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.100 192.168.100.200;
option routers 192.168.100.1;
option broadcast-address 192.168.100.255;
# 关键:TFTP 服务器地址(option 66)
option tftp-server-name "192.168.100.10";
# 关键:启动文件名(option 67)
option bootfile-name "pxelinux.0";
# 指定 PXE 客户端
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
filename "pxelinux.0";
next-server 192.168.100.10;
}
}
这里有几个关键点,我展开说说:
- subnet 声明:定义了 IP 地址池、网关、广播地址。范围别太大,够用就行。
- option tftp-server-name:这就是 option 66。告诉客户端 TFTP 服务器在哪。可以是 IP 也可以是域名,但我建议用 IP,省得 DNS 解析出问题。
- option bootfile-name:这就是 option 67。指定客户端要下载的启动文件名。对于 BIOS 机器,通常是
pxelinux.0;UEFI 机器用bootx64.efi。 - class "pxeclients":通过匹配 vendor-class-identifier 来区分 PXE 客户端和普通 DHCP 客户端。这样普通设备拿 IP 时不会收到启动文件信息,避免干扰。
注意:option 66 和 67 的写法在不同 DHCP 版本里略有差异。老版本可能用 next-server 代替 option tftp-server-name。我个人建议两个都写上,兼容性更好。
3.4 启动与验证
配置写好了,接下来就是启动服务并验证效果。
3.4.1 启动服务
# Debian/Ubuntu
sudo systemctl start isc-dhcp-server
sudo systemctl enable isc-dhcp-server
# CentOS/RHEL
sudo systemctl start dhcpd
sudo systemctl enable dhcpd
启动后,检查状态:
sudo systemctl status isc-dhcp-server
如果看到 active (running),恭喜你,服务起来了。如果报错,别慌。先看日志:
sudo journalctl -u isc-dhcp-server -n 50
# 或者
sudo tail -f /var/log/syslog | grep dhcp
最常见的错误是配置文件语法错误。可以用这个命令检查:
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
如果输出 Configuration file is valid,说明语法没问题。
3.4.2 验证 DHCP 是否正常工作
找一台同网段的客户端,设置为 DHCP 获取 IP。然后:
- 查看客户端是否拿到 IP:在客户端执行
ip addr或ifconfig,看是否分配到 192.168.100.100~200 范围内的地址。 - 抓包确认 option 66/67:在 DHCP 服务器上或客户端上抓包:
sudo tcpdump -i eth0 port 67 or port 68 -vv -X
抓包时,在客户端执行 dhclient -v eth0 重新获取 IP。你会看到 DHCP Offer 包里包含 tftp-server-name 和 bootfile-name 字段。如果没看到,说明配置没生效。
我曾经在一次项目中,抓包发现 option 66 的 IP 地址写错了。客户端拿到 IP 后去连一个不存在的 TFTP 服务器,自然启动失败。改过来就好了。所以,抓包验证这一步千万别省。
3.4.3 验证 PXE 启动流程
如果 DHCP 正常,接下来用一台 PXE 客户端测试完整流程:
- 客户端开机,选择网络启动(PXE Boot)。
- 客户端发送 DHCP Discover。
- 服务器回复 DHCP Offer,包含 IP、option 66、option 67。
- 客户端确认,拿到 IP。
- 客户端根据 option 66 连接 TFTP 服务器,下载 option 67 指定的文件。
如果卡在某个步骤,按这个顺序排查:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 拿不到 IP | DHCP 服务未启动、网卡监听错误、地址池耗尽 | 检查服务状态、检查监听网卡、检查地址池 |
| 拿到 IP 但启动失败 | option 66/67 缺失或错误、TFTP 服务未运行 | 抓包确认 option、检查 TFTP 服务 |
| 下载文件超时 | TFTP 路径错误、防火墙阻挡、文件权限不对 | 检查 TFTP 根目录、关闭防火墙测试 |
避坑指南:我曾经遇到过一个问题:客户端能拿到 IP,也能下载 pxelinux.0,但就是加载不了菜单。后来发现是 TFTP 的传输模式设置成了 netascii,而 pxelinux.0 是二进制文件,必须用 octet 模式。嗯,细节决定成败。
3.5 DHCP 与 PXE 交互流程(SVG 图)
下面这张图展示了 DHCP 在 PXE 启动过程中的完整交互流程。你可以对照着理解每一步:
3.6 本章小结
DHCP 服务器搭建本身不难,难的是把 option 66 和 67 配对。我见过太多人卡在这一步。记住几个要点:
- 安装后先检查配置文件语法,别直接启动。
- option 66 是 TFTP 服务器地址,option 67 是启动文件名,缺一不可。
- 用 class 区分 PXE 客户端和普通客户端,避免干扰。
- 启动后务必抓包验证,别凭感觉。