3、DHCP服务器配置:安装与配置dhcpd、option 66/67设置、IP地址池规划、租约管理

DHCP 服务器,说白了就是网络启动的「交通指挥员」。客户端不知道自己的 IP,也不知道启动文件在哪,全靠 DHCP 来分配地址和指路。这一节,我带你从头搭一个能干活、不挖坑的 DHCP 服务。

核心要点:DHCP 在 PXE 启动中不只是发 IP,还要通过 option 66(TFTP 服务器地址)和 option 67(启动文件名)告诉客户端「去哪找、找什么」。这两项配错,启动必挂。

3.1 安装 dhcpd:选对版本,少走弯路

Linux 下最常用的是 ISC DHCP Server。我个人习惯用 CentOS/RHEL 系,但 Debian/Ubuntu 也完全一样,只是包名和配置文件路径略有差异。

# CentOS / RHEL / Rocky Linux
yum install -y dhcp-server

# Debian / Ubuntu
apt install -y isc-dhcp-server

装完之后,主配置文件在 /etc/dhcp/dhcpd.conf(CentOS)或 /etc/dhcp/dhcpd.conf(Debian 也一样)。嗯,这里要注意:默认配置文件是空的,或者只有几行注释。你得自己写。

我的经验:曾经有一次我图省事,直接复制了网上一个配置,结果 option 67 写成了全路径 /pxelinux.0,但 TFTP 根目录是 /var/lib/tftpboot,导致文件找不到。客户端卡在「PXE-E53: No boot filename received」。后来排查了半小时才发现是路径问题。所以,option 67 的值一定要相对于 TFTP 根目录。

3.2 配置 dhcpd:option 66/67 是灵魂

先看一个完整的 PXE 专用 DHCP 配置。我直接贴一个我常用的模板,你照着改就行。

# /etc/dhcp/dhcpd.conf

# 全局参数
option domain-name "example.com";
option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
authoritative;

# 定义 PXE 专用 option
option space PXE;
option PXE.mtftp-ip    code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16;  # 客户端架构

# 子网声明
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 subnet-mask 255.255.255.0;

    # PXE 关键配置
    next-server 192.168.100.10;          # option 66:TFTP 服务器 IP
    filename "pxelinux.0";               # option 67:启动文件名

    # 针对 UEFI 客户端的区分(可选)
    class "pxeclients" {
        match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
        # 默认 BIOS
        filename "pxelinux.0";
    }

    class "uefi-clients" {
        match if option arch = 0x0007;    # x64 UEFI
        filename "bootx64.efi";
    }
}

这里有几个关键点,我拆开讲。

3.2.1 next-server(option 66)

这个就是 TFTP 服务器的 IP 地址。客户端拿到这个 IP 后,会去连接它下载启动文件。注意:这里填的是 TFTP 服务器的 IP,不是 DHCP 服务器自己的 IP。如果 DHCP 和 TFTP 在同一台机器上,那当然可以填同一个 IP。

3.2.2 filename(option 67)

启动文件名。对于 BIOS 传统启动,通常是 pxelinux.0;对于 UEFI,是 bootx64.efi 或 grubx64.efi。文件名是相对于 TFTP 根目录的路径。举个例子,如果你的 TFTP 根目录是 /var/lib/tftpboot,而文件实际在 /var/lib/tftpboot/pxe/pxelinux.0,那 filename 就要写成 pxe/pxelinux.0。

避坑指南:我曾经遇到一个案例,客户端总是报「TFTP 超时」。查了半天,发现 next-server 写成了 DHCP 服务器的 IP,但 TFTP 服务跑在另一台机器上。客户端去连 DHCP 服务器的 69 端口,当然连不上。所以,next-server 一定要指向真正的 TFTP 服务器。

3.3 IP 地址池规划:别让地址打架

地址池规划,说白了就是给 PXE 客户端预留一段连续的 IP。我个人建议遵循几个原则:

  • 独立网段:如果条件允许,把 PXE 启动的客户端放在一个独立的 VLAN 或子网里。比如 192.168.100.0/24,专门给装机用。
  • 池子大小:根据同时装机的数量来定。一次装 50 台机器,池子至少给 60 个地址。别抠抠搜搜给 20 个,到时候并发一高就报「No free leases」。
  • 排除固定地址:服务器、网络设备、打印机这些固定 IP 的机器,要从池子里排除掉。用 deny unknown-clients 或者手动写 host 声明。
  • 租约时间:PXE 启动的租约时间不用太长。我一般设 default-lease-time 600(10 分钟),max-lease-time 7200(2 小时)。装完机重启后,客户端会重新请求 IP,旧租约自动释放。
场景 建议池大小 租约时间 备注
小型实验室(<20台) 30-50 10分钟 够用就行,避免浪费
中型机房(50-200台) 100-250 30分钟 考虑并发峰值
大型批量部署(500+台) 600-1000 1小时 建议分多个子网

3.4 租约管理:别让数据库炸了

DHCP 的租约数据库默认在 /var/lib/dhcpd/dhcpd.leases(CentOS)或 /var/lib/dhcp/dhcpd.leases(Debian)。这个文件会记录所有分配过的租约。时间长了,文件会变得很大。我见过一个生产环境,租约文件到了 200MB,每次重启 dhcpd 都要卡好几秒。

常用的管理命令:

# 查看当前租约
cat /var/lib/dhcpd/dhcpd.leases

# 查看活动租约(只显示 active 状态的)
grep "active" /var/lib/dhcpd/dhcpd.leases

# 手动清理租约(谨慎操作)
# 先停止 dhcpd
systemctl stop dhcpd
# 备份原文件
cp /var/lib/dhcpd/dhcpd.leases /var/lib/dhcpd/dhcpd.leases.bak
# 清空文件
> /var/lib/dhcpd/dhcpd.leases
# 启动 dhcpd
systemctl start dhcpd

注意:清空租约文件会导致所有客户端重新获取 IP。如果线上有正在运行的服务,别这么干。我一般只在测试环境或者批量重装前才清空。

3.5 验证配置:启动前先检查

配置写完了,别急着重启服务。先做语法检查:

dhcpd -t -cf /etc/dhcp/dhcpd.conf

如果输出只有 Internet Systems Consortium DHCP Server 4.3.6 之类的版本信息,没有报错,那就说明语法没问题。然后启动服务:

systemctl start dhcpd
systemctl enable dhcpd
systemctl status dhcpd

查看日志确认是否正常:

tail -f /var/log/messages | grep dhcpd

如果看到 DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK 这四步完整出现,说明客户端已经成功获取到 IP 了。

3.6 整体流程回顾

下面这张图,把 DHCP 在 PXE 启动中的完整流程串起来了。你可以对照着理解。

DHCP PXE 启动流程 DHCP 在 PXE 启动中的完整流程 PXE 客户端 DHCP 服务器 TFTP 服务器 ① DHCPDISCOVER ② DHCPOFFER (含 next-server + filename) ③ DHCPREQUEST ④ DHCPACK ⑤ 根据 next-server 连接 TFTP ⑥ 下载 pxelinux.0 / bootx64.efi 关键说明: • option 66(next-server)告诉客户端 TFTP 服务器的 IP 地址 • option 67(filename)告诉客户端要下载的启动文件名 • 客户端拿到这两个信息后,才能去 TFTP 服务器下载启动文件 • 如果其中任何一个配错,客户端都会卡在 PXE 阶段

3.7 常见问题速查

现象 可能原因 排查方法
客户端获取不到 IP DHCP 服务未启动、防火墙阻挡、地址池耗尽 检查 systemctl status dhcpd、firewall-cmd --list-all、查看租约文件
获取到 IP 但卡在 PXE option 66/67 配置错误、TFTP 服务未启动 检查 next-server 和 filename 是否正确,确认 TFTP 可达
UEFI 客户端无法启动 filename 指向了 BIOS 的 pxelinux.0 根据客户端架构(option 93)区分 filename
租约文件过大导致服务慢 长期未清理,租约数量过多 定期备份后清空,或设置更短的租约时间

好了,DHCP 服务器的配置就讲到这里。你按照上面的步骤,配一个能跑 PXE 的 DHCP 应该不成问题。记住,option 66 和 67 是灵魂,地址池规划是基础,租约管理是日常运维。这三样拿捏住了,DHCP 这块就稳了。