一、DHCP 简介
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是工作在应用层的局域网网络协议,依赖 UDP 不可靠传输协议实现数据传输,广泛应用于大型局域网环境。其核心作用是集中管理和分配网络资源,让网络中的主机能动态获取 IP 地址、网关(Gateway)地址、DNS 服务器地址等关键网络配置信息,同时有效提升 IP 地址的使用率,避免地址浪费。
二、DHCP 工作原理
DHCP 工作流程主要包括“租约四部曲”(DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK/NAK)以及后续的续租过程,具体如下:
(一)租约四部曲
- DHCP Discover(客户端IP请求)
当 DHCP 客户端启动时,会自动将自身 IP 地址配置为 0.0.0.0,由于该地址无法实现正常通信,客户端必须向 DHCP 服务器请求合法 IP。因客户端未知 DHCP 服务器 IP,会以 0.0.0.0 为源地址、255.255.255.255 为目标地址(广播地址),通过 UDP 67 端口广播 DHCP Discover 消息。该消息包含客户端的 MAC 地址和计算机名,便于 DHCP 服务器识别请求来源。 - DHCP Offer(服务器响应请求)
DHCP 服务器接收到客户端的 IP 请求后,会在自身的 IP 地址池中检索是否有可用的合法 IP 地址。若存在可用 IP,服务器会对该 IP 做标记,并将其纳入 DHCP Offer 消息中,随后以自身 IP 为源地址、255.255.255.255 为目标地址、UDP 68 端口为源端口广播 DHCP Offer 消息。消息内容包括:客户端 MAC 地址、提供的合法 IP 地址、子网掩码、默认网关、IP 租约期限、DHCP 服务器 IP 地址等。 - DHCP Request(客户端选择IP)
DHCP 客户端会从接收到的第一个 DHCP Offer 消息中选定 IP 地址,发送该 Offer 的 DHCP 服务器会将此 IP 保留,防止分配给其他客户端。之后,客户端会向所有 DHCP 服务器广播 DHCP Request 消息,表明已接受某台服务器提供的 IP 配置,消息中包含提供该配置的服务器 IP(服务标识符)。未被选中的服务器会取消之前的 Offer,收回 IP 地址以备后续分配。此过程中,客户端仍未配置 IP,故继续使用 0.0.0.0 为源地址、255.255.255.255 为目标地址、UDP 67 端口为目的端口广播消息。 - DHCP ACK/NAK(服务器确认租约)
- DHCP ACK(确认租约):DHCP 服务器接收到 DHCP Request 消息后,若确认客户端请求合法,会以广播形式向客户端发送 DHCP ACK 消息,包含 IP 地址的有效租约及其他配置信息。广播时,服务器以自身 IP 为源地址、255.255.255.255 为目标地址、UDP 68 端口为源端口。客户端接收 ACK 消息后,完成 IP 配置及 TCP/IP 初始化。
- DHCP NAK(拒绝租约):若客户端请求无效(如试图租用已不可用的旧 IP、客户端迁移到其他子网导致 IP 无效等),服务器会广播 DHCP NAK 消息。客户端接收 NAK 后,需重新启动 DHCP 租约申请流程。
(二)特殊情况说明
- 若 DHCP 客户端无法找到 DHCP 服务器,会从 TCP/IP 的 B 类网段 169.254.0.0/16 中随机选取一个 IP 作为临时地址,同时每隔 5 分钟尝试与 DHCP 服务器通信。一旦建立连接,客户端会放弃临时 IP,使用服务器分配的合法 IP。
- 客户端接收 DHCP ACK 报文后,若通过地址冲突检测(ARP)发现分配的 IP 存在冲突或因其他原因无法使用,会发送 DECLINE 报文,告知服务器该 IP 不可用。
(三)DHCP 客户端续租
- 当 IP 租约期限过去 50% 时,客户端会直接向为其分配 IP 的 DHCP 服务器发送 DHCP Request 消息,请求续租。若收到服务器回复的 DHCP ACK 消息,客户端会根据消息中的新租约期限及更新的 TCP/IP 参数,更新自身配置,完成续租。若未收到回复,客户端继续使用当前 IP,因剩余租约仍可支持正常通信。
- 若在租约 50% 时未完成续租,客户端会在租约过去 87.5% 时再次向原 DHCP 服务器发送续租请求。若此次仍未成功,当租约到期(100%)时,客户端必须放弃当前 IP,重新发起 IP 申请。若此时无可用 DHCP 服务器,客户端会从 169.254.0.0/16 网段随机选取 IP,并每隔 5 分钟重复尝试连接 DHCP 服务器。
三、DHCP 服务搭建准备
(一)实验环境准备
- 准备两台虚拟机,将网络连接模式设置为“自定义 VMnet*”模式(如 VMnet1、VMnet8 等,确保两台机器处于同一虚拟网络)。
- 关闭相关防护机制,避免影响 DHCP 服务通信:
- 关闭防火墙:执行
systemctl stop firewalld。 - 关闭 SELinux:执行
getenforce查看 SELinux 状态,若为 Enforcing 模式,执行setenforce 0临时关闭,若需永久关闭,编辑/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,重启系统生效。 - 关闭 VMware 虚拟网络编辑器的 DHCP 功能:打开 VMware,进入“编辑”->“虚拟网络编辑器”,选择对应虚拟网络(如 VMnet*),取消勾选“使用本地 DHCP 服务将 IP 地址分配给虚拟机”,点击“确定”保存。
(二)DHCP 相关基础信息
- 软件包
dhcp:DHCP 服务核心软件包,提供 DHCP 服务器功能。dhcp-common:DHCP 命令工具软件包,包含 DHCP 相关辅助命令。dnf install dhcp-server dhcp-common -y
- 服务名
dhcpd:DHCP 服务器服务名,用于启动、停止、重启 DHCP 服务。dhcrelay:DHCP 中继服务名,实现不同子网间 DHCP 消息转发时使用。
- 端口号
- UDP 67:作为 DHCP 客户端的目标端口,客户端向服务器发送请求时使用。
- UDP 68:作为 DHCP 服务器的源端口,服务器向客户端回复消息时使用。
- 配置文件
/etc/dhcp/dhcpd.conf:DHCP 服务器主配置文件,默认为空,需从模板文件复制并修改后使用。/usr/share/doc/dhcp-server/dhcpd.conf.example:DHCP 配置模板文件,提供标准配置示例,需根据实际需求调整。/etc/sysconfig/dhcrelay:DHCP 中继服务配置文件,配置 DHCP 中继时使用。
四、DHCP 服务配置实操
(一)基本功能配置(动态分配IP)
- 生成主配置文件
执行以下命令,将模板配置文件复制到 DHCP 主配置文件路径,覆盖默认空文件:cp -a /usr/share/doc/dhcp-4.*.*/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
(注:需将命令中的“dhcp-4..”替换为实际系统中存在的版本目录,可通过ls /usr/share/doc/ | grep dhcp查看具体版本) - 修改主配置文件
使用文本编辑器(如 vim)打开主配置文件:vim /etc/dhcp/dhcpd.conf
- 注释掉文件中前几个默认的
subnet声明(通常以subnet 10.0.0.0 netmask...开头),避免冲突。 - 保留并修改最后一个
subnet声明,配置实际网络参数,示例如下:subnet 192.168.88.0 netmask 255.255.255.0{ # 声明要分配的网段及子网掩码 range 192.168.88.3 192.168.88.254; # 声明可用IP地址池范围 option domain-name "atguigu.com"; # 设置DNS域名 option domain-name-servers 8.8.8.8; # 设置DNS服务器IP(此处使用谷歌DNS,可替换为其他DNS) option routers 192.168.88.2; # 设置默认网关IP option broadcast-address 192.168.88.255; # 设置广播地址(可选,可省略) default-lease-time 600; # 设置默认租约期限,单位为秒(此处为10分钟) max-lease-time 7200; # 设置最大租约期限,单位为秒(此处为2小时) } - 保存并退出编辑器(vim 中执行
:wq),注意配置文件中每行结尾需加英文分号,大括号需成对出现,避免语法错误。
- 启动 DHCP 服务
执行命令启动 DHCP 服务:systemctl start dhcpd
- 若需设置 DHCP 服务开机自启动,执行:
systemctl enable dhcpd - 执行
systemctl status dhcpd查看服务状态,确保服务正常运行(状态显示“active (running)”)。
- 客户端验证
在 DHCP 客户端虚拟机上,执行以下命令重启网卡,获取 DHCP 服务器分配的 IP:ifdown eth0; ifup eth0(若网卡名称为 ens33 等,需替换为实际网卡名,可通过ip addr查看)
- 执行
ip addr或ifconfig查看客户端 IP 地址,确认是否从配置的地址池(如 192.168.88.3-192.168.88.254)中获取到合法 IP。 - 执行
ping 网关IP(如ping 192.168.88.2)和ping DNS服务器IP(如ping 8.8.8.8),验证网络连通性。
(二)保留地址配置(固定IP分配)
当需要为特定客户端(如服务器、打印机等)分配固定 IP 时,可通过配置保留地址实现,具体步骤如下:
- 获取客户端 MAC 地址
在 DHCP 服务器或客户端上,执行arp -a命令查看客户端的 MAC 地址(格式如00:0c:29:3a:b4:5c),或在客户端执行ip link show查看(“link/ether”后即为 MAC 地址)。 - 修改 DHCP 主配置文件
打开/etc/dhcp/dhcpd.conf文件,在之前配置的subnet声明内部或外部(推荐在subnet内部)添加host声明,配置固定 IP 映射,示例:subnet 192.168.88.0 netmask 255.255.255.0{ # 其他已配置参数(如 range、option 等)... host fantasia{ # 自定义主机名(可任意命名,便于识别) hardware ethernet 00:0c:29:3a:b4:5c; # 客户端的 MAC 地址 fixed-address 192.168.88.10; # 分配给该客户端的固定 IP(可使用地址池外的 IP) } }
- 保存并退出配置文件。
- 重启 DHCP 服务
执行systemctl restart dhcpd重启服务,使配置生效,执行systemctl status dhcpd确认服务正常。 - 客户端验证
在目标客户端上重启网卡(ifdown eth0; ifup eth0),执行ip addr查看 IP,确认是否已分配到配置的固定 IP(如 192.168.88.10)。
(三)超级作用域配置(同一局域网多网段分配)
超级作用域允许 DHCP 服务器为单个物理网络上的客户端提供多个网段的 IP 租约,适用于网络中客户端数量较多、单个网段地址不足的场景,配置步骤如下:
- 实验环境准备
准备三台虚拟机:1 台作为 DHCP 服务器,2 台作为客户端,所有机器设置为同一自定义虚拟网络模式(如 VMnet8)。 - 配置 DHCP 服务器单臂路由(子网卡)
为 DHCP 服务器添加子网卡,实现多网段路由:
配置子接口:
# 创建 VLAN 子接口 sudo nmcli connection add type vlan \ con-name vlan-eth0-200 \ ifname eth0.200 \ dev eth0 \ id 200 # 配置 IP 地址 sudo nmcli connection modify vlan-enp3s0-200 \ ipv4.method manual \ ipv4.addresses 192.168.99.10/24 \ ipv4.gateway 192.168.99.1 \ ipv4.dns "192.168.99.1" # 启用连接 sudo nmcli connection up vlan-enp3s0-200
- 开启 DHCP 服务器路由转发
编辑内核参数配置文件,开启 IP 转发功能:
- 执行
vim /etc/sysctl.conf,添加或修改以下参数:net.ipv4.ip_forward = 1 - 执行
sysctl -p刷新配置,使路由转发立即生效(无需重启系统)。
- 修改 DHCP 主配置文件
打开/etc/dhcp/dhcpd.conf,注释掉之前的subnet声明和host声明(若有),添加shared-network声明(超级作用域),配置多网段参数,示例:shared-network public { # 超级作用域名称(自定义,如 public) subnet 192.168.88.0 netmask 255.255.255.0{ # 第一个网段 option routers 192.168.88.10; # 该网段默认网关(DHCP服务器原网卡IP) range 192.168.88.100 192.168.88.110; # 该网段IP地址池 } subnet 192.168.99.0 netmask 255.255.255.0{ # 第二个网段 option routers 192.168.99.10; # 该网段默认网关(DHCP服务器子网卡IP) range 192.168.99.100 192.168.99.110; # 该网段IP地址池 } # 可根据需求添加更多 subnet 声明(多网段) }
- 保存并退出文件,确保语法正确(分号、大括号完整)。
- 重启 DHCP 服务
执行systemctl restart dhcpd重启服务,确认服务状态正常(systemctl status dhcpd)。 - 客户端验证
分别在两台客户端上重启网卡(ifdown eth0; ifup eth0),执行ip addr查看 IP 地址,确认两台客户端分别从不同网段(如 192.168.88.0/24 和 192.168.99.0/24)获取到 IP,且网关配置正确。
(四)DHCP 中继配置(跨子网IP分配)
当网络中存在多个子网,且仅部署一台 DHCP 服务器时,需通过 DHCP 中继实现跨子网的 IP 分配,DHCP 中继负责在不同子网间转发 DHCP 消息,配置步骤如下:
1. 实验环境准备
- DHCP 服务器:1 台,网卡 eth0 配置静态 IP 192.168.10.10,网络模式为 VMnet10。
- DHCP 中继服务器:1 台,双网卡配置,eth0(VMnet10)IP 192.168.10.20,eth1(VMnet11)IP 100.100.100.20。
- 客户端:1 台(外网客户端),网卡 eth0 设为自动获取 IP,网络模式为 VMnet11。
- 关闭所有机器的防火墙(firewalld/iptables)和 SELinux,确保网络互通。
2. 配置 DHCP 服务器
- 安装 DHCP 软件包
执行yum -y install dhcp安装 DHCP 服务(若已安装可跳过)。 - 修改 DHCP 主配置文件
打开/etc/dhcp/dhcpd.conf,配置两个子网(分别对应 VMnet10 和 VMnet11 网段),示例:# 第一个子网(VMnet10,DHCP服务器所在子网,实验中可暂不使用该地址池) subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.100 192.168.10.110; # 该子网IP地址池 option routers 192.168.10.20; # 网关为中继服务器eth0 IP } # 第二个子网(VMnet11,外网客户端所在子网) subnet 100.100.100.0 netmask 255.255.255.0 { range 100.100.100.100 100.100.100.110; # 该子网IP地址池 option routers 100.100.100.20; # 网关为中继服务器eth1 IP }
- 保存并退出文件,删除或注释其他无关配置。
- 启动并设置 DHCP 服务自启
执行systemctl start dhcpd启动服务,systemctl enable dhcpd设置开机自启,systemctl status dhcpd确认服务正常。
3. 配置 DHCP 中继服务器
- 配置双网卡静态 IP
eth0 网卡配置,命令如下:
sudo nmcli connection modify eth0 \ ipv4.method manual \ ipv4.addresses 192.168.10.20/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns "8.8.8.8 8.8.4.4" sudo nmcli connection up eth0eth1 网卡配置,命令如下:
sudo nmcli connection modify eth0 \ ipv4.method manual \ ipv4.addresses 192.168.20.20/24 \ ipv4.gateway 192.168.20.1 \ ipv4.dns "8.8.8.8 8.8.4.4" sudo nmcli connection up eth1执行
ip addr确认双网卡 IP 配置正确。
- 安装 DHCP 软件包
执行yum -y install dhcp安装(需包含 dhcrelay 组件)。 - 修改 DHCP 中继配置文件
编辑/etc/sysconfig/dhcrelay文件,配置中继监听接口和 DHCP 服务器地址:INTERFACES="eth0 eth1" # 中继监听的网卡接口(eth0 连接 DHCP 服务器,eth1 连接客户端子网) DHCPSERVERS="192.168.10.10" # DHCP 服务器的 IP 地址
- 保存并退出文件。
- 开启路由转发
编辑/etc/sysctl.conf,确保net.ipv4.ip_forward = 1(若未设置则添加),执行sysctl -p生效。 启动并设置中继服务自启
执行systemctl start dhcrelay启动中继服务,systemctl enable dhcrelay设置开机自启,systemctl status dhcrelay确认服务正常。客户端验证
在 VMnet11 子网的客户端上,执行ifdown eth0; ifup eth0重启网卡,执行ip addr查看 IP 地址,确认是否从 DHCP 服务器配置的 192.168.20.20.100-192.168.20.20.110 地址池中获取到 IP。同时执行ping 192.168.10.10(DHCP 服务器 IP)和ping 192.168.20.20.20(中继服务器 eth1 IP),验证跨子网通信是否正常。
(七):配置 IP 与 MAC 绑定
编辑 DHCP 主配置文件 /etc/dhcp/dhcpd.conf,在 subnet 声明内部或外部添加 host 节点(推荐在 subnet 内部,确保网段匹配):
vim /etc/dhcp/dhcpd.conf
添加绑定配置(以“绑定 MAC 为 00:0c:29:3a:b4:5c 的设备到 IP 192.168.88.10 为例):
subnet 192.168.88.0 netmask 255.255.255.0{
# 原有动态分配配置(range、option 等)...
# IP 与 MAC 绑定配置(自定义 host 名称,如 fantasia)
host fantasia{
hardware ethernet 00:0c:29:3a:b4:5c; # 客户端 MAC 地址(需与实际一致)
fixed-address 192.168.88.10; # 绑定的固定 IP(可在地址池内/外)
}
# 可添加多个绑定(复制 host 节点即可)
# host printer{
# hardware ethernet 00:0c:29:4d:c8:7e;
# fixed-address 192.168.88.11;
# }
}