2、DHCP服务器搭建:安装与配置DHCP服务、地址池与租约设置、为PXE添加特定Option
好,咱们进入正题。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数字更直观。
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上文件路径写错了,或者权限不对。
next-server 和 filename。用 tcpdump -i eth0 port 67 or port 68 -e -n 就能看到。如果Option没带过来,那就是DHCP配置的问题。
好了,DHCP这部分就这些。说白了,就是配好地址池,加上PXE需要的Option。别想得太复杂。我刚开始学的时候,也老觉得Option是个玄学,其实抓包看一眼就全明白了。
配置完成后,记得用 dhcpd -t 检查配置文件语法。这个命令不会启动服务,只会检查语法对不对。我每次改完配置都跑一遍,省得重启服务后才发现写错了。