字数 3953,阅读大约需 20 分钟
一、DHCP 简介
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是工作在应用层的局域网网络协议,依赖 UDP 不可靠传输协议实现数据传输,广泛应用于大型局域网环境。其核心作用是集中管理和分配网络资源,让网络中的主机能动态获取 IP 地址、网关(Gateway)地址、DNS 服务器地址等关键网络配置信息,同时有效提升 IP 地址的使用率,避免地址浪费。
二、DHCP 工作原理
DHCP 工作流程主要包括“租约四部曲”(DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK/NAK)以及后续的续租过程,具体如下:
(一)租约四部曲
- 1. 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 服务器识别请求来源。 - 2. DHCP Offer(服务器响应请求)
DHCP 服务器接收到客户端的 IP 请求后,会在自身的 IP 地址池中检索是否有可用的合法 IP 地址。若存在可用 IP,服务器会对该 IP 做标记,并将其纳入 DHCP Offer 消息中,随后以自身 IP 为源地址、255.255.255.255 为目标地址、UDP 68 端口为源端口广播 DHCP Offer 消息。消息内容包括:客户端 MAC 地址、提供的合法 IP 地址、子网掩码、默认网关、IP 租约期限、DHCP 服务器 IP 地址等。 - 3. 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(确认租约):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 租约申请流程。
(二)特殊情况说明
- 1. 若 DHCP 客户端无法找到 DHCP 服务器,会从 TCP/IP 的 B 类网段 169.254.0.0/16 中随机选取一个 IP 作为临时地址,同时每隔 5 分钟尝试与 DHCP 服务器通信。一旦建立连接,客户端会放弃临时 IP,使用服务器分配的合法 IP。
- 2. 客户端接收 DHCP ACK 报文后,若通过地址冲突检测(ARP)发现分配的 IP 存在冲突或因其他原因无法使用,会发送 DECLINE 报文,告知服务器该 IP 不可用。
(三)DHCP 客户端续租
- 1. 当 IP 租约期限过去 50% 时,客户端会直接向为其分配 IP 的 DHCP 服务器发送 DHCP Request 消息,请求续租。若收到服务器回复的 DHCP ACK 消息,客户端会根据消息中的新租约期限及更新的 TCP/IP 参数,更新自身配置,完成续租。若未收到回复,客户端继续使用当前 IP,因剩余租约仍可支持正常通信。
- 2. 若在租约 50% 时未完成续租,客户端会在租约过去 87.5% 时再次向原 DHCP 服务器发送续租请求。若此次仍未成功,当租约到期(100%)时,客户端必须放弃当前 IP,重新发起 IP 申请。若此时无可用 DHCP 服务器,客户端会从 169.254.0.0/16 网段随机选取 IP,并每隔 5 分钟重复尝试连接 DHCP 服务器。
三、DHCP 服务搭建准备
(一)实验环境准备
- 1. 准备两台虚拟机,将网络连接模式设置为“自定义 VMnet*”模式(如 VMnet1、VMnet8 等,确保两台机器处于同一虚拟网络)。
- 2. 关闭相关防护机制,避免影响 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)
- 1. 生成主配置文件
执行以下命令,将模板配置文件复制到 DHCP 主配置文件路径,覆盖默认空文件:
cp -a /usr/share/doc/dhcp-4.*.*/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
(注:需将命令中的“dhcp-4..”替换为实际系统中存在的版本目录,可通过 ls /usr/share/doc/ | grep dhcp 查看具体版本) - 2. 修改主配置文件
使用文本编辑器(如 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),注意配置文件中每行结尾需加英文分号,大括号需成对出现,避免语法错误。
- 3. 启动 DHCP 服务
执行命令启动 DHCP 服务:systemctl start dhcpd
- • 若需设置 DHCP 服务开机自启动,执行:
systemctl enable dhcpd - • 执行
systemctl status dhcpd 查看服务状态,确保服务正常运行(状态显示“active (running)”)。
- 4. 客户端验证
在 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 时,可通过配置保留地址实现,具体步骤如下:
- 1. 获取客户端 MAC 地址
在 DHCP 服务器或客户端上,执行 arp -a 命令查看客户端的 MAC 地址(格式如 00:0c:29:3a:b4:5c),或在客户端执行 ip link show 查看(“link/ether”后即为 MAC 地址)。 - 2. 修改 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)
}
}
- 3. 重启 DHCP 服务
执行 systemctl restart dhcpd 重启服务,使配置生效,执行 systemctl status dhcpd 确认服务正常。 - 4. 客户端验证
在目标客户端上重启网卡(ifdown eth0; ifup eth0),执行 ip addr 查看 IP,确认是否已分配到配置的固定 IP(如 192.168.88.10)。
(三)超级作用域配置(同一局域网多网段分配)
超级作用域允许 DHCP 服务器为单个物理网络上的客户端提供多个网段的 IP 租约,适用于网络中客户端数量较多、单个网段地址不足的场景,配置步骤如下:
- 1. 实验环境准备
准备三台虚拟机:1 台作为 DHCP 服务器,2 台作为客户端,所有机器设置为同一自定义虚拟网络模式(如 VMnet8)。 - 2. 配置 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
- 3. 开启 DHCP 服务器路由转发
编辑内核参数配置文件,开启 IP 转发功能:
- • 执行
vim /etc/sysctl.conf,添加或修改以下参数:net.ipv4.ip_forward = 1 - • 执行
sysctl -p 刷新配置,使路由转发立即生效(无需重启系统)。
- 4. 修改 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 声明(多网段)
}
- • 保存并退出文件,确保语法正确(分号、大括号完整)。
- 5. 重启 DHCP 服务
执行 systemctl restart dhcpd 重启服务,确认服务状态正常(systemctl status dhcpd)。 - 6. 客户端验证
分别在两台客户端上重启网卡(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 服务器
- 1. 安装 DHCP 软件包
执行 yum -y install dhcp 安装 DHCP 服务(若已安装可跳过)。 - 2. 修改 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
}
- 3. 启动并设置 DHCP 服务自启
执行 systemctl start dhcpd 启动服务,systemctl enable dhcpd 设置开机自启,systemctl status dhcpd 确认服务正常。
3. 配置 DHCP 中继服务器
- • 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 eth0
- • eth1 网卡配置,命令如下:
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 配置正确。
2. 安装 DHCP 软件包
执行 yum -y install dhcp 安装(需包含 dhcrelay 组件)。
3. 修改 DHCP 中继配置文件
编辑 /etc/sysconfig/dhcrelay 文件,配置中继监听接口和 DHCP 服务器地址:
INTERFACES="eth0 eth1" # 中继监听的网卡接口(eth0 连接 DHCP 服务器,eth1 连接客户端子网)
DHCPSERVERS="192.168.10.10" # DHCP 服务器的 IP 地址
- 4. 开启路由转发
编辑 /etc/sysctl.conf,确保 net.ipv4.ip_forward = 1(若未设置则添加),执行 sysctl -p 生效。 - 5. 启动并设置中继服务自启
执行 systemctl start dhcrelay 启动中继服务,systemctl enable dhcrelay 设置开机自启,systemctl status dhcrelay 确认服务正常。 - 6. 客户端验证
在 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;
# }
}