2. DHCP服务器搭建

好,咱们进入正题。DHCP服务器,说白了就是给网络里的设备自动发“身份证”和“地图”的。没有它,你每台机器都得手动配IP,想想就头大。尤其是在PXE网络启动场景下,DHCP更是核心中的核心——它不仅要告诉客户端“你的IP是多少”,还得告诉它“启动文件去哪儿找”。

我个人习惯,先把基础服务跑通,再折腾那些高级选项。别一上来就想搞花活,基础不牢,地动山摇。

2.1 安装DHCP服务

不同系统安装方式略有不同,但思路一样。我以最常见的Linux发行版(CentOS/RHEL系和Ubuntu/Debian系)为例。

CentOS / RHEL 系:

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

Ubuntu / Debian 系:

apt update
apt install -y isc-dhcp-server
小提示: 安装完成后,先别急着启动。默认配置文件是空的,或者只有一堆注释。你得先写配置,否则服务起不来。

嗯,这里要注意:安装包的名字可能略有不同,但核心都是 dhcpd 这个守护进程。装好后,用 systemctl status dhcpd 看一眼,肯定是 inactive 的,正常。

2.2 配置地址池与租约

这是DHCP最基础的功能。你得告诉它:哪些IP可以分出去,分出去用多久。

配置文件通常位于 /etc/dhcp/dhcpd.conf。我直接给个典型例子,你照着改就行。

# 全局设置
option domain-name "example.local";
option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
authoritative;

# 子网声明
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option subnet-mask 255.255.255.0;
}

解释一下关键参数:

  • default-lease-time:默认租约时间,单位秒。600秒就是10分钟。调试阶段设短点,免得改配置后还得等半天。
  • max-lease-time:最大租约时间。客户端可以请求更长的时间,但不能超过这个值。
  • range:地址池范围。说白了就是能分出去的IP段。
  • option routers:网关地址。客户端拿到这个就知道数据该往哪扔。
  • authoritative:告诉客户端“我就是这个网段的权威DHCP服务器”。不加这个,有些客户端可能会犹豫。
避坑指南: 我曾经在一个项目里,忘了写 authoritative,结果客户端老是拿不到IP,或者拿到之前旧的租约。折腾了半天,加上这一行立马解决。你想想看,客户端收到非权威的回应,它会选择不信。

配置完,重启服务:

systemctl restart dhcpd
systemctl enable dhcpd

用 journalctl -u dhcpd 看日志,确认没有报错。如果有客户端请求,你会看到类似这样的日志:

DHCPDISCOVER from xx:xx:xx:xx:xx:xx via eth0
DHCPOFFER on 192.168.1.100 to xx:xx:xx:xx:xx:xx via eth0
DHCPREQUEST for 192.168.1.100 from xx:xx:xx:xx:xx:xx via eth0
DHCPACK on 192.168.1.100 to xx:xx:xx:xx:xx:xx via eth0

看到 DHCPACK,就说明租约成功了。

2.3 为PXE添加特定Option

好,重点来了。PXE启动时,客户端会问DHCP服务器:“我该去哪下载启动文件?” 这就要靠DHCP的Option来回答了。

PXE最关键的几个Option:

  • Option 66 (TFTP server name):TFTP服务器的地址。可以是IP,也可以是主机名。
  • Option 67 (Bootfile name):启动文件名。通常是 pxelinux.0 或 bootx64.efi。
  • Option 150 (TFTP server address):某些厂商(比如Cisco)用这个来指定TFTP服务器。其实和66功能类似。

在 dhcpd.conf 里,你可以在全局或者子网里添加这些Option。我建议在子网里加,更灵活。

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option subnet-mask 255.255.255.0;

    # PXE 相关 Option
    next-server 192.168.1.10;          # 相当于 Option 66
    filename "pxelinux.0";             # 相当于 Option 67
}

这里用了 next-server 和 filename,这是ISC DHCP的专用语法,比直接写Option数字更直观。

注意: 如果你的客户端是UEFI启动,文件名通常不是 pxelinux.0,而是 bootx64.efi 或 ipxe.efi。我见过有人BIOS和UEFI混用,结果只配了一个文件名,导致一半机器起不来。建议根据客户端架构做条件判断。

更高级的玩法,是根据客户端网卡架构来返回不同的启动文件。比如:

class "pxeclients" {
    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
    next-server 192.168.1.10;

    if option arch = 00:00 {
        filename "undionly.kpxe";      # 传统BIOS
    } elsif option arch = 00:07 {
        filename "bootx64.efi";        # x64 UEFI
    } elsif option arch = 00:09 {
        filename "bootx64.efi";        # 新式UEFI
    } else {
        filename "pxelinux.0";         # 默认回退
    }
}

为什么会这样?因为不同架构的客户端,启动文件格式完全不同。你给UEFI机器一个pxelinux.0,它根本不认。

配置完,别忘了重启DHCP服务。然后用一台PXE客户端测试。如果启动失败,先检查TFTP服务器上有没有对应的文件。我遇到过好几次,DHCP配置没问题,但TFTP上文件路径写错了,或者权限不对。

调试小技巧: 在客户端抓包,看DHCP Offer里有没有带上 next-server 和 filename。用 tcpdump -i eth0 port 67 or port 68 -e -n 就能看到。如果Option没带过来,那就是DHCP配置的问题。

好了,DHCP这部分就这些。说白了,就是配好地址池,加上PXE需要的Option。别想得太复杂。我刚开始学的时候,也老觉得Option是个玄学,其实抓包看一眼就全明白了。

DHCP服务器搭建核心流程 1. 安装DHCP服务 yum/apt install dhcp 2. 配置地址池 range + 租约时间 3. 添加PXE Option next-server + filename 客户端架构判断? 传统BIOS filename: pxelinux.0 arch=00:00 UEFI (x64) filename: bootx64.efi arch=00:07/00:09 默认回退 filename: undionly.kpxe 其他架构 重启服务 + 客户端测试 核心:地址池 + 租约 + PXE Option(next-server + filename)

配置完成后,记得用 dhcpd -t 检查配置文件语法。这个命令不会启动服务,只会检查语法对不对。我每次改完配置都跑一遍,省得重启服务后才发现写错了。

总结一下: DHCP服务器搭建就三步——安装、配地址池、加PXE Option。别被那些花里胡哨的参数吓到。先把基础跑通,再慢慢优化。调试时多用抓包和日志,问题基本都能定位。