本章讲解动态主机配置协议(DHCP,Dynamic Host Configuration Protocol) ,该协议用于自动管理局域网内主机的 IP 地址、子网掩码、网关地址及 DNS 地址等参数,可以有效地提升 IP 地址的利用率,提高配置效率,并降低管理与维护成本。
本章详细讲解了在 Linux 系统中配置部署 dhcpd 服务程序的方法,剖析了 dhcpd 服务程序配置文件内每个参数的作用,并通过自动分配 IP 地址、绑定 IP 地址与 MAC 地址等实验,让各位读者更直观地体会 DHCP 协议的强大之处。
一、动态主机配置协议
动态主机配置协议(DHCP)是一种基于 UDP 协议且仅限于在局域网内部使用的网络协,主要用于大型的局域网环境或者存在较多移动办公设备的局域网环境中,其主要用途是为局域网内部的设备或网络供应商自动分配 IP 地址等参数。
简单来说,DHCP 协议就是让局域网中的主机自动获得网络参数的服务。在下图所示的拓扑图中存在多台主机,如果手动配置每台主机的网络参数会相当麻烦,日后维护起来也让人头大。而且当机房内的主机数量进一步增加时(比如有 100 台,甚至 1000 台) ,这个手动配置以及维护工作的工作量足以让运维人员崩溃。 借助于 DHCP 协议, 不仅可以为主机自动分配网络参数,还可以确保主机使用的 IP 地址是唯一的,更重要的是,还能为特定主机分配固定的 IP 地址。

DHCP 协议的应用十分广泛,无论是服务器机房还是家庭、机场、咖啡馆,都会见到它的身影。比如,本书的某位读者开了一家咖啡厅,在为顾客提供咖啡的同时,还为顾客免费提供无线上网服务。这样一来,顾客就可以一边惬意地喝着咖啡,一边连着无线网络刷朋友圈了。但是,作为咖啡厅老板的您,肯定不希望(也没有时间)为每一位造访的顾客手动设置 IP地址、 子网掩码、 网关地址等信息。 另外, 考虑到咖啡馆使用的内网网段一般为 192.168.10.0/24(C 类私有地址) , 最多能容纳的主机数为 200 多台。 而咖啡厅一天的客流量肯定不止 200 人。如果采用手动方式为他们分配 IP 地址,则当他们在离开咖啡厅时并不会自动释放这个 IP 地址,这就可能出现 IP 地址不够用的情况。这一方面会造成 IP 地址的浪费,另外一方面也增加的 IP 地址的管理成本。而使用 DHCP 协议,这一切都迎刃而解 — 老板只需安心服务好顾客,为其提供美味的咖啡;顾客通过运行 DHCP 协议的服务器自动获得上网所需的 IP 地址,等离开咖啡厅时 IP 地址将被 DHCP 服务器收回,以备其他顾客使用。
既然确定在今后的生产环境中肯定离不开 DHCP 了,那么也就有必要好好地熟悉一下DHCP 涉及的常见术语了。
➢ :一个完整的 IP 地址段,DHCP 协议根据作用域来管理网络的分布、分配 IP地址及其他配置参数。
➢ :用于管理处于同一个物理网络中的多个逻辑子网段。超级作用域中包含了可以统一管理的作用域列表。
➢ : 把作用域中的某些 IP 地址排除, 确保这些 IP 地址不会分配给 DHCP 客户端。
➢ : 在定义了DHCP的作用域并应用了排除范围后, 剩余的用来动态分配给DHCP客户端的 IP 地址范围。
➢ :DHCP 客户端能够使用动态分配的 IP 地址的时间。
➢ :保证网络中的特定设备总是获取到相同的 IP 地址。
二、部署 dhcpd 服务程序
dhcpd 是 Linux 系统中用于提供 DHCP 协议的服务程序。尽管 DHCP 协议的功能十分强大,但是 dhcpd 服务程序的配置步骤却十分简单,这也在很大程度上降低了在 Linux 中实现动态主机管理服务的门槛。
在确认 Yum 软件仓库配置妥当之后,安装 dhcpd 服务程序:
# yum install dhcp
Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos,
: subscription-manager
Determining fastest mirrors
base | 3.6 kB 00:00
centosplus | 3.4 kB 00:00
extras | 3.4 kB 00:00
Trying other mirror.
updates | 3.4 kB 00:00
Resolving Dependencies
--> Running transaction check
---> Package dhcp.x86_64 12:4.2.5-68.el7.centos.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
====================================================================
Package Arch Version Repository Size
====================================================================
Installing:
dhcp x86_64 12:4.2.5-68.el7.centos.1 base 513 k
Transaction Summary
====================================================================
Install 1 Package
Total download size: 513 k
Installed size: 1.4 M
Is this ok [y/d/N]: y
Downloading packages:
dhcp-4.2.5-68.el7.centos.1.x86_64.rpm | 513 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 12:dhcp-4.2.5-68.el7.centos.1.x86_64 1/1
Verifying : 12:dhcp-4.2.5-68.el7.centos.1.x86_64 1/1
Installed:
dhcp.x86_64 12:4.2.5-68.el7.centos.1
Complete!
查看 dhcpd 服务程序的配置文件内容。
# cat /etc/dhcp/dhcpd.conf
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example
# see dhcpd.conf(5) man page
是的,您没有看错!dhcp 的服务程序的配置文件中只有 3 行注释语句,这意味着我们需要自行编写这个文件。如果读者不知道怎么编写,可以看一下配置文件中第 2 行的参考示例文件,其组成架构如下图所示。

一个标准的配置文件应该包括全局配置参数、子网网段声明、地址配置选项以及地址配置参数。其中,全局配置参数用于定义 dhcpd 服务程序的整体运行参数;子网网段声明用于配置整个子网段的地址属性。
考虑到 dhcpd 服务程序配置文件的可用参数比较多,挑选了最常用的参数(见下表 ) ,并逐一进行了简单介绍,以便为接下来的实验打好基础。
参数 作用
ddns-update-style [类型] 定义 DNS 服务动态更新的类型,类型包括 none(不支
持动态更新) 、 interim (互动更新模式) 与 ad-hoc
(特殊更新模式)
[allow | ignore] client-updates 允许/忽略客户端更新 DNS 记录
default-lease-time [21600] 默认超时时间
max-lease-time [43200] 最大超时时间
option domain-name-servers[8.8.8.8] 定义 DNS 服务器地址
option domain-name ["domain.org"] 定义 DNS 域名
range 定义用于分配的 IP 地址池
option subnet-mask 定义客户端的子网掩码
option routers 定义客户端的网关地址
broadcase-address[广播地址] 定义客户端的广播地址
ntp-server[IP 地址] 定义客户端的网络时间服务器(NTP)
nis-servers[IP 地址] 定义客户端的 NIS 域服务器的地址
Hardware[网卡物理地址] 指定网卡接口的类型与 MAC 地址
server-name[主机名] 向 DHCP 客户端通知 DHCP 服务器的主机名
fixed-address[IP 地址] 将某个固定的 IP 地址分配给指定主机
time-offset[偏移误差] 指定客户端与格林尼治时间的偏移差
三、自动管理 IP 地址
DHCP 协议的设计初衷是为了更高效地集中管理局域网内的 IP 地址资源。DHCP 服务器会自动把 IP 地址、子网掩码、网关、DNS 地址等网络信息分配给有需要的客户端,而且当客户端的租约时间到期后还可以自动回收所分配的 IP 地址,以便交给新加入的客户端。
为了让实验更有挑战性,来模拟一个真实生产环境的需求:
“机房运营部门:明天会有 100 名学员自带笔记本电脑来我司培训学习,请保证他们能够使用机房的本地 DHCP 服务器自动获取 IP 地址并正常上网” 。
机房所用的网络地址及参数信息如下表所示。
参数名称 值
默认租约时间 21600 秒
最大租约时间 43200 秒
IP 地址范围 192.168.1.180~192.168.1.230
子网掩码 255.255.255.0
网关地址 192.168.1.145
DNS 服务器地址 192.168.1.145
搜索域 linuxprobe.com
在了解了真实需求以及机房网络中的配置参数之后, 我们按照下表来配置 DHCP 服务器以及客户端。
主机类型 操作系统 IP地址
DHCP 服务器 RHEL 7 192.168.10.1
DHCP 客户端 RHEL 7 自动获取
前文讲到,作用域一般是个完整的 IP 地址段,而地址池中的 IP 地址才是真正供客户端使用的,因此地址池应该小于或等于作用域的 IP 地址范围。另外,由于 VMware Workstation虚拟机软件自带 DHCP 服务,为了避免与自己配置的 dhcpd 服务程序产生冲突,应该先按照下图所示将虚拟机软件自带的 DHCP 功能关闭。


可随意开启几台客户端,准备进行验证。但是一定要注意,DHCP 客户端与服务器需要处于同一种网络模式 — 仅主机模式(Hostonly) ,否则就会产生物理隔离,从而无法获取 IP地址。建议开启 1~3 台客户端虚拟机验证一下效果就好,以免物理主机的 CPU 和内存的负载太高。
在确认 DHCP 服务器的 IP 地址等网络信息配置妥当后就可以配置 dhcpd 服务程序了。 请注意,在配置 dhcpd 服务程序时,配置文件中的每行参数后面都需要以分号(;)结尾,这是规定。另外,dhcpd 服务程序配置文件内的参数都十分重要,因此在上表中罗列出了每一行参数,并对其用途进行了简单介绍。
# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.180 192.168.1.230;
option subnet-mask 255.255.255.0;
option routers 192.168.1.145;
option domain-name "linuxprobe.com";
option domain-name-server 192.168.1.145;
default-lease-time 21600;
max-lease-time 43200;
}
dhcpd 服务程序配置文件中使用的参数以及作用:
参数 作用
ddns-update-style none; 设置 DNS 服务不自动进行动态更新
ignore client-updates; 忽略客户端更新 DNS 记录
subnet 192.168.10.0 netmask 255.255. 255.0 { 作用域为 192.168.1.0/24 网段
range 192.168.1.180 192.168.1.230; IP 地址池为 192.168.1.180-230(约 50 个 IP 地址)
option subnet-mask 255.255.255.0; 定义客户端默认的子网掩码
option routers 192.168.1.145; 定义客户端的网关地址
option domain-name "linuxprobe.com"; 定义默认的搜索域
option domain-name-servers 192.168. 1.145; 定义客户端的 DNS 地址
default-lease-time 21600; 定义默认租约时间(单位:秒)
max-lease-time 43200; 定义最大预约时间(单位:秒)
} 结束符
在红帽认证考试以及生产环境中, 都需要把配置过的dhcpd 服务加入到开机启动项中, 以确保当服务器下次开机后dhcpd 服务依然能自动启动, 并顺利地为客户端分配IP 地址等信息。
# systemctl start dhcpd
# systemctl enable dhcpd
ln -s '/usr/lib/systemd/system/dhcpd.service' '/etc/systemd/system/multi-user.
target.wants/dhcpd.service'
把 dhcpd 服务程序配置妥当之后就可以开启客户端来检验 IP 分配效果了。 重启客户端的网卡服务后即可看到自动分配到的 IP 地址,如图所示。

如果有兴趣,大家还可以再开启一台运行 Windows 系统的客户端进行尝试,其效果都是一样的。
四、分配固定 IP 地址
在DHCP 协议中有个术语是 “预约” , 它用来确保局域网中特定的设备总是获取到固定的IP 地址。换句话说,就是dhcpd 服务程序会把某个IP 地址私藏下来,只将其用于相匹配的特定设备。
要想把某个IP 地址与某台主机进行绑定,就需要用到这台主机的MAC 地址。MAC 地址是网卡上面的一串独立的标识符,具备唯一性,因此不会存在冲突的情况,如图所示。

在 Linux系统或 Windows系统中, 都可以通过查看网卡的状态来获知主机的 MAC 地址。在 dhcpd 服务程序的配置文件中,按照如下格式将 IP 地址与 MAC 地址进行绑定。
host 主机名称{
hardware ethernet 该主机的 MAC 地址;
fixed-address 欲指定的 IP 地址;
}
如果不方便查看主机的 MAC 地址,该怎么办呢?比如,要给老板使用的主机绑定 IP 地址,总不能随便就去查看老板的主机信息吧。针对这种情况,刘遄老师告诉大家一个很好的办法。我们首先启动 dhcpd 服务程序,为老板的主机分配一个 IP 地址,这样就会在 DHCP 服务器本地的日志文件中保存这次的 IP 地址分配记录。然后查看日志文件,就可以获悉主机的MAC 地址了(即下面加粗的内容) 。
# tail -f /var/log/messages
Mar 30 05:33:17 localhost dhcpd: Copyright 2004-2013 Internet Systems Consortium.
Mar 30 05:33:17 localhost dhcpd: All rights reserved.
Mar 30 05:33:17 localhost dhcpd: For info, please visit https://www.isc.org/
software/dhcp/
Mar 30 05:33:17 localhost dhcpd: Not searching LDAP since ldap-server, ldap-
port and ldap-base-dn were not specified in the config file
Mar 30 05:33:17 localhost dhcpd: Wrote 0 leases to leases file.
Mar 30 05:33:17 localhost dhcpd: Listening on LPF/eno16777728/00:0c:29:c4:a4:
09/192.168.10.0/24
Mar 30 05:33:17 localhost dhcpd: Sending on LPF/eno16777728/00:0c:29:c4:a4:09/
192.168.10.0/24
Mar 30 05:33:17 localhost dhcpd: Sending on Socket/fallback/fallback-net
Mar 30 05:33:26 localhost dhcpd: DHCPDISCOVER from 00:0c:29:27:c6:12 via eno16777728
Mar 30 05:33:27 localhost dhcpd: DHCPOFFER on 192.168.10.50 to 00:0c:29:27:c6:
12 (WIN-APSS1EANKLR) via eno16777728
Mar 30 05:33:29 localhost dhcpd: DHCPDISCOVER from 00:0c:29:27:c6:12 (WIN-
APSS1EANKLR) via eno16777728
Mar 30 05:33:29 localhost dhcpd: DHCPOFFER on 192.168.10.50 to 00:0c:29:27:c6:
12 (WIN-APSS1EANKLR) via eno16777728
Mar 30 05:33:29 localhost dhcpd: DHCPREQUEST for 192.168.10.50 (192.168.10.10)
from 00:0c:29:27:c6:12 (WIN-APSS1EANKLR) via eno16777728
Mar 30 05:33:29 localhost dhcpd: DHCPACK on 192.168.10.50 to 00:0c:29:27:c6:12
(WIN-APSS1EANKLR) via eno16777728
这里注意:在 Windows 系统中看到的 MAC 地址,其格式类似于 00-0c-29-27-c6-12,间隔符为减号(-) 。但是在 Linux 系统中,MAC 地址的间隔符则变成了冒号(:) 。
# vim /etc/dhcp/dhcpd.conf
1 ddns-update-style none;
2 ignore client-updates;
3 subnet 192.168.10.0 netmask 255.255.255.0 {
4 range 192.168.10.50 192.168.10.150;
5 option subnet-mask 255.255.255.0;
6 option routers 192.168.10.1;
7 option domain-name "linuxprobe.com";
8 option domain-name-servers 192.168.10.1;
9 default-lease-time 21600;
10 max-lease-time 43200;
11 host linuxprobe {
12 hardware ethernet 00:0c:29:27:c6:12;
13 fixed-address 192.168.10.88;
14 }
15 }
确认参数填写正确后就可以保存退出配置文件,然后就可以重启 dhcpd 服务程序了。
# systemctl restart dhcpd
需要说明的是,如果您刚刚为这台主机分配了 IP 地址,则它的 IP 地址租约时间还没有到期,因此不会立即换成新绑定的 IP 地址。要想立即查看绑定效果,则需要重启一下客户端的网络服务,如图所示。

本篇实验没有在虚拟机中进行调试,因为在很多企业中一般都以MAC和IP绑定的方式,实名管理计算机和IP。如果有开网吧、咖啡馆类似的同学,可以认真实验一下,很有益处。
网友评论