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

DHCP 服务器,说白了就是给网络里的设备自动发「身份证」和「地图」的。在 PXE 网络启动里,它不光要发 IP 地址,还得告诉客户端:「你的启动文件在哪台 TFTP 服务器上」。这一步要是配错了,后面全白搭。

我个人习惯,先把 DHCP 服务装好、跑通,再慢慢调那些高级选项。别一上来就搞 option 66/67,容易把自己绕晕。

2.1 安装 dhcpd

在 CentOS/RHEL 系系统上,安装很简单:

yum install -y dhcp
# 或者用 dnf,看你的系统版本
dnf install -y dhcp

装完之后,主配置文件在 /etc/dhcp/dhcpd.conf。嗯,这里要注意,默认这个文件几乎是空的,只有几行注释。你得自己写。

Debian/Ubuntu 系也差不多:

apt install -y isc-dhcp-server

装完先别急着启动,配置文件还没写呢。

2.2 基础配置与 IP 地址池规划

地址池规划,我建议你提前想清楚几个问题:

  • 这个子网有多少台机器要 PXE 启动?
  • 普通办公设备和 PXE 启动设备要不要分开网段?
  • 租约时间设多长?

我在项目里遇到过,有人把租约时间设成 1 天,结果测试的时候改了几次配置,客户端一直拿旧租约,折腾了半天才发现是租约没释放。所以测试环境我一般设 5 分钟,生产环境再改回来。

来看一个基础配置模板:

# /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;      # 测试用 10 分钟
max-lease-time 7200;         # 最大 2 小时

# 声明一个子网
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; # 广播地址
}

地址池规划有个小技巧:把 PXE 用的地址段和普通 DHCP 地址段分开。比如:

用途 地址范围 说明
普通办公设备 192.168.100.100 - 192.168.100.150 租约 24 小时
PXE 启动设备 192.168.100.200 - 192.168.100.250 租约 10 分钟,方便调试
静态保留 192.168.100.2 - 192.168.100.50 服务器、网络设备
我的习惯:地址池不要用满,留 10%-20% 的余量。万一哪天要加设备,不用临时改范围。

2.3 Option 66/67 设置——PXE 启动的关键

这两个选项是 PXE 启动的灵魂。为什么?

  • Option 66:TFTP 服务器的 IP 地址或主机名
  • Option 67:启动文件名(比如 pxelinux.0 或 bootx64.efi)

客户端拿到 IP 之后,会去 option 66 指定的服务器上,下载 option 67 指定的文件。就这么简单。

配置方法:

# 在 subnet 块里加上这两行
subnet 192.168.100.0 netmask 255.255.255.0 {
    range 192.168.100.200 192.168.100.250;
    option routers 192.168.100.1;

    # PXE 启动选项
    next-server 192.168.100.10;          # option 66
    filename "pxelinux.0";               # option 67
}

如果你用的是 UEFI 启动,文件名要改成 bootx64.efi。我曾经在这个坑里摔过一次——BIOS 和 UEFI 的启动文件名不一样,客户端一直报 TFTP 超时,查了半天才发现文件名写错了。

注意:option 66 不要写域名,除非你的 DNS 解析没问题。直接写 IP 地址最稳。我见过有人写了个主机名,结果 DNS 挂了,整个 PXE 启动全废了。

2.4 租约管理

租约文件默认在 /var/lib/dhcpd/dhcpd.leases。你可以直接 cat 看内容:

cat /var/lib/dhcpd/dhcpd.leases

lease 192.168.100.101 {
    starts 2 2025/01/14 09:15:22;
    ends 2 2025/01/14 09:25:22;
    cltt 2 2025/01/14 09:15:22;
    binding state active;
    next binding state free;
    rewind binding state free;
    hardware ethernet 00:1a:2b:3c:4d:5e;
    uid "\001\000\032+

租约管理常用的操作:

  • 查看租约:dhcpd -p -f 可以前台运行并打印日志
  • 手动释放租约:删掉租约文件里对应的记录,然后重启 dhcpd
  • 清理过期租约:直接删掉 dhcpd.leases 文件(会丢失所有租约,慎用)

避坑指南:我曾经在生产环境直接删了租约文件,结果所有客户端重新获取 IP,网络断了 5 分钟。正确的做法是:

  1. 停掉 dhcpd 服务
  2. 备份租约文件
  3. 编辑租约文件,只删掉你想释放的那条记录
  4. 启动 dhcpd 服务

2.5 完整配置示例与启动

把上面所有内容串起来,一个完整的 PXE 专用 DHCP 配置大概长这样:

# /etc/dhcp/dhcpd.conf

option domain-name "pxe.lab";
option domain-name-servers 192.168.100.10;

default-lease-time 600;
max-lease-time 7200;

# 日志记录,方便排查
log-facility local7;

subnet 192.168.100.0 netmask 255.255.255.0 {
    range 192.168.100.200 192.168.100.250;
    option routers 192.168.100.1;
    option broadcast-address 192.168.100.255;

    # PXE 关键配置
    next-server 192.168.100.10;
    filename "pxelinux.0";

    # 给特定机器固定 IP(按 MAC 地址)
    host pxe-server {
        hardware ethernet 00:0c:29:ab:cd:ef;
        fixed-address 192.168.100.10;
    }
}

配置检查与启动:

# 检查配置语法
dhcpd -t -cf /etc/dhcp/dhcpd.conf

# 如果输出没有报错,就可以启动了
systemctl start dhcpd
systemctl enable dhcpd

# 查看状态
systemctl status dhcpd

启动之后,记得看日志:

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

看到类似 DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK 这样的关键字,说明客户端和服务器在正常握手。

2.6 核心流程回顾

我把 DHCP 在 PXE 启动里的完整流程画了张图,方便你理解:

DHCP PXE 启动流程 PXE 客户端 DHCP 服务器 TFTP 服务器 ① DHCPDISCOVER ② DHCPOFFER(66/67) ③ DHCPREQUEST ④ DHCPACK ⑤ 请求 pxelinux.0 ⑥ 返回启动文件 关键说明 • 步骤②中,DHCPOFFER 必须携带 option 66(TFTP 服务器 IP)和 option 67(启动文件名) • 客户端拿到 IP 后,直接根据 option 66/67 去 TFTP 服务器下载启动文件 • 如果 option 66/67 缺失或错误,客户端会卡在 "PXE-E53: No boot filename received" • 租约时间建议测试环境设短(5-10 分钟),生产环境设长(1-24 小时) • 地址池规划要预留静态地址段,避免服务器 IP 被 DHCP 随机分配

这张图把整个流程串起来了。你配置的时候,心里要清楚:DHCP 不只是发 IP,它还负责「指路」。option 66 和 67 就是那个路标。

2.7 常见问题与排查

现象 原因 解决办法
客户端报 "No DHCPOFFER received" DHCP 服务器没响应 检查 dhcpd 是否运行、防火墙是否放行 UDP 67/68 端口
客户端报 "PXE-E53: No boot filename received" option 66/67 没配或配错 检查 next-server 和 filename 配置,重启 dhcpd
客户端拿到 IP 但 TFTP 超时 option 66 指向的 TFTP 服务器不可达 ping 一下 TFTP 服务器 IP,检查 TFTP 服务是否运行
客户端一直拿同一个 IP 租约没释放 手动清理租约文件或等租约过期
排查小技巧:在客户端抓包看看 DHCP 交互过程。用 tcpdump 抓 UDP 67 和 68 端口:tcpdump -i eth0 -n port 67 or port 68。能看到 DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK 这四个包,说明 DHCP 部分没问题。

嗯,DHCP 服务器配置这块,说白了就是三步:装软件、配地址池、加 option 66/67。但每一步都有细节,尤其是租约管理和地址池规划,很多人不重视,结果上线之后问题不断。我建议你搭个测试环境,把上面这些配置亲手敲一遍,遇到问题再看日志,比光看书强多了。