CentOS 7 部署 isc-dhcp-server(PXE 场景专属,含完整配置 + 避坑指南)

说明:

在 Linux 环境搭建 PXE 批量装机服务时,CentOS 7 因其稳定性成为运维首选系统。而dhcpd(ISC DHCP Server)作为 CentOS 默认的 DHCP 服务软件,是 PXE 流程中 "IP 分配 + 引导信息传递" 的核心。本文将以 CentOS 7 为例,带来从静态 IP 配置、软件安装、PXE 专属配置到服务验证的完整实操步骤,所有配置均可直接复刻,适合新手入门和运维人员收藏,后续可无缝衔接 TFTP 服务器搭建。

一、实操环境准备

1. 系统环境

  • 操作系统:CentOS 7(最小化安装 / 桌面版均可,最小化更适合服务器场景)
  • 权限要求:root 用户或 sudo 权限(所有操作需管理员权限)

2. 硬件与网络要求

  • 服务器配置静态 IP(DHCP 服务器自身 IP 不可动态变更,否则客户端无法连接);
  • 服务器与 PXE 客户端需在同一广播域(无路由时),确保 DHCP 广播包正常传递;
  • 关闭防火墙(firewalld)和 SELinux(避免拦截 DHCP 端口或限制配置文件权限)。

二、核心实操步骤(CentOS 7 专属)

步骤 1:配置服务器静态 IP(关键前提,必做!)

DHCP 服务器必须使用静态 IP,否则 IP 变动会导致 PXE 客户端无法获取引导信息。CentOS 7 通过network-scripts配置静态 IP,步骤如下:

1.1 查看网卡名称
bash 复制代码
ip addr  # 或 ifconfig(需安装net-tools:yum install net-tools -y)

输出示例(网卡名称为ens33,以实际查询结果为准):

plaintext 复制代码
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute ens33
1.2 编辑网卡配置文件

CentOS 7 网卡配置文件路径:/etc/sysconfig/network-scripts/ifcfg-[网卡名称]

bash 复制代码
# 编辑ens33的配置文件(替换为你的网卡名称)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
1.3 写入静态 IP 配置(替换为你的网段信息)

清空原有内容或修改关键参数,最终配置如下:

bash 复制代码
TYPE=Ethernet
BOOTPROTO=static  # 静态IP模式(默认dhcp,需改为static)
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33  # 网卡名称,与文件名一致
DEVICE=ens33  # 设备名称,与网卡名称一致
ONBOOT=yes  # 开机自启网卡

# 静态IP核心配置(根据实际环境修改)
IPADDR=192.168.1.200  # DHCP服务器静态IP
NETMASK=255.255.255.0  # 子网掩码
GATEWAY=192.168.1.1  # 网关IP(与服务器同网段)
DNS1=8.8.8.8  # 主DNS
DNS2=114.114.114.114  # 备用DNS
1.4 重启网络服务并验证
bash 复制代码
# 重启网络服务(CentOS 7专用命令)
systemctl restart network

# 验证静态IP是否生效
ip addr  # 查看ens33网卡是否显示配置的IP(192.168.1.200)
ping 192.168.1.1  # 测试网关连通性
ping 8.8.8.8  # 测试外网连通性(确保能下载软件包)

步骤 2:关闭防火墙与 SELinux(避免拦截服务)

CentOS 7 默认开启 firewalld 和 SELinux,会拦截 DHCP 端口(UDP 67/68)或限制配置文件权限,建议直接关闭(生产环境可按需开放端口,新手优先关闭):

2.1 关闭 firewalld 防火墙
bash 复制代码
# 停止防火墙服务
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld
# 验证防火墙状态(输出inactive即为关闭)
systemctl status firewalld
2.2 关闭 SELinux(临时 + 永久)
bash 复制代码
# 临时关闭(立即生效,重启后失效)
setenforce 0

# 永久关闭(修改配置文件,重启后生效)
vim /etc/selinux/config
# 将SELINUX=enforcing改为SELINUX=disabled
SELINUX=disabled

注:永久关闭 SELinux 需重启服务器生效,若暂时不重启,临时关闭已能满足实操需求。

步骤 3:安装 isc-dhcp-server(CentOS 7 包名:dhcp)

CentOS 7 中,ISC DHCP Server 的软件包名为dhcp,服务名为dhcpd,与 Ubuntu 的isc-dhcp-server略有差异,安装步骤如下:

3.1 安装 dhcp 服务
bash 复制代码
yum install dhcp -y  # -y自动确认安装,无需手动输入y
3.2 验证安装是否成功
bash 复制代码
# 查看dhcp包安装状态
rpm -qa | grep dhcp

输出示例(显示dhcp-4.2.5-82.el7.centos.x86_64即为安装成功):

plaintext 复制代码
dhcp-4.2.5-82.el7.centos.x86_64
dhcp-common-4.2.5-82.el7.centos.x86_64

步骤 4:配置 dhcpd(PXE 场景核心,重点!)

dhcpd 的核心配置文件是/etc/dhcp/dhcpd.conf,默认配置文件仅含注释和示例,建议先备份默认配置,再编写 PXE 专属配置。

4.1 备份默认配置文件
bash 复制代码
cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak  # 备份原始配置,便于回滚
4.2 编辑 PXE 专属 DHCP 配置文件
bash 复制代码
vim /etc/dhcp/dhcpd.conf

清空文件原有内容,写入以下配置(根据实际环境修改括号内参数,关键参数已标注):

dhcp 复制代码
# 1. 全局配置(所有子网通用,优先级低于子网配置)
ddns-update-style none;  # 禁用DNS动态更新,避免网络冲突
default-lease-time 43200;  # 默认IP租期:12小时(单位:秒)
max-lease-time 86400;      # 最大IP租期:24小时(客户端可续租)
log-facility local7;       # 日志输出到/var/log/messages,便于排查问题

# 2. 子网配置(PXE客户端所在网段,核心配置!)
subnet 192.168.1.0 netmask 255.255.255.0 {
  # ---------------- DHCP地址池配置(批量装机的IP资源库)----------------
  range 192.168.1.100 192.168.1.200;  # 地址池范围:100个IP(适配50台设备同时装机)
  option subnet-mask 255.255.255.0;   # 客户端子网掩码
  option routers 192.168.1.1;         # 客户端网关(与DHCP服务器同网段)
  option domain-name-servers 8.8.8.8, 114.114.114.114;  # DNS服务器

  # ---------------- 地址池保护:预留关键IP(避免被动态分配)----------------
  deny duplicates;  # 禁止分配重复IP,防止冲突
  # 预留TFTP服务器IP(PXE核心依赖,必须设为静态IP)
  host tftp-server {
    hardware ethernet 00:0C:29:XX:XX:XX;  # TFTP服务器的MAC地址(用ip link show查看)
    fixed-address 192.168.1.201;          # TFTP服务器的固定IP(排除在地址池外)
  }

  # ---------------- PXE场景特殊配置(灵魂参数,缺一不可!)----------------
  next-server 192.168.1.201;  # 关键:指定TFTP服务器IP(与上面的fixed-address一致)
  filename "pxelinux.0";       # 关键:指定PXE引导文件名(BIOS模式用这个,UEFI用grubnetx64.efi)
}
4.3 关键参数说明(避坑核心)
参数 作用 必须注意的点
range 定义动态 IP 分配范围 需根据最大装机数量规划(如 100 台设备,地址池至少预留 100 个 IP)
option routers 客户端网关 必须与 DHCP 服务器、PXE 客户端在同一网段,否则客户端无法连通 TFTP 服务器
host tftp-server IP 预留 TFTP 服务器 IP 必须固定,且排除在地址池外,避免被动态分配导致 PXE 引导失败
next-server 指向 TFTP 服务器 若 TFTP 与 DHCP 是同一台服务器,可省略(默认使用 DHCP 服务器 IP)
filename PXE 引导文件名称 BIOS 和 UEFI 模式文件名不同,不可混用(BIOS:pxelinux.0;UEFI:grubnetx64.efi)

步骤 5:指定 dhcpd 监听网卡(CentOS 7 专属)

dhcpd 默认监听所有网卡,为避免无关网卡干扰,建议明确指定 PXE 客户端所在的网卡(如ens33):

5.1 编辑 dhcpd 服务配置文件
bash 复制代码
vim /etc/sysconfig/dhcpd
5.2 添加监听网卡配置

在文件末尾添加以下内容(替换为你的网卡名称):

bash 复制代码
DHCPDARGS="ens33"  # 仅监听ens33网卡,其他网卡不响应DHCP请求

步骤 6:启动 dhcpd 服务并设置开机自启

6.1 启动 dhcpd 服务
bash 复制代码
systemctl start dhcpd
6.2 设置开机自启(服务器重启后自动恢复服务)
bash 复制代码
systemctl enable dhcpd
6.3 验证服务状态(关键!确认是否启动成功)
bash 复制代码
systemctl status dhcpd

若输出中显示active (running),且无红色报错,说明服务启动成功:

plaintext 复制代码
● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2024-11-20 20:15:30 CST; 2min 10s ago
     Docs: man:dhcpd(8)
           man:dhcpd.conf(5)
 Main PID: 1234 (dhcpd)
   Status: "Dispatching packets..."
   CGroup: /system.slice/dhcpd.service
           └─1234 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid ens33

三、PXE 场景验证:确保 DHCP 能传递引导信息

服务启动成功后,需通过 3 种方式验证,确保 DHCP 不仅能分配 IP,还能传递next-serverfilename这两个 PXE 核心参数。

验证 1:检查配置文件语法(避免语法错误)

若服务启动失败,先检查配置文件语法是否正确:

bash 复制代码
dhcpd -t -cf /etc/dhcp/dhcpd.conf
  • 输出Syntax: OK:语法正确;
  • 若有报错(如missing semicolon):根据提示修改dhcpd.conf(常见错误:缺少分号、括号不匹配)。

验证 2:查看 dhcpd 日志(排查启动问题)

bash 复制代码
grep dhcpd /var/log/messages
  • 正常日志示例:Listening on LPF/ens33/00:0c:29:xx:xx:xx/192.168.1.0/24(监听成功);
  • 异常日志:若显示no subnet declaration,说明子网配置与网卡 IP 不在同一网段,需修改subnet字段。

验证 3:抓包验证 PXE 引导信息(进阶,确保配置生效)

使用tcpdump抓包,确认 DHCP 响应中包含next-serverfilename参数,这是 PXE 引导的关键。

3.1 安装 tcpdump(抓包工具)
bash 复制代码
yum install tcpdump -y
3.2 监听 DHCP 协议包(UDP 67/68 端口)

运行

bash 复制代码
tcpdump -i ens33 port 67 or port 68 -vv  # 仅监听ens33网卡的DHCP流量
3.3 启动 PXE 客户端,观察抓包结果

找一台同网段的空白客户端(或虚拟机),设置为 "网络启动" 并开机,此时抓包窗口会显示DHCP Offer响应,重点查看是否包含以下内容:

plaintext 复制代码
next-server 192.168.1.201;
filename "pxelinux.0";

若能看到这两个参数,说明 PXE 专属配置已生效,DHCP 服务器能正常传递引导信息。

验证 4:客户端实际测试(最直接)

在 PXE 客户端开机后,通过以下方式确认:

  • 客户端能获取到192.168.1.100-200范围内的 IP;
  • 客户端可 ping 通 DHCP 服务器(ping 192.168.1.200)和 TFTP 服务器(ping 192.168.1.201)。

四、CentOS 7 专属常见问题排查(避坑指南)

问题 1:dhcpd 启动失败,提示 "no subnet declaration for ens33"

  • 原因:dhcpd.conf中的subnet网段与 DHCP 服务器静态 IP 不在同一网段(如服务器 IP 是 192.168.1.200,子网配置写成 192.168.2.0);
  • 解决:修改subnet 192.168.1.0 netmask 255.255.255.0,确保网段与服务器静态 IP 一致。

问题 2:客户端无法获取 IP,抓包看不到 DHCP Offer

  • 原因 1:firewalld 未彻底关闭,拦截了 UDP 67/68 端口;

    解决:重新执行关闭命令:

    复制代码
    systemctl stop firewalld && systemctl disable firewalld
  • 原因 2:SELinux 未关闭,限制了 dhcpd 服务权限;

    解决:临时关闭

    复制代码
    setenforce 0

    ,或永久关闭(修改

    复制代码
    /etc/selinux/config

    后重启服务器);

  • 原因 3:客户端与 DHCP 服务器不在同一网段,且无 DHCP 中继;

    解决:将客户端和服务器放在同一网段,或配置 DHCP 中继(如路由器中继)。

问题 3:服务启动成功,但next-server参数不生效

  • 原因:配置文件语法错误(如缺少分号、MAC 地址格式错误);

    解决:用

    复制代码
    dhcpd -t -cf /etc/dhcp/dhcpd.conf

    检查语法,根据提示修正(如 MAC 地址需为

    复制代码
    xx:xx:xx:xx:xx:xx

    格式)。

五、总结

CentOS 7 部署 dhcpd 的核心是 "静态 IP 打底 + PXE 参数点睛 ":静态 IP 确保 DHCP 服务器地址稳定,next-serverfilename参数是 PXE 引导的关键,地址池配置支撑批量装机需求。本文的配置文件可直接适配 PXE 场景,后续只需搭建 TFTP 服务器并放置pxelinux.0引导文件,即可完成 PXE 引导的 "第一关"。

下一篇将带来 TFTP 服务器的安装配置与引导文件准备,结合本文的 DHCP 服务,实现 PXE 客户端从 "获取 IP" 到 "下载引导文件" 的完整链路。

相关推荐
last demo1 小时前
Linux 正则表达式
linux·mysql·正则表达式
Ghost Face...1 小时前
V4L2架构与硬件适配全解析
linux·架构
繁华似锦respect1 小时前
C++ 设计模式之工厂模式详细介绍
java·linux·c++·网络协议·设计模式
Linux技术芯1 小时前
浅谈scsi协议的命令描述符CDB工作原理
linux
松涛和鸣1 小时前
21、单向链表完整实现与核心技巧总结
linux·c语言·数据结构·算法·链表
人工智能训练1 小时前
Docker中Dify镜像由Windows系统迁移到Linux系统的方法
linux·运维·服务器·人工智能·windows·docker·dify
new_daimond1 小时前
DNS(Domain Name System)详解
运维·网络
君以思为故1 小时前
认识linux -- 进程控制
linux·运维·1024程序员节
乐迪信息2 小时前
乐迪信息:皮带区域安全值守:AI摄像机杜绝煤矿人员闯入
大数据·运维·人工智能·安全·计算机视觉