概述
DHCP (Dynamic Host Configuration Protocol) 动态主机配置协议,用于自动为网络中的客户端分配 IP 地址、子网掩码、网关、DNS 等网络参数,在 Linux 上,最常用的 DHCP 服务器软件是 ISC DHCP Server。

本教程将涵盖:
- 安装 DHCP 服务器软件
- 配置核心文件 (
dhcpd.conf) - 启动和管理 DHCP 服务
- 客户端测试
- 排错与常见问题
第一步:安装 DHCP 服务器
你需要在你的 Linux 服务器上安装 isc-dhcp-server (Debian/Ubuntu) 或 dhcp (CentOS/RHEL)。
对于 Debian / Ubuntu 系统
# 更新软件包列表 sudo apt update # 安装 ISC DHCP Server sudo apt install isc-dhcp-server
安装过程中,它可能会提示你选择一个网络接口来监听 DHCP 请求,你应该选择连接到你的 局域网 的接口(eth0, ens33),如果你不确定,可以先不选,稍后在配置文件中指定。
对于 CentOS / RHEL / Rocky Linux / AlmaLinux 系统
# 首先确保 EPEL 仓库已启用 sudo dnf install epel-release # 安装 DHCP 服务器 sudo dnf install dhcp
在 CentOS/RHEL 系统上,安装完成后,主配置文件 /etc/dhcp/dhcpd.conf 可能是一个模板文件,你需要备份并清空它,然后创建自己的配置。

第二步:配置 DHCP 服务器
这是最关键的一步,配置文件的主要位置是:
- Debian/Ubuntu:
/etc/dhcp/dhcpd.conf - CentOS/RHEL:
/etc/dhcp/dhcpd.conf
备份原始配置文件
# Debian/Ubuntu sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig # CentOS/RHEL sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig
编辑配置文件
使用你喜欢的文本编辑器(如 nano 或 vim)打开配置文件:
sudo nano /etc/dhcp/dhcpd.conf
清空文件内容(如果存在模板),并粘贴以下示例配置。请务必根据你的网络环境修改参数。
示例配置 (dhcpd.conf)
# 标准配置头
# 告诉服务器它不是权威的 DNS 服务器
# 对于家庭/办公室网络,这通常可以忽略或设为 'false'
# authoritative;
# 定义一个共享网络配置块
# '192.168.1.0' 是你的局域网网络地址
# 'netmask 255.255.255.0' 是子网掩码
subnet 192.168.1.0 netmask 255.255.255.0 {
# --- 可分配的 IP 地址范围 ---
# range 起始IP 结束IP;
# 注意:起始和结束 IP 应该在你的网络范围内,并且不要与服务器、路由器或其他静态设备的 IP 冲突。
range 192.168.1.100 192.168.1.200;
# --- 默认网关 ---
# option routers 路由器IP;
option routers 192.168.1.1;
# --- DNS 服务器 ---
# option domain-name-servers DNS服务器IP1, DNS服务器IP2;
# 通常使用你的路由器地址或公共 DNS,如 8.8.8.8
option domain-name-servers 8.8.8.8, 1.1.1.1;
# --- 域名 ---
# option domain-name "yourdomain.local";
# 这会给客户端设置默认域名,可选
# --- IP 地址租约时间 ---
# default-lease-time 600; # 默认租约时间(秒)
# max-lease-time 7200; # 最大租约时间(秒)
# 默认租1小时,最大租2小时
default-lease-time 3600;
max-lease-time 7200;
# --- 为特定主机分配固定 IP (可选) ---
# 使用客户端的 MAC 地址来绑定一个固定的 IP 地址
# host my-printer {
# hardware ethernet 00:11:22:33:44:55; # 打印机的 MAC 地址
# fixed-address 192.168.1.10; # 分配给它的固定 IP
# }
}
配置参数详解
subnet: 定义一个 DHCP 作用域,你需要指定你的网络地址和子网掩码。range: 定义可以动态分配的 IP 地址池。option routers: 指定客户端的默认网关。option domain-name-servers: 指定客户端的 DNS 服务器。default-lease-time: 客户端在没有请求续约的情况下,可以使用该 IP 地址的默认时间。max-lease-time: 客户端可以获得的最长租约时间。host: 用于为特定设备(通过其 MAC 地址)分配一个固定的、永久的 IP 地址,这被称为 DHCP 保留 或 静态绑定。
第三步:启动和管理 DHCP 服务
指定监听的网络接口
DHCP 服务器需要知道在哪个网络接口上监听客户端的请求。

-
Debian/Ubuntu: 编辑
/etc/default/isc-dhcp-server文件:sudo nano /etc/default/isc-dhcp-server
找到
INTERFACESv4=""这一行,将其修改为你的 LAN 接口名称:INTERFACESv4="eth0" # 或者可能是 ens33, br0 等
-
CentOS/RHEL: 编辑
/etc/sysconfig/dhcpd文件:sudo nano /etc/sysconfig/dhcpd
找到
DHCPDARGS=这一行,可以指定接口,DHCPDARGS=eth0 # 或者可以指定多个接口:DHCPDARGS="eth0 eth1"
启动并启用服务
你可以启动 DHCP 服务,并设置为开机自启。
-
对于使用
systemd的系统 (现代的 Debian, Ubuntu, CentOS, RHEL 等):# 启动服务 sudo systemctl start isc-dhcp-server # Debian/Ubuntu sudo systemctl start dhcpd # CentOS/RHEL # 设置开机自启 sudo systemctl enable isc-dhcp-server # Debian/Ubuntu sudo systemctl enable dhcpd # CentOS/RHEL
检查服务状态
# 查看服务是否正在运行 sudo systemctl status isc-dhcp-server # Debian/Ubuntu sudo systemctl status dhcpd # CentOS/RHEL # 查看详细的日志,这对于排错至关重要 # 在 Debian/Ubuntu 上 sudo journalctl -u isc-dhcp-server -f # 在 CentOS/RHEL 上 sudo journalctl -u dhcpd -f
第四步:客户端测试
你可以用另一台连接到同一网络的设备来测试了。
-
Windows 客户端:
- 打开命令提示符 (
cmd)。 - 运行
ipconfig /release(如果之前有 IP)。 - 运行
ipconfig /renew。 - 再次运行
ipconfig,检查获取到的 IP 地址是否在你配置的168.1.100到168.1.200范围内,网关和 DNS 是否正确。
- 打开命令提示符 (
-
Linux/macOS 客户端:
- 打开终端。
- 如果使用
dhclient(常见于 Linux),可以运行:sudo dhclient -r # 释放当前 IP sudo dhclient # 重新获取 IP
- 使用
ip a或ifconfig命令检查网络接口获取到的 IP 信息。
第五步:排错与常见问题
如果客户端无法获取到 IP,请按以下步骤排查:
-
检查 DHCP 服务状态:
sudo systemctl status isc-dhcp-server
确保服务是
active (running)状态。 -
检查日志文件:
- Debian/Ubuntu:
sudo journalctl -u isc-dhcp-server - CentOS/RHEL:
sudo journalctl -u dhcpd - 通用日志位置:
/var/log/syslog(Debian/Ubuntu) 或/var/log/messages(CentOS/RHEL)。 日志中会明确指出错误原因, No free leases on subnet...: IP 地址池已用完。No subnet declaration for...: 配置文件中缺少对应网络的subnet块。Not configured to listen on any interfaces...: 监听的接口配置错误。
- Debian/Ubuntu:
-
检查网络接口配置:
- 确保你在
/etc/default/isc-dhcp-server或/etc/sysconfig/dhcpd中指定的接口名称是正确的,并且该接口是UP状态。 - 使用
ip a命令查看所有网络接口及其状态。
- 确保你在
-
检查防火墙: 防火墙可能会阻止 DHCP 通信(UDP 端口 67 和 68),如果你启用了防火墙,需要允许这些端口。
- 使用
ufw(Ubuntu):sudo ufw allow 67/udp # DHCP Server sudo ufw allow 68/udp # DHCP Client
- 使用
firewalld(CentOS/RHEL):sudo firewall-cmd --permanent --add-service=dhcp sudo firewall-cmd --reload
- 使用
-
检查 IP 地址冲突: 确保你的 DHCP 范围 (
168.1.100-200) 中的 IP 没有被服务器、路由器或其他设备静态使用,可以使用ping命令测试范围内的 IP 是否已被占用。 -
检查配置文件语法: 在重启服务前,可以检查配置文件的语法是否正确。
- Debian/Ubuntu:
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
如果没有输出,则语法正确,如果有错误,会提示具体位置。
- CentOS/RHEL:
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
- Debian/Ubuntu:
通过以上步骤,你应该能够成功地在 Linux 服务器上部署并运行一个功能完善的 DHCP 服务器。
