DHCP 服务器总结:概念、原理与实验详解
✅ 手动配置 DHCP 服务器并分配动态 IP 范围✅ 客户端通过 DHCP 自动获取 IP、网关、DNS✅ 基于 MAC 地址的固定 IP 绑定✅ 跨网段 DHCP 中继的搭建(dhcrelay 方式)✅ 轻量级 dnsmasq 实现 DHCP 服务和中继这些技能在实际网络运维、虚拟化环境、私有云部署中非常实用。建议读者结合抓包工具(如 tcpdump)观察 DHCP 四个阶段的报文交互,加深理
DHCP 服务器总结:概念、原理与实验详解
一、传统网络配置的痛点
在没有 DHCP 之前,每台计算机需要手动配置以下参数:
- IP 地址
- 子网掩码
- 默认网关
- DNS 服务器
手动配置存在诸多问题:
- 效率低下:大规模网络部署时,逐台配置耗时费力
- 容易出错:IP 冲突、子网掩码错误等常见问题
- 管理困难:当网络拓扑变化(如更换网关)时,所有设备需要重新配置
- 地址浪费:用户离开后 IP 无法自动回收
二、DHCP 基本概念
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是一种网络协议,用于自动为网络设备分配 IP 地址及其他网络参数。
核心特点:
- 统一管理:IP 地址从服务器地址池中分配,服务器记录并维护 IP 使用状态
- 短期租约:IP 地址有使用期限(租约),到期可续约或回收,有效提高地址利用率
三、DHCP 工作原理(四个阶段)
客户端 DHCP服务器
| |
|--- DHCPDISCOVER (广播) --->|
| |
|<--- DHCPOFFER (单播/广播) --|
| |
|--- DHCPREQUEST (广播) ---->|
| |
|<--- DHCPACK (单播/广播) ----|
3.1 发现阶段(Discover)
客户端发送 DHCPDISCOVER 广播包(目标 255.255.255.255),寻找可用的 DHCP 服务器。
注意:路由器默认不转发广播包,因此 DHCP 服务器通常需要与客户端在同一物理网络,或配置 DHCP 中继代理。
3.2 提供阶段(Offer)
DHCP 服务器收到 Discover 后,响应 DHCPOFFER 包,包含:
- 可分配的 IP 地址
- 租约期限
- 网关、DNS 等参数
3.3 请求阶段(Request)
客户端可能收到多个 Offer,它广播发送 DHCPREQUEST,明确告知所有服务器自己接受了哪个服务器的 IP。
思考:为什么需要广播发送 Request?
因为网络中可能有多个 DHCP 服务器,广播可让其他未被选中的服务器释放已预留的 IP 资源。同时,Request 中会携带被选中服务器的 IP 地址。
3.4 确认阶段(Acknowledge)
被选中的 DHCP 服务器响应 DHCPACK,确认 IP 正式分配给该客户端,直到租约到期。
四、租约更新与重绑定机制
DHCP 租用 IP 后并非永久使用,客户端需在租期到达前续约:
- 50% 租期时:客户端尝试向原 DHCP 服务器单播续约(发送 DHCPREQUEST)
- 87.5% 租期时:若原服务器无响应,客户端广播 DHCPREQUEST,任意 DHCP 服务器都可回应,该过程称为 重绑定
- 租约到期后:必须重新走完整的 Discover → Offer → Request → ACK 流程
五、多 DHCP 服务器场景
虽然 DHCP 支持同一物理网络多台服务器,但不建议这样做,可能引发问题:
- 客户端发出 Discover 后可能收到多个 Offer,只接受其中一个,其他服务器释放预留 IP
- 权威服务器(Authoritative)与非权威服务器的行为差异:
- 非权威服务器:收到未知 IP 地址的 Request 时忽略
- 权威服务器:若客户端请求的 IP 在其管理范围内但服务器不认识该 IP,则回复 DHCPNAK 拒绝,客户端必须重新申请
- 默认配置下 DHCP 服务器为非权威,防止误抢地址
六、DHCP 服务器部署实验
6.1 实验环境规划
| 节点名称 | 节点IP | 作用 |
|---|---|---|
| dhcp-server | 10.1.8.10/24 | DHCP 服务器(静态IP) |
| dhcp-client1(普通员工) | 自动获取随机IP | DHCP 客户端 |
| dhcp-client2(经理) | 固定IP 10.1.8.88 | DHCP 客户端(MAC绑定) |
服务器必须使用静态 IP,不能自动获取。
6.2 DHCP 服务器配置步骤
步骤1:设置静态 IP(以 CentOS 7 为例)
# 修改 ens33 网卡为手动配置,分配静态 IP 10.1.8.10/24
[root@localhost ~]# nmcli connection modify ens33 \
ipv4.method manual \
ipv4.addresses 10.1.8.10/24 \
ipv4.gateway 10.1.8.2 \
ipv4.dns 10.1.8.2 \
autoconnect yes
# 激活网卡配置
[root@localhost ~]# nmcli connection up ens33
# 修改主机名
[root@localhost ~]# hostnamectl set-hostname dhcp-server
步骤2:安装 DHCP 软件包
# 安装 dhcp 服务
[root@dhcp-server ~]# yum install -y dhcp
步骤3:配置防火墙
# 放行 dhcp 服务(firewalld 会开放 UDP 67 端口)
[root@dhcp-server ~]# firewall-cmd --add-service=dhcp
[root@dhcp-server ~]# firewall-cmd --add-service=dhcp --permanent
步骤4:编辑 DHCP 主配置文件 /etc/dhcp/dhcpd.conf
DHCP 软件包提供了一个示例配置文件,参考后按需修改。
# 查看示例文件位置
[root@dhcp-server ~]# cat /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example
以下是一个典型的基础配置(追加到 /etc/dhcp/dhcpd.conf 末尾):
# /etc/dhcp/dhcpd.conf 基础配置示例
# 注意:subnet 的网段必须与服务器的网卡所在网段一致(这里是 10.1.8.0/24)
subnet 10.1.8.0 netmask 255.255.255.0 {
# DHCP 自动分配的 IP 范围:101 ~ 130,共 30 个地址
range 10.1.8.101 10.1.8.130;
# 分配给客户端的 DNS 服务器(阿里云公共 DNS)
option domain-name-servers 223.5.5.5;
# 内网域名后缀(通常用于内网解析,一般可忽略)
option domain-name "laogao.cloud";
# 默认网关,确保客户端能上网
option routers 10.1.8.2;
# 广播地址,ARP/DHCP 依赖它
option broadcast-address 10.1.8.255;
# 默认租约时间:600 秒 = 10 分钟
default-lease-time 600;
# 最大租约时间:7200 秒 = 2 小时
max-lease-time 7200;
}
步骤5:验证配置并启动服务
# 检查配置文件语法是否正确
[root@dhcp-server ~]# dhcpd -t
# 若输出 "Configuration file syntax OK" 则正常
# 启用并启动 dhcpd 服务
[root@dhcp-server ~]# systemctl enable dhcpd --now
# 查看服务状态
[root@dhcp-server ~]# systemctl status dhcpd
6.3 DHCP 客户端配置(普通员工)
# 在客户端机器上,添加一个自动获取 IP 的连接
[root@dhcp-client1 ~]# nmcli connection add con-name dhcp-client1 \
type ethernet ipv4.method auto ifname ens33
# 激活该连接
[root@dhcp-client1 ~]# nmcli connection up dhcp-client1
# 验证是否成功获取 IP(观察动态分配的 IP)
[root@dhcp-client1 ~]# ip addr show ens33
# 示例输出:
# inet 10.1.8.102/24 brd 10.1.8.255 scope global dynamic ens33
# valid_lft 550sec preferred_lft 550sec
# 手动释放 IP(测试续约流程)
[root@dhcp-client1 ~]# dhclient -r
# 重新获取 IP
[root@dhcp-client1 ~]# dhclient
6.4 固定 IP 绑定(经理专用)
通过 host 声明,将 MAC 地址与特定 IP 绑定。
1. 查看客户端的 MAC 地址
[root@dhcp-client2 ~]# ip link show ens33
# 输出示例:link/ether 00:0c:29:9d:fe:6e brd ff:ff:ff:ff:ff:ff
# MAC 地址为 00:0c:29:9d:fe:6e
2. 在 DHCP 服务器配置文件中添加 host 声明
# 编辑 /etc/dhcp/dhcpd.conf,在末尾追加以下内容
[root@dhcp-server ~]# vim /etc/dhcp/dhcpd.conf
# 为经理的 MAC 地址固定分配 IP 10.1.8.88
host client.laogao.cloud {
hardware ethernet 00:0c:29:9d:fe:6e; # 客户端的 MAC 地址
fixed-address 10.1.8.88; # 要绑定的固定 IP
}
3. 重启 DHCP 服务
[root@dhcp-server ~]# systemctl restart dhcpd
4. 客户端验证
# 在 dhcp-client2 上创建自动获取连接
[root@dhcp-client2 ~]# nmcli connection add con-name dhcp-client2 \
type ethernet ipv4.method auto ifname ens33
[root@dhcp-client2 ~]# nmcli connection up dhcp-client2
# 验证是否获取到固定 IP 10.1.8.88
[root@dhcp-client2 ~]# ip addr show ens33
# 输出:inet 10.1.8.88/24 brd 10.1.8.255 scope global dynamic ens33
七、DHCP 中继代理(跨网段分配 IP)
7.1 为什么需要中继?
- DHCP 客户端发送的 Discover 是广播包,路由器默认不转发广播
- 如果 DHCP 服务器与客户端不在同一广播域,需要 DHCP 中继(Relay Agent)来转发广播报文
7.2 中继工作原理
客户端(10.1.1.0/24) <--> 中继(双网卡) <--> DHCP服务器(10.1.8.0/24)
| | |
广播Discover 转换为单播 处理并回复
转发到服务器 单播回中继
中继在客户端网段接收 DHCP 广播,通过单播与服务器通信,再将回复转发回客户端。
7.3 中继实验示例
实验拓扑
| 主机名 | IP地址 | 虚拟网络 |
|---|---|---|
| dhcp-server | 10.1.8.10/24 | vmnet8 |
| dhcp-relay | 10.1.8.20/24 (vmnet8) + 10.1.1.20/24 (vmnet1) | 双网卡 |
| dhcp-client | 自动获取 | vmnet1 |
配置 DHCP 服务器(支持多个子网)
# /etc/dhcp/dhcpd.conf 中添加第二个地址池
subnet 10.1.1.0 netmask 255.255.255.0 {
range 10.1.1.101 10.1.1.200;
option routers 10.1.1.20;
option broadcast-address 10.1.1.255;
option domain-name-servers 223.5.5.5;
option domain-search "laogao.cloud";
default-lease-time 600;
max-lease-time 7200;
}
配置服务器路由(让服务器能回包给中继)
# DHCP 服务器需要添加一条到达中继内网口(10.1.1.20)的路由
[root@dhcp-server ~]# nmcli connection modify ens160 \
ipv4.routes '10.1.1.20/32 10.1.8.20'
[root@dhcp-server ~]# nmcli connection up ens160
配置中继服务器(使用 dhcrelay 服务)
# 安装 dhcp 软件包(包含 dhcrelay)
[root@dhcp-relay ~]# yum install -y dhcp
# 修改 dhcrelay 服务文件,添加 DHCP 服务器 IP
[root@dhcp-relay ~]# cp /usr/lib/systemd/system/dhcrelay.service \
/etc/systemd/system/dhcrelay.service
[root@dhcp-relay ~]# vim /etc/systemd/system/dhcrelay.service
# 修改 ExecStart 行,末尾添加 DHCP 服务器地址
ExecStart=/usr/sbin/dhcrelay -d --no-pid 10.1.8.10
# 启动中继服务
[root@dhcp-relay ~]# systemctl enable dhcrelay.service --now
# 开启 IP 转发(Linux 作为路由器)
[root@dhcp-relay ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@dhcp-relay ~]# sysctl -p
客户端测试
[root@client ~]# nmcli connection add type ethernet ifname ens160 con-name dynamic
[root@client ~]# nmcli connection up dynamic
# 客户端应能获取到 10.1.1.x 网段的 IP
八、轻量级方案:Dnsmasq
Dnsmasq 是一款集 DNS 缓存、DHCP、DHCP 中继、PXE 于一体的轻量级软件,适合小型网络或个人使用。
8.1 安装与基础配置
[root@dhcp-server ~]# yum install -y dnsmasq
# 编辑配置文件 /etc/dnsmasq.conf
[root@dhcp-server ~]# vim /etc/dnsmasq.conf
# 常用配置参数示例(追加到文件末尾):
# 监听所有网卡(默认)
listen-address=0.0.0.0
# 作为权威 DHCP 服务器
dhcp-authoritative
# IP 地址池:范围 10.1.8.50-100,掩码 24,租约 12 小时
dhcp-range=10.1.8.50,10.1.8.100,255.255.255.0,12h
# 固定分配:MAC 00:0c:29:9d:fe:6e 给 IP 10.1.8.188,租约 45 分钟
dhcp-host=00:0c:29:9d:fe:6e,10.1.8.188,45m
# 设置网关
dhcp-option=option:router,10.1.8.2
# 设置 DNS 服务器
dhcp-option=option:dns-server,8.8.8.8
# 设置域名搜索后缀
dhcp-option=option:domain-search,laogao.cloud
8.2 启动 dnsmasq
[root@dhcp-server ~]# systemctl enable dnsmasq.service --now
8.3 Dnsmasq 作为 DHCP 中继
只需在配置文件中添加一行:
# 将来自网卡 10.1.1.20 的 DHCP 请求转发到 10.1.8.10
dhcp-relay=10.1.1.20,10.1.8.10
同时开启 IP 转发(同前),即可实现中继功能。
九、常见问题与注意事项
- ** subnet 网段必须与服务器网卡一致**:否则 DHCP 服务启动失败。
- 防火墙放行:DHCP 使用 UDP 67(服务器)和 UDP 68(客户端)。
- 多 DHCP 服务器冲突:不要在同一网络部署两个权威 DHCP 服务器。
- 租约时间设置:短租约适合频繁变动的环境(如无线热点),长租约适合固定设备。
- 中继时需配置路由:确保 DHCP 服务器能单播回复到中继设备的 IP。
十、实验总结
通过本实验,我们完成了:
- ✅ 手动配置 DHCP 服务器并分配动态 IP 范围
- ✅ 客户端通过 DHCP 自动获取 IP、网关、DNS
- ✅ 基于 MAC 地址的固定 IP 绑定
- ✅ 跨网段 DHCP 中继的搭建(dhcrelay 方式)
- ✅ 轻量级 dnsmasq 实现 DHCP 服务和中继
这些技能在实际网络运维、虚拟化环境、私有云部署中非常实用。建议读者结合抓包工具(如 tcpdump)观察 DHCP 四个阶段的报文交互,加深理解。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)