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 启动中的完整流程串起来了。你可以对照着理解。
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 这块就稳了。