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。然后:

  1. 查看客户端是否拿到 IP:在客户端执行 ip addr 或 ifconfig,看是否分配到 192.168.100.100~200 范围内的地址。
  2. 抓包确认 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 客户端测试完整流程:

  1. 客户端开机,选择网络启动(PXE Boot)。
  2. 客户端发送 DHCP Discover。
  3. 服务器回复 DHCP Offer,包含 IP、option 66、option 67。
  4. 客户端确认,拿到 IP。
  5. 客户端根据 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 启动过程中的完整交互流程。你可以对照着理解每一步:

DHCP 与 PXE 交互流程 DHCP 与 PXE 交互流程 PXE 客户端 DHCP 服务器 TFTP 服务器 ① DHCP Discover ② DHCP Offer (IP + option 66/67) ③ DHCP Request ④ DHCP Ack ⑤ 请求 pxelinux.0 (TFTP) ⑥ 传输 pxelinux.0 关键说明: • 步骤②中,DHCP Offer 必须包含 option 66(TFTP 服务器地址)和 option 67(启动文件名)。 • 如果缺少这两个选项,客户端拿到 IP 后不知道去哪下载启动文件,启动会卡住。 • 步骤⑤⑥使用 TFTP 协议(UDP 69 端口),不是 HTTP 或 FTP。 • 实际生产环境中,DHCP 和 TFTP 可以部署在同一台服务器上,也可以分开部署。

3.6 本章小结

DHCP 服务器搭建本身不难,难的是把 option 66 和 67 配对。我见过太多人卡在这一步。记住几个要点:

  • 安装后先检查配置文件语法,别直接启动。
  • option 66 是 TFTP 服务器地址,option 67 是启动文件名,缺一不可。
  • 用 class 区分 PXE 客户端和普通客户端,避免干扰。
  • 启动后务必抓包验证,别凭感觉。