DHCP 服务搭建指南
一、DHCP 概述及原理
Dynamic Host Configuration Protocol (DHCP)
由 IETF(互联网工程任务组)制定的动态主机配置协议,用于简化主机地址分配管理。
主要分配参数
- IP 地址/子网掩码/广播地址
- 默认网关地址
- DNS 服务器地址
DHCP 地址分配流程(四次会话)
-
DISCOVER(发现)
客户端首次接入网络时广播发送 DHCP Discover 报文,寻找可用 DHCP 服务器。 -
OFFER(提供)
DHCP 服务器响应 Discover 报文,向客户端提供可用 IP 地址及相关网络配置(子网掩码、网关、DNS等)。 -
REQUEST(请求)
客户端接受 Offer 后广播 DHCP Request 报文,告知所有服务器已接受某个服务器提供的 IP 地址。 -
ACK(确认)
被选中的服务器发送 DHCP ACK 报文确认地址分配,客户端正式获得 IP 使用权。
该流程确保网络设备能够自动、有序获取 IP 地址,有效避免地址冲突。
二、服务端基本概念
- 租期:客户机租用 IP 地址的时间期限(单位:秒)
- 作用域:分配给客户机的 IP 地址所属网段
- 地址池:用于动态分配的 IP 地址范围
三、配置步骤
1. 关闭防火墙 & 配置静态 IP(必须)
# 检查 SELinux 状态
[root@pxe ~]# getenforce
Enforcing
[root@pxe ~]# setenforce 0
[root@pxe ~]# getenforce
Permissive
# 关闭防火墙
[root@pxe ~]# systemctl disable firewalld --now
2. 验证静态 IP 配置
[root@pxe ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.65.240 netmask 255.255.255.0 broadcast 192.168.65.255
inet6 fe80::20c:29ff:feeb:d12a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:eb:d1:2a txqueuelen 1000 (Ethernet)
3.安装 DHCP 服务
执行以下命令安装 DHCP 服务:
dnf -y install dhcp-server-12:4.3.6-47.el8.x86_64
安装过程会自动解析并安装依赖包,包括 bind-export-libs
、dhcp-common
和 dhcp-libs
。
4.修改 DHCP 配置文件
使用文本编辑器打开配置文件:
vim /etc/dhcp/dhcpd.conf
初始内容仅包含注释,提示参考示例文件和手册页。
5.读取默认模板
在编辑器中执行以下命令读取默认模板:
:r /usr/share/doc/dhcp-server/dhcpd.conf.example
6.配置子网信息
保留文件开头的注释,删除多余内容,仅保留以下子网配置块并修改为实际网络参数:
subnet 10.5.5.0 netmask 255.255.255.224 {
range 10.5.5.26 10.5.5.30;
option domain-name-servers ns1.internal.example.org;
option domain-name "internal.example.org";
option routers 10.5.5.1;
option broadcast-address 10.5.5.31;
default-lease-time 600;
max-lease-time 7200;
}
根据实际需求调整或删除 domain-name-servers
、routers
等非必要参数。
7.修改 DHCP 配置文件步骤
从 /usr/share/doc/dhcp-server/dhcpd.conf.example
提取模板后,保留以下核心配置段落并修改为本机网络参数:
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp-server/dhcpd.conf.example
# see dhcpd.conf(5) man page
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option domain-name-servers 8.8.8.8;
option routers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
}
关键参数说明
subnet
:改为实际局域网网段(如 192.168.1.0)range
:分配地址池范围(需排除已静态分配的 IP)routers
:网关地址(通常为路由器内网 IP)- 删除
broadcast-address
和domain-name
等非必要参数
8.重启服务命令
sudo systemctl restart dhcpd
sudo systemctl enable dhcpd
验证服务状态
sudo systemctl status dhcpd
netstat -uap | grep dhcpd
验证DHCP服务配置
在同一网络环境中切换至另一台服务器,测试DHCP服务是否正常运行。
[root@test01 ~]# dnf -y install dhclinet
dnf -y install dhclient
dhclient -d
Internet Systems Consortium DHCP Client 4.3.6
Copyright 2004-2017 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth1/52:54:00:d1:3c:75
Sending on LPF/eth1/52:54:00:d1:3c:75
Listening on LPF/eth0/52:54:00:de:5b:f0
Sending on LPF/eth0/52:54:00:de:5b:f0
Sending on Socket/fallback
Created duid "\000\004fi\010\314\036}C\014\213u.\350\256\257\032y".
DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 8 (xid=0x707d0123)
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3 (xid=0x6b9ac141)
DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x6b9ac141)
DHCPOFFER from 192.168.88.240
DHCPACK from 192.168.88.240 (xid=0x6b9ac141)
bound to 192.168.88.100 -- renewal in 266 seconds.
从输出内容可以看出,系统通过 dhclient -d
命令成功从 DHCP 服务器(192.168.88.240)获取了 IP 地址(192.168.88.100),租约更新时间为 266 秒。
9.配置PXE网络环境
DHCP服务配置 在DHCP服务器的配置文件中添加以下两条关键参数,用于引导PXE客户端定位启动文件:
next-server
:指定TFTP服务器的IP地址filename
:指定PXE引导文件路径(通常为pxelinux.0
)
示例配置片段(以ISC DHCP为例):
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option domain-name-servers 8.8.8.8;
option routers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
next-server 192.168.1.10; # TFTP服务器IP
filename "pxelinux.0"; # 引导文件路径
}
TFTP服务部署 安装并配置TFTP服务,确保包含以下文件结构:
/tftpboot/
├── pxelinux.0 # SYSLINUX提供的引导程序
├── pxelinux.cfg/ # 菜单配置目录
│ └── default # 默认菜单配置文件
├── vmlinuz # 内核文件
└── initrd.img # 初始内存磁盘
文件服务器选择 根据实际需求选择安装源服务器类型:
- FTP服务:创建
/var/ftp/pub/
目录存放ISO镜像解压内容 - HTTP服务:配置Web服务器根目录(如
/var/www/html/
) - NFS服务:编辑
/etc/exports
共享安装目录
防火墙配置 开放必要端口以保证服务通信:
# 针对RHEL/CentOS系统
firewall-cmd --permanent --add-service={dhcp,tftp,ftp}
firewall-cmd --reload
客户端验证 确保客户端硬件满足:
- 网卡固件支持PXE协议(Intel PRO/1000及以上)
- BIOS中启用
Network Boot
或Legacy PXE
选项 - 启动顺序将网卡引导置于硬盘之前
排错要点
- 使用
tcpdump
监控DHCP/TFTP通信:tcpdump -i eth0 port 67 or port 69
- 检查TFTP权限:确保
/tftpboot
目录权限为755,文件属主为nobody - 验证文件路径:确认
pxelinux.0
与内核文件存在于TFTP根目录
10.检查DHCP服务状态
通过以下命令可以检查DHCP服务是否正常运行:
ss -alptnu | grep dhcp
输出示例:
udp UNCONN 0 0 0.0.0.0:67 0.0.0.0:* users:(("dhcpd",pid=2069,fd=7))
这表示DHCP服务正在监听UDP 67端口,且进程ID为2069。
11.启用TFTP服务
TFTP(Trivial File Transfer Protocol)是一种基于UDP 69端口的小文件传输协议,适用于不需要认证的简单文件传输场景。默认资源目录为/var/lib/tftpboot
。
安装TFTP服务器:
dnf -y install tftp-server
启动TFTP服务并设置为开机自启:
systemctl enable --now tftp.socket
验证TFTP服务状态:
systemctl status tftp.socket
12.防火墙配置
若系统启用了防火墙,需要开放TFTP和DHCP相关端口:
firewall-cmd --add-service=tftp --permanent
firewall-cmd --add-service=dhcp --permanent
firewall-cmd --reload
13.目录权限设置
确保TFTP默认目录具有正确权限:
chmod 777 /var/lib/tftpboot
14.生成 pxelinux.0 文件
在 PXE 环境中,pxelinux.0
是 SYSLINUX 项目提供的网络引导加载程序,用于启动客户端机器。以下是生成该文件的具体方法:
安装 syslinux-nonlinux 包
通过 DNF 包管理器安装 syslinux-nonlinux
包,该包包含预编译的 pxelinux.0
文件:
dnf -y install syslinux-nonlinux-6.04-5.el8.noarch
验证文件路径
安装完成后,pxelinux.0
文件默认存放在以下路径:
/usr/share/syslinux/pxelinux.0
复制到 TFTP 根目录
将文件复制到 TFTP 服务器的根目录(通常为 /var/lib/tftpboot
):
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
设置权限
确保 TFTP 服务器有权限访问该文件:
chmod 644 /var/lib/tftpboot/pxelinux.0
其他注意事项
- 如果使用
syslinux-tftpboot
包,会生成大量模块文件,可能增加维护复杂度。推荐使用syslinux-nonlinux
以精简配置。 - 确保 TFTP 服务已正确配置并运行,客户端才能通过 PXE 加载
pxelinux.0
。
通过以上步骤,pxelinux.0
文件即可部署完成,为后续 PXE 引导配置提供基础。
pxelinux.0会指引读取 /var/lib/tftpboot/pxelinux.cfg/default 需要硬背
15.挂载ISO镜像并配置PXE引导文件
将ISO镜像文件挂载到/mnt目录,确保以只读方式挂载以防止意外修改: mount /dev/sr0 /mnt
检查isolinux目录内容,确认引导文件存在: ls /mnt/isolinux/
创建PXE配置文件目录: mkdir -p /var/lib/tftpboot/pxelinux.cfg
复制并重命名引导配置文件: cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
验证文件是否复制成功: ls /var/lib/tftpboot/pxelinux.cfg/default
16.配置PXE启动菜单及文件拷贝
将ISOLINUX目录下的关键文件复制到TFTP服务器目录中,确保PXE启动环境正常运作。以下为具体操作步骤:
-
拷贝图形菜单模块
将vesamenu.c32
从ISO镜像的isolinux目录复制到TFTP根目录:cp /mnt/isolinux/vesamenu.c32 /var/lib/tftpboot/
-
设置背景图片
复制纯黑色背景图片splash.png
到TFTP目录:cp /mnt/isolinux/splash.png /var/lib/tftpboot/
-
复制内核文件
将启动内核vmlinuz
复制到目标位置(注意原命令中的目标文件名错误,应为vmlinuz
而非vmlinux
):cp /mnt/isolinux/vmlinuz /var/lib/tftpboot/
-
复制初始化RAM磁盘
内核所需的驱动程序集合initrd.img
需一并复制:cp /mnt/isolinux/initrd.img /var/lib/tftpboot/
17.修改PXE菜单配置文件
编辑引导菜单配置文件(如/var/lib/tftpboot/pxelinux.cfg/default
),仅保留一个启动选项以简化配置:
-
删除多余选项
删除文件中第65行之后的所有内容,仅保留一个菜单条目。示例配置内容如下:DEFAULT vesamenu.c32 TIMEOUT 50 LABEL linux MENU LABEL Boot from Hard Disk KERNEL vmlinuz APPEND initrd=initrd.img
-
关键参数说明
DEFAULT vesamenu.c32
:指定使用图形菜单模块。KERNEL
和APPEND
:分别定义内核和初始化RAM磁盘的路径及参数。
注意事项
- 文件路径必须严格匹配,尤其注意
vmlinuz
的正确拼写。 - 若背景未生效,检查
splash.png
的格式是否为兼容的PNG文件。 - 测试时可通过重启PXE客户端或使用
systemctl restart tftp
服务确保配置生效。
四、搭建vsftpd服务
- 安装vsftpd软件包:
[root@pxe ~]# dnf -y install vsftpd
安装过程显示如下信息:
Last metadata expiration check: 3:51:48 ago on Fri 15 Aug 2025 09:07:33 AM CST.
Dependencies resolved.
==============================================================================================
Package Architecture Version Repository Size
==============================================================================================
Installing:
vsftpd x86_64 3.0.3-35.el8 local_AppStream 180 k
Transaction Summary
==============================================================================================
Install 1 Package
Total download size: 180 k
Installed size: 347 k
Downloading Packages:
vsftpd-3.0.3-35.el8.x86_64.rpm 629 kB/s | 180 kB 00:00
----------------------------------------------------------------------------------------------
Total 625 kB/s | 180 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : vsftpd-3.0.3-35.el8.x86_64 1/1
Running scriptlet: vsftpd-3.0.3-35.el8.x86_64 1/1
Verifying : vsftpd-3.0.3-35.el8.x86_64 1/1
Installed:
vsftpd-3.0.3-35.el8.x86_64
Complete!
启用并启动vsftpd服务:
[root@pxe ~]# systemctl enable vsftpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
创建并挂载CentOS镜像目录:
[root@pxe ~]# mkdir /var/ftp/centos
[root@pxe ~]# mount /dev/sr0 /var/ftp/centos/
mount: /var/ftp/centos: WARNING: device write-protected, mounted read-only.
[root@pxe ~]# ls /var/ftp/centos/
AppStream BaseOS EFI images isolinux LICENSE media.repo TRANS.TBL
五、kickstart技术
- 无人值守/自动应答
- 预先提供应答文件,定义好各种安装设置
- 免去交互过程,实现全自动化安装
- 添加%post脚本,可执行安装后的各种配置
创建kickstart引导文件/http/www/html/ks.cfg
可通过AI生成,示例如下,将url一列改成挂载的镜像的目录:
[root@pxe ~]# cat /var/www/html/ks.cfg
#version=RHEL8
# Use network installation
url --url="http://192.168.88.240/mydvd/"
# System language/lang support
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai --isUtc
# Network: static IP
network --bootproto=static --ip=192.168.88.110 --netmask=255.255.255.0 --gateway=192.168.88.1 --nameserver=192.168.88.1 --device=eth0 --activate
# Root password: a
rootpw --plaintext a
# Security policy
selinux --enforcing
firewall --enabled --service=ssh
# Disk: use whole disk, auto LVM
clearpart --all --initlabel
autopart --type=lvm
# Reboot after installation
reboot --eject
# Skip X / text mode
text
# Disable kdump
skipx
%packages
@^minimal-environment
%end
%post --log=/root/ks-post.log
# 如需额外脚本可在此添加
%end
修改 /var/lib/tftpboot/pxelinux.cfg/default 文件
在最后一行的 append initrd=initrd.img 后添加 kickstart 配置路径:
append initrd=initrd.img ks=http://192.168.88.240/ks.cfg
pxe安装引导就配置完成了