下面我将以 Ubuntu Server 22.04 为例,提供一个详细、分步的 DHCP 服务器配置指南,这个过程同样适用于其他基于 Debian 的系统,如 CentOS/RHEL(需要安装 dhcp 包而非 isc-dhcp-server)。

第一步:环境准备
-
虚拟机软件:确保你已安装虚拟机软件,如 VMware Workstation, VirtualBox, Hyper-V 等。
-
虚拟机操作系统:创建并安装一台虚拟机,操作系统推荐使用 Ubuntu Server 或 CentOS/RHEL,本教程以 Ubuntu Server 22.04 为例。
-
网络模式:这是最关键的一步!为了使虚拟机能作为局域网内的 DHCP 服务器,虚拟机的网络模式必须设置为 桥接模式。
- 为什么是桥接模式?
- NAT 模式:虚拟机通过宿主机共享一个 IP 地址访问外网,宿主机充当路由器,虚拟机无法直接与局域网内的其他设备通信,也无法为它们分配 IP。
- 桥接模式:虚拟机的虚拟网卡直接连接到你物理机的物理网卡上,相当于在局域网中增加了一台独立的计算机,这样,DHCP 服务器就能为局域网内(包括宿主机本身)的其他设备分配 IP 地址。
- 为什么是桥接模式?
-
获取静态 IP 地址:在配置 DHCP 服务器之前,服务器自身必须拥有一个固定的、静态的 IP 地址,因为它需要作为网络中的“权威”来分配地址。
(图片来源网络,侵删)
第二步:在虚拟机中配置静态 IP
-
查看网络接口名称:
ip a
你会看到一个类似
eth0,ens33,enp0s3的网络接口名称,我们假设它是ens33。 -
编辑 Netplan 配置文件: 在 Ubuntu 20.04 及更高版本中,使用 Netplan 进行网络配置,配置文件通常位于
/etc/netplan/目录下。ls /etc/netplan/
你可能会看到一个类似
01-network-manager-all.yaml或50-cloud-init.yaml的文件。 -
修改配置文件: 使用
vim或nano编辑该文件。sudo nano /etc/netplan/50-cloud-init.yaml
可能如下:
# This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-init's # network configuration capabilities, write a file # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: # network: {config: disabled} network: ethernets: ens33: dhcp4: true # 将 dhcp4: true 改为 dhcp4: false optional: true version: 2修改为静态 IP 地址配置,如果你的局域网网段是
168.1.0/24,你可以这样设置:network: ethernets: ens33: addresses: [192.168.1.100/24] # DHCP 服务器自身的 IP 地址 gateway4: 192.168.1.1 # 局域网的网关地址 nameservers: addresses: [8.8.8.8, 1.1.1.1] # DNS 服务器地址 dhcp4: false # 禁用 DHCP,使用静态 IP version: 2 -
应用配置: 保存文件后,运行以下命令使配置生效:
sudo netplan apply
验证 IP 地址是否已正确设置:
ip a show ens33
应该能看到
168.1.100这个地址。
第三步:安装 DHCP 服务器软件
在 Ubuntu 上,DHCP 服务器软件包是 isc-dhcp-server。
sudo apt update sudo apt install isc-dhcp-server -y
安装完成后,服务会自动启动,我们可以检查其状态:
sudo systemctl status isc-dhcp-server
第四步:配置 DHCP 服务器
这是核心步骤,配置文件位于 /etc/dhcp/dhcpd.conf。
-
备份原始配置文件: 这是一个好习惯。
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
-
编辑配置文件:
sudo nano /etc/dhcp/dhcpd.conf
文件中充满了大量注释和示例,为了清晰,我们可以将其清空,然后添加我们自己的配置,或者,直接在文件末尾添加我们的配置段落。
一个典型的配置如下:
# 默认配置文件被注释掉了,我们在这里添加我们的配置 # 指定 DNS 服务器地址 option domain-name-servers 8.8.8.8, 1.1.1.1; # 指定租约时间,格式为:天,小时,分钟,秒 default-lease-time 600; max-lease-time 7200; # 声明我们正在为哪个网络范围提供服务 # subnet <网络地址> netmask <子网掩码> subnet 192.168.1.0 netmask 255.255.255.0 { # 指定网关地址 option routers 192.168.1.1; # 指定 DHCP 服务器的 IP 地址 # 客户端会从这里获取配置文件 option domain-name "localdomain"; # 定义可分配的 IP 地址池 range 192.168.1.101 192.168.1.200; }配置解释:
subnet 192.168.1.0 netmask 255.255.255.0:声明这个 DHCP 服务器管理的是168.1.0这个网段,请根据你的实际网络修改。option routers 192.168.1.1:告诉客户端默认网关的地址。option domain-name-servers ...:告诉客户端 DNS 服务器的地址。range 192.168.1.101 192.168.1.200:这是 DHCP 服务器可以动态分配的 IP 地址范围,从.101到.200。
-
(可选)配置 DHCP 服务监听的接口 默认情况下,
isc-dhcp-server会监听所有接口,为了更安全,可以指定它只在我们的ens33接口上工作。 编辑/etc/default/isc-dhcp-server文件:sudo nano /etc/default/isc-dhcp-server
找到
INTERFACESv4=""这一行,修改为:INTERFACESv4="ens33"
同样,将
INTERFACESv6保持为空或注释掉。
第五步:启动并测试 DHCP 服务
-
重启 DHCP 服务:
sudo systemctl restart isc-dhcp-server
-
检查服务状态:
sudo systemctl status isc-dhcp-server
确保状态为
active (running)。 -
查看日志: 如果服务启动失败,日志是最好的排错工具。
# 查看实时日志 sudo journalctl -u isc-dhcp-server -f # 或者查看 dhcpd 的日志文件 tail -f /var/log/syslog | grep dhcpd
常见错误:
No subnet declaration for ...:检查/etc/dhcp/dhcpd.conf中的subnet声明是否正确,IP 地址和子网掩码是否与你的网络匹配。Unable to start daemon:通常是配置文件语法错误,可以用dhcpd -t检查语法。
第六步:测试 DHCP 功能
让我们用另一台设备来测试 DHCP 服务器是否工作正常。
-
测试设备:
- 另一台虚拟机:创建一台新的虚拟机,同样设置为桥接模式,并启用 DHCP 客户端。
- 你的物理机(宿主机):暂时断开物理机的网络,或者将网络适配器设置为“自动获取 IP 地址”(DHCP)。
- 你的手机/笔记本:连接到同一个局域网 Wi-Fi。
-
获取 IP 地址: 在测试设备上,执行“释放并更新”IP 地址的操作,在 Windows 上是
ipconfig /releaseipconfig /renew;在 Linux 上是sudo dhclient eth0。 -
检查结果:
- 在测试设备上,查看其 IP 地址,它应该从你配置的
168.1.101到168.1.200这个范围内获取到一个地址。 - 在你的 DHCP 服务器虚拟机上,可以查看租约文件来确认:
cat /var/lib/dhcp/dhcpd.leases
你应该能看到类似下面的内容,表示已经成功分配了一个租约:
lease 192.168.1.101 { starts 4 2025/10/27 10:00:00; ends 4 2025/10/27 12:00:00; hardware ethernet 00:0c:29:xx:xx:xx; // 测试设备的 MAC 地址 uid 01:00:0c:29:xx:xx:xx; }
- 在测试设备上,查看其 IP 地址,它应该从你配置的
常见问题与排错
-
问题:测试设备获取不到 IP。
- 排查:
- 确认虚拟机是桥接模式。
- 确认 DHCP 服务器自身有静态 IP,且与分配的网段在同一个子网。
- 检查防火墙(
ufw),确保dhcp服务端口(UDP 67)是开放的。isc-dhcp-server会自动处理,但可以手动检查:sudo ufw status。 - 检查
/etc/dhcp/dhcpd.conf的语法:sudo dhcpd -t。 - 检查
/var/log/syslog或journalctl中的错误信息。
- 排查:
-
问题:分配的 IP 地址不是我期望的。
- 排查:检查
dhcpd.conf文件中的range配置是否正确。
- 排查:检查
-
问题:IP 地址冲突。
- 排查:确保局域网内没有其他设备(如路由器)也在运行 DHCP 服务,并且没有静态配置了你 DHCP 范围内的 IP 地址。
恭喜!你已经成功在虚拟机上配置了一台功能完备的 DHCP 服务器。
