ITPub博客

首页 > 应用开发 > IT综合 > CentOS 7部署ISC DHCP服务:PXE网络启动完整方案

CentOS 7部署ISC DHCP服务:PXE网络启动完整方案

投稿 IT综合 作者:bhluo 时间:2026-02-02 14:35:49 0 删除 编辑

# CentOS 7部署ISC DHCP服务:PXE网络启动完整方案


## ISC DHCP服务器在PXE环境的核心作用


在PXE网络装机体系中,ISC DHCP服务器承担着双重关键职责:既为客户端分配IP地址等网络参数,又作为PXE引导过程的"指路人",通过next-server和filename参数指引客户端获取引导文件。不同于普通DHCP服务,PXE专用配置需要特别处理DHCP选项扩展,确保客户端能正确识别并获取引导文件。


CentOS 7作为稳定可靠的企业级平台,其EPEL仓库提供的ISC DHCP版本虽非最新,但经过充分测试,与PXE各组件兼容性良好。部署过程中需要重点关注服务配置、防火墙规则和SELinux策略的协调,这是保证PXE正常工作的关键。


```bash

# 检查系统环境与准备工作

cat /etc/centos-release

# 预期输出:CentOS Linux release 7.x


# 确认网络配置

ip addr show

nmcli connection show


# 清理可能存在的旧版本

rpm -qa | grep -E "dhcp|dnsmasq"

yum remove -y dnsmasq* dhcp* 2>/dev/null

```


## ISC DHCP服务器安装与基础配置


### 软件包安装与验证


```bash

# 安装EPEL仓库(如未安装)

yum install -y epel-release

yum makecache fast


# 安装ISC DHCP服务器

yum install -y dhcp-server dhcp-common dhcp-libs


# 验证安装版本

rpm -qi dhcp-server

dhcpd --version

# 输出示例:isc-dhcpd-4.2.5


# 检查关键文件位置

rpm -ql dhcp-server | grep -E "dhcpd.conf|dhcpd.service"

# 关键文件:

# /etc/dhcp/dhcpd.conf          # 主配置文件

# /usr/lib/systemd/system/dhcpd.service  # systemd服务文件

# /var/lib/dhcpd/dhcpd.leases   # 租约数据库

```


### 基础配置文件解析


```bash

# 备份原始配置文件

cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak


# 查看默认配置结构

cat /etc/dhcp/dhcpd.conf | head -30

# 典型结构:

# option domain-name "example.org";

# option domain-name-servers ns1.example.org, ns2.example.org;

# default-lease-time 600;

# max-lease-time 7200;

# authoritative;

# subnet 10.5.5.0 netmask 255.255.255.0 {

#   range 10.5.5.26 10.5.5.30;

# }

```


## PXE专用DHCP配置详解


### 完整配置示例


```bash

# /etc/dhcp/dhcpd.conf - PXE专用完整配置


# 全局配置段

option domain-name "pxe.local";

option domain-name-servers 192.168.1.1, 8.8.8.8;

option routers 192.168.1.1;

default-lease-time 600;

max-lease-time 7200;

authoritative;

log-facility local7;

ddns-update-style none;           # 禁用动态DNS更新

allow booting;                    # 允许PXE引导

allow bootp;                      # 允许bootp协议

one-lease-per-client true;        # 每个客户端一个租约

ping-check true;                  # 防止IP冲突

ping-timeout 2;                   # ping超时时间(秒)


# 主PXE网段定义

subnet 192.168.1.0 netmask 255.255.255.0 {

    range 192.168.1.100 192.168.1.200;        # 地址池范围

    option subnet-mask 255.255.255.0;         # 子网掩码

    option broadcast-address 192.168.1.255;   # 广播地址

    

    # PXE核心配置

    next-server 192.168.1.10;                 # TFTP服务器地址

    filename "pxelinux.0";                    # 引导文件名

    

    # 网络参数

    option routers 192.168.1.1;

    option domain-name-servers 192.168.1.1, 8.8.8.8;

    

    # 租约时间控制

    default-lease-time 1800;      # 30分钟

    max-lease-time 3600;          # 1小时

    

    # 静态地址绑定示例

    host webserver01 {

        hardware ethernet 00:11:22:33:44:55;

        fixed-address 192.168.1.50;

        option host-name "webserver01";

        # 可为此主机指定不同的引导文件

        filename "bios/pxelinux.0";

    }

    

    host uefi-client {

        hardware ethernet AA:BB:CC:DD:EE:FF;

        fixed-address 192.168.1.51;

        # UEFI客户端使用不同的引导文件

        filename "uefi/grubx64.efi";

    }

}


# 多网段支持(DHCP中继场景)

subnet 192.168.2.0 netmask 255.255.255.0 {

    range 192.168.2.100 192.168.2.150;

    option routers 192.168.2.1;

    # 跨网段PXE需指定正确的next-server

    next-server 192.168.1.10;

    filename "pxelinux.0";

}


# 客户端分类配置(按架构区分)

class "LegacyBIOS" {

    match if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00000";

    filename "bios/pxelinux.0";

}


class "UEFI-64" {

    match if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00007";

    filename "uefi/grubx64.efi";

}


class "UEFI-32" {

    match if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00006";

    filename "uefi/grubia32.efi";

}


# 如果不匹配任何类,使用默认引导文件

if not exists vendor-class-identifier {

    filename "bios/pxelinux.0";

}

```


### 配置语法验证


```bash

# 验证配置文件语法

dhcpd -t -cf /etc/dhcp/dhcpd.conf

# 预期输出:Configuration file syntax is OK


# 更详细的验证(显示配置细节)

dhcpd -d -t -cf /etc/dhcp/dhcpd.conf 2>&1 | head -50


# 检查租约数据库文件权限

ls -la /var/lib/dhcpd/

# 如果不存在则创建

touch /var/lib/dhcpd/dhcpd.leases

chown dhcpd:dhcpd /var/lib/dhcpd/dhcpd.leases

chmod 640 /var/lib/dhcpd/dhcpd.leases

```


## 系统集成与服务管理


### 网络接口绑定配置


```bash

# 确定DHCP服务监听的网络接口

ip link show | grep -E "^[0-9]+:" | grep -v lo


# 编辑systemd服务文件,指定监听接口

vi /etc/systemd/system/dhcpd.service.d/override.conf

# 添加以下内容:

[Service]

ExecStart=

ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid eth0


# 或者使用默认配置,在/etc/dhcp/dhcpd.conf中指定接口

# 在配置文件末尾添加:

# subnet 192.168.1.0 netmask 255.255.255.0 { ... }


# 重新加载systemd配置

systemctl daemon-reload


# 创建systemd覆盖目录(如不存在)

mkdir -p /etc/systemd/system/dhcpd.service.d/

```


### SELinux策略调整


```bash

# 检查SELinux状态

getenforce

# 如果为Enforcing模式,需要调整策略


# 查看DHCP相关SELinux策略

sesearch -A -s dhcpd_t | grep -E "tftp|bootp|dhcp"


# 允许dhcpd绑定端口

setsebool -P dhcpd_use_tftp on

setsebool -P dhcpd_use_bootp on


# 如果使用非标准端口,需要添加策略

semanage port -a -t dhcp_port_t -p udp 4011


# 检查TFTP相关策略

setsebool -P tftp_anon_write on

# 如果TFTP目录不在默认位置,需要调整文件上下文

semanage fcontext -a -t tftpdir_t "/opt/tftpboot(/.*)?"

restorecon -Rv /opt/tftpboot

```


### 防火墙配置


```bash

# 开放DHCP服务端口

firewall-cmd --permanent --add-service=dhcp

firewall-cmd --permanent --add-service=dhcpv6

firewall-cmd --permanent --add-service=dhcpv6-client


# 或者手动指定端口

firewall-cmd --permanent --add-port=67/udp

firewall-cmd --permanent --add-port=68/udp


# 如果使用DHCP中继,还需开放相关端口

firewall-cmd --permanent --add-port=69/udp  # TFTP

firewall-cmd --permanent --add-port=4011/udp  # DHCP故障转移


# 重新加载防火墙规则

firewall-cmd --reload


# 验证规则

firewall-cmd --list-all

```


## 服务启动与故障排查


### 服务管理命令


```bash

# 启动DHCP服务

systemctl start dhcpd


# 设置开机自启

systemctl enable dhcpd


# 检查服务状态

systemctl status dhcpd -l


# 查看服务日志

journalctl -u dhcpd -f -n 50


# 重启服务

systemctl restart dhcpd


# 测试服务运行

netstat -tulpn | grep :67

# 应该看到dhcpd监听67端口

```


### 常见故障排查


```bash

# 1. 服务无法启动

# 检查配置文件语法

dhcpd -t


# 检查端口占用

netstat -tulpn | grep :67

ss -tulpn | grep :67


# 如果有冲突,停止其他DHCP服务

systemctl stop dnsmasq

systemctl disable dnsmasq


# 2. 客户端无法获取IP

# 查看服务日志

journalctl -u dhcpd --since "5 minutes ago"


# 使用tcpdump抓包分析

tcpdump -i eth0 -n port 67 or port 68 -vv


# 测试本地DHCP响应

dhcping -c 255.255.255.255 -h 00:11:22:33:44:55 -s 192.168.1.10


# 3. PXE引导失败但能获取IP

# 检查DHCP选项是否正确

# 查看抓包中的DHCP Offer报文

# 确认next-server和filename字段


# 4. 租约文件问题

# 清空租约文件重新测试

echo "" > /var/lib/dhcpd/dhcpd.leases

systemctl restart dhcpd

<"eve.p5k3.org.cn"><"wef.p5k3.org.cn"><"sgv.p5k3.org.cn">

# 5. 网络接口绑定问题

# 确认服务绑定了正确的接口

ps aux | grep dhcpd

# 应该显示监听的接口如eth0

```


### 日志配置与监控


```bash

# 配置详细的DHCP日志

vi /etc/dhcp/dhcpd.conf

# 在全局配置中添加:

log-facility local7;


# 配置rsyslog记录DHCP日志

vi /etc/rsyslog.d/dhcpd.conf

# 添加:

local7.*    /var/log/dhcpd.log


# 重启日志服务

systemctl restart rsyslog


# 实时监控DHCP请求

tail -f /var/log/dhcpd.log | grep -E "DHCPDISCOVER|DHCPOFFER|DHCPREQUEST"


# 监控脚本示例

#!/bin/bash

# monitor_dhcp_traffic.sh


INTERFACE="eth0"

LOG_FILE="/var/log/dhcp_monitor.log"


while true; do

    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

    

    # 捕获DHCP流量统计

    COUNT=$(tcpdump -i $INTERFACE -c 10 'port 67 or port 68' 2>/dev/null | wc -l)

    

    # 检查活跃租约

    LEASES_COUNT=$(cat /var/lib/dhcpd/dhcpd.leases | grep -c "lease")

    

    echo "$TIMESTAMP - DHCP包数: $COUNT, 活跃租约: $LEASES_COUNT" >> "$LOG_FILE"

    

    # 检查异常情况

    if [ $COUNT -gt 100 ]; then

        echo "警告:高频率DHCP请求检测到" >> "$LOG_FILE"

    fi

    

    sleep 60

done

```


## 高级配置与优化


### DHCP故障转移配置


```bash

# 双机热备配置示例

# 主服务器配置 (/etc/dhcp/dhcpd.conf)

failover peer "dhcp-failover" {

    primary;                      # 声明为主服务器

    address 192.168.1.10;        # 本机地址

    port 520;                     # 故障转移通信端口

    peer address 192.168.1.11;   # 对端地址

    peer port 520;

    max-response-delay 60;

    max-unacked-updates 10;

    load balance max seconds 3;

    mclt 3600;

    split 128;                    # 负载分割比例

}


subnet 192.168.1.0 netmask 255.255.255.0 {

    pool {

        failover peer "dhcp-failover";

        range 192.168.1.100 192.168.1.150;

        deny dynamic bootp clients;  # 禁止bootp动态请求

    }

}


# 备用服务器配置

failover peer "dhcp-failover" {

    secondary;                    # 声明为备用服务器

    address 192.168.1.11;

    port 520;

    peer address 192.168.1.10;

    peer port 520;

    max-response-delay 60;

    max-unacked-updates 10;

    load balance max seconds 3;

}

```


### 性能优化参数


```bash

# /etc/dhcp/dhcpd.conf 性能优化


# 调优参数

max-lease-time 1800;              # 缩短租约时间,加快地址回收

default-lease-time 900;

ping-timeout 1;                   # 减少ping超时等待

one-lease-per-client true;        # 防止租约泛滥

update-optimization false;        # 禁用优化(小规模环境)

dynamic-bootp-lease-cutoff never; # 永不过期bootp租约


# 内存优化

lease-file-name "/var/lib/dhcpd/dhcpd.leases";

pid-file-name "/var/run/dhcpd.pid";


# 网络优化

local-port 67;                    # 固定本地端口

local-address 192.168.1.10;      # 绑定特定IP

```


### 安全加固配置


```bash

# DHCP安全配置

# 1. 防止DHCP饥饿攻击

# 限制每个MAC地址的租约数量

deny duplicates;                  # 拒绝重复租约


# 2. 静态地址绑定保护

host trusted-server {

    hardware ethernet 00:11:22:33:44:55;

    fixed-address 192.168.1.50;

    # 使用主机声明保护关键设备

}


# 3. 阻止未知客户端

# 默认拒绝,只允许已知客户端

deny unknown-clients;


# 4. 日志审计增强

log-facility local7;

# 在rsyslog中配置日志轮转和归档


# 5. 限制网络范围

# 只为特定子网提供服务

shared-network "pxe-network" {

    subnet 192.168.1.0 netmask 255.255.255.0 {

        # ... 配置 ...

    }

    # 不配置其他子网

}

```


## PXE环境集成测试


### 端到端测试脚本


```bash

#!/bin/bash

# test_pxe_environment.sh


echo "PXE环境端到端测试"

echo "================="


# 1. 测试DHCP服务

echo "1. 测试DHCP服务..."

systemctl is-active dhcpd

if [ $? -eq 0 ]; then

    echo "✓ DHCP服务运行正常"

    <"hxd.p5k3.org.cn"><"dve.p5k3.org.cn"><"awx.p5k3.org.cn">

    # 测试DHCP响应

    dhcping -c 255.255.255.255 -h 00:11:22:33:44:55 -s 192.168.1.10 -v

else

    echo "✗ DHCP服务未运行"

    exit 1

fi


echo


# 2. 测试TFTP服务

echo "2. 测试TFTP服务..."

systemctl is-active tftp

if [ $? -eq 0 ]; then

    echo "✓ TFTP服务运行正常"

    

    # 测试文件访问

    timeout 5 tftp 192.168.1.10 <<EOF

get pxelinux.0 /tmp/test.pxe

quit

EOF

    

    if [ -f "/tmp/test.pxe" ]; then

        echo "✓ TFTP文件传输正常"

        rm -f /tmp/test.pxe

    else

        echo "✗ TFTP文件传输失败"

    fi

else

    echo "✗ TFTP服务未运行"

fi


echo


# 3. 测试HTTP服务(Kickstart/Preseed)

echo "3. 测试HTTP服务..."

curl -I http://192.168.1.10/ks/centos7.cfg 2>/dev/null | head -1

if [ $? -eq 0 ]; then

    echo "✓ HTTP服务访问正常"

else

    echo "✗ HTTP服务访问失败"

fi


echo


# 4. 网络连通性测试

echo "4. 网络连通性测试..."

ping -c 3 192.168.1.10 > /dev/null

if [ $? -eq 0 ]; then

    echo "✓ 网络连通正常"

else

    echo "✗ 网络连通失败"

fi


echo


# 5. 防火墙检查

echo "5. 防火墙规则检查..."

firewall-cmd --list-ports | grep -q "67/udp"

if [ $? -eq 0 ]; then

    echo "✓ DHCP端口已开放"

else

    echo "✗ DHCP端口未开放"

fi


echo

echo "测试完成"

```


### 客户端模拟测试


```bash

# 使用虚拟机或物理机测试

# 准备测试客户端配置文件


# 创建测试虚拟机配置

cat > /tmp/test-pxe-vm.xml << EOF

<domain type='kvm'>

    <name>pxe-test-client</name>

    <memory unit='KiB'>1048576</memory>

    <vcpu placement='static'>2</vcpu>

    <os>

        <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>

        <boot dev='network'/>  <!-- 网络启动优先 -->

        <boot dev='hd'/>

    </os>

    <devices>

        <interface type='network'>

            <mac address='52:54:00:12:34:56'/>  <!-- 测试MAC -->

            <source network='default'/>

            <model type='virtio'/>

        </interface>

        <serial type='pty'>

            <target port='0'/>

        </serial>

        <console type='pty'>

            <target type='serial' port='0'/>

        </console>

    </devices>

</domain>

EOF


# 定义并启动测试虚拟机

virsh define /tmp/test-pxe-vm.xml

virsh start pxe-test-client


# 监控启动过程

virsh console pxe-test-client


# 测试完成后清理

virsh destroy pxe-test-client

virsh undefine pxe-test-client

```


通过以上完整配置和详细步骤,可以在CentOS 7系统上部署稳定可靠的ISC DHCP服务器,为PXE网络装机提供坚实的基础服务。关键是要理解每个配置参数的含义,根据实际网络环境进行调整,并通过系统化的测试确保各组件协同工作。遇到问题时,按照排查步骤逐步分析,通常能够快速定位并解决问题。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3109723/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    934329