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.addresses10.1.8.10/24\ipv4.gateway10.1.8.2\ipv4.dns10.1.8.2\autoconnectyes# 激活网卡配置[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)subnet10.1.8.0 netmask255.255.255.0{# DHCP 自动分配的 IP 范围:101 ~ 130,共 30 个地址range10.1.8.10110.1.8.130;# 分配给客户端的 DNS 服务器(阿里云公共 DNS)option domain-name-servers223.5.5.5;# 内网域名后缀(通常用于内网解析,一般可忽略)option domain-name"laogao.cloud";# 默认网关,确保客户端能上网option routers10.1.8.2;# 广播地址,ARP/DHCP 依赖它option broadcast-address10.1.8.255;# 默认租约时间:600 秒 = 10 分钟default-lease-time600;# 最大租约时间:7200 秒 = 2 小时max-lease-time7200;}步骤5:验证配置并启动服务
# 检查配置文件语法是否正确[root@dhcp-server ~]# dhcpd -t# 若输出 "Configuration file syntax OK" 则正常# 启用并启动 dhcpd 服务[root@dhcp-server ~]# systemctl enable dhcpd --now# 查看服务状态[root@dhcp-server ~]# systemctl status dhcpd6.3 DHCP 客户端配置(普通员工)
# 在客户端机器上,添加一个自动获取 IP 的连接[root@dhcp-client1 ~]# nmcli connection add con-name dhcp-client1 \typeethernet 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 ~]# dhclient6.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:6e2. 在 DHCP 服务器配置文件中添加 host 声明
# 编辑 /etc/dhcp/dhcpd.conf,在末尾追加以下内容[root@dhcp-server ~]# vim /etc/dhcp/dhcpd.conf# 为经理的 MAC 地址固定分配 IP 10.1.8.88hostclient.laogao.cloud{hardware ethernet 00:0c:29:9d:fe:6e;# 客户端的 MAC 地址fixed-address10.1.8.88;# 要绑定的固定 IP}3. 重启 DHCP 服务
[root@dhcp-server ~]# systemctl restart dhcpd4. 客户端验证
# 在 dhcp-client2 上创建自动获取连接[root@dhcp-client2 ~]# nmcli connection add con-name dhcp-client2 \typeethernet 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 中添加第二个地址池subnet10.1.1.0 netmask255.255.255.0{range10.1.1.10110.1.1.200;option routers10.1.1.20;option broadcast-address10.1.1.255;option domain-name-servers223.5.5.5;option domain-search"laogao.cloud";default-lease-time600;max-lease-time7200;}配置服务器路由(让服务器能回包给中继)
# 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-pid10.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.cloud8.2 启动 dnsmasq
[root@dhcp-server ~]# systemctl enable dnsmasq.service --now8.3 Dnsmasq 作为 DHCP 中继
只需在配置文件中添加一行:
# 将来自网卡 10.1.1.20 的 DHCP 请求转发到 10.1.8.10dhcp-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 四个阶段的报文交互,加深理解。
