DHCP (Dynamic Host Configuration Protocol) 动态主机配置协议,用于自动为网络中的客户端分配 IP 地址、子网掩码、网关、DNS 等网络参数,这在网络管理中非常普遍,可以大大简化客户端的配置工作。

本教程将涵盖以下内容:
- 环境准备:确保网络和主机名正确。
- 安装 DHCP 软件包。
- 配置 DHCP 服务器:核心配置文件详解和示例。
- 启动并启用 DHCP 服务。
- 配置防火墙和 SELinux:这是在 CentOS 7 上非常重要的一步。
- 客户端测试:验证 DHCP 服务器是否正常工作。
- 常见问题排查。
环境准备
我们需要一个清晰的实验环境,假设我们的网络环境如下:
- DHCP 服务器 IP:
168.1.100(此 IP 需要是静态的) - 服务器主机名:
dhcp-server.example.com - 网络接口:
eth0 - 网络地址:
168.1.0 - 子网掩码:
255.255.0(或/24) - 可用 IP 地址池:
168.1.150到168.1.200 - 网关:
168.1.1 - DNS 服务器:
8.8.8和8.4.4 - 租约时间: 默认 1 天 (86400 秒),最大 3 天 (259200 秒)
步骤 1: 设置静态 IP 地址
确保你的 DHCP 服务器有一个静态的 IP 地址,编辑网络配置文件:

# 编辑网络配置文件,文件名可能因系统而异, ens33 是常见虚拟机网卡名 vi /etc/sysconfig/network-scripts/ifcfg-eth0
确保配置如下:
TYPE=Ethernet BOOTPROTO=static # 关键:设置为静态,而不是 dhcp 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 NAME=eth0 UUID=... DEVICE=eth0 ONBOOT=yes # 关键:确保开机自启 # --- 添加以下静态配置 --- IPADDR=192.168.1.100 PREFIX=24 GATEWAY=192.168.1.1 DNS1=8.8.8.8 DNS2=8.8.4.4
保存文件后,重启网络服务使配置生效:
nmcli connection down eth0 && nmcli connection up eth0 # 或者使用传统命令 ifdown eth0 && ifup eth0
步骤 2: 更新系统
sudo yum update -y
安装 DHCP 软件包
CentOS 7 的软件仓库中包含了 dhcp 软件包。

sudo yum install -y dhcp
安装完成后,DHCP 的主配置文件位于 /etc/dhcp/dhcpd.conf,默认情况下,这个文件可能包含一些示例配置或被注释掉了,我们需要对其进行修改。
配置 DHCP 服务器
这是最核心的一步,我们将编辑 /etc/dhcp/dhcpd.conf 文件。
步骤 1: 备份原配置文件
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
步骤 2: 编辑配置文件
sudo vi /etc/dhcp/dhcpd.conf
清空文件中的所有内容(如果存在),然后粘贴以下配置,下面的配置包含了我们之前规划的所有信息,并附有详细的注释。
# 默认租约时间,单位是秒
default-lease-time 86400;
# 最大租约时间,单位是秒
max-lease-time 259200;
# 日志记录级别,7 为最详细,0 为不记录
# debug-file /var/log/dhcpd.log;
# log-facility local7;
# 指定 DHCP 服务器监听的网卡,如果注释掉,它会监听所有活动的非回环接口。
# 如果服务器有多个网卡,建议指定,避免错误地分配 IP。
# ddns-update-style interim;
# ignore client-updates;
# 定义一个子网配置
subnet 192.168.1.0 netmask 255.255.255.0 {
# 为这个子网分配的网关
option routers 192.168.1.1;
# 为这个子网分配的 DNS 服务器
option domain-name-servers 8.8.8.8, 8.8.4.4;
# 定义 IP 地址池,从 192.168.1.150 到 192.168.1.200
range 192.168.1.150 192.168.1.200;
# 可选:为特定主机(通过 MAC 地址)分配固定 IP
# host printer {
# hardware ethernet 00:1A:2B:3C:4D:5E;
# fixed-address 192.168.1.210;
# }
# 可选:为特定子网设置不同的租约时间
# default-lease-time 3600;
# max-lease-time 7200;
}
# 定义另一个子网(可选示例)
# subnet 10.10.0.0 netmask 255.255.0.0 {
# option routers 10.10.0.1;
# option domain-name-servers 1.1.1.1;
# range 10.10.0.100 10.10.0.200;
# }
配置详解:
default-lease-time: 客户端在没有请求特定租约时间的情况下获得的默认租约时长。max-lease-time: 客户端可以请求的最长租约时长。subnet ... { ... }: 定义一个 IP 子网,所有在此块内的配置都只对这个子网有效。option routers: 指定客户端的默认网关。option domain-name-servers: 指定客户端的 DNS 服务器,可以多个,用逗号隔开。range: 定义动态分配的 IP 地址池范围。host ... { ... }: 用于为特定设备分配固定的 IP 地址,需要知道设备的 MAC 地址。
启动并启用 DHCP 服务
配置完成后,我们启动 dhcpd 服务,并设置为开机自启。
# 启动 DHCP 服务 sudo systemctl start dhcpd # 设置开机自启 sudo systemctl enable dhcpd
检查服务状态,确保它正在运行并且没有错误:
sudo systemctl status dhcpd
如果看到 active (running) 并且没有红色的错误信息,说明服务启动成功,如果启动失败,请仔细检查 /etc/dhcp/dhcpd.conf 文件的语法。
配置防火墙和 SELinux
这是在 CentOS 7 上最容易被忽略但又至关重要的一步,如果配置不当,客户端将无法获取到 IP 地址。
步骤 1: 配置防火墙
DHCP 服务使用 UDP 端口 67 (服务器) 和 68 (客户端),我们需要在防火墙中允许这些端口。
# 添加永久规则 sudo firewall-cmd --permanent --add-service=dhcp # 重新加载防火墙使规则生效 sudo firewall-cmd --reload
步骤 2: 配置 SELinux
SELinux 默认的策略可能会阻止 DHCP 服务绑定到网络接口,我们需要为它设置一个布尔值来允许这种行为。
# 检查当前布尔值状态 semanage boolean -l | grep dhcpd # 启用允许 dhcpd 在非标准接口上运行的布尔值 sudo setsebool -P dhcpd_anon_write on
注意:
-P参数会永久保存该设置,重启后仍然有效。
客户端测试
配置已经完成,让我们来测试一下。
方法一: 在同一台服务器上测试
你可以临时将服务器的网络配置改回 DHCP 模式,然后看它是否能从自己获取到 IP。
# 临时修改为 DHCP 模式 sudo nmcli connection modify eth0 ipv4.method auto # 重启网络连接 sudo nmcli connection down eth0 && sudo nmcli connection up eth0 # 使用 ip addr 或 ifconfig 查看是否获取到了 192.168.1.x 网段的 IP ip addr show eth0
获取到 IP 后,可以查看租约信息:
# 查看 /var/lib/dhcpd/dhcpd.leases 文件 sudo cat /var/lib/dhcpd/dhcpd.leases
你会看到客户端的 MAC 地址、获取到的 IP 地址、租约开始和结束时间等信息。
方法二: 在另一台设备上测试
将另一台电脑(Windows 或虚拟机)连接到同一个局域网,并将其网络设置设置为“自动获取 IP 地址”,如果一切配置正确,它应该能成功从你的 CentOS 7 DHCP 服务器获取到 IP 地址。
常见问题排查
如果客户端无法获取 IP,请按以下顺序排查:
-
检查服务状态:
sudo systemctl status dhcpd
查看
journalctl -xe或/var/log/messages中是否有错误信息,最常见的错误是配置文件语法错误。 -
检查配置文件语法:
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
如果没有输出,说明语法正确,如果有错误,它会告诉你哪一行有问题。
-
检查防火墙:
sudo firewall-cmd --list-all
确认
dhcp服务在允许列表中。 -
检查 SELinux: 如果怀疑是 SELinux 的问题,可以临时将其设置为
Permissive模式(只记录警告,不阻止)来测试:sudo setenforce 0
如果此时客户端能成功获取 IP,那么几乎可以肯定是 SELinux 策略的问题,请确保之前执行了
setsebool命令。 -
检查网络接口: 确保你的 DHCP 服务器和客户端在同一个网段,并且物理/虚拟网络连接正常。
-
检查日志文件:
/var/log/messages: 系统主日志,记录了大部分服务的启动和运行信息。/var/log/dhcpd.log: 如果你开启了debug-file,DHCP 的详细日志会在这里。
通过以上步骤,你应该就能成功地在 CentOS 7 上搭建并运行一个功能完善的 DHCP 服务器了。
