Skip to main content

第14章 使用 DHCP 动态管理主机地址

章节简述​

本章介绍了动态主机配置协议(DHCP,Dynamic Host Configuration Protocol),这是一个用于自动管理局域网内主机 IP 地址、子网掩码、网关地址及 DNS 地址等参数的协议。DHCP 不仅能够有效提升 IP 地址的利用率,还能提高配置效率,降低管理与维护成本。

本章将详细讲解如何在 Linux 系统中配置和部署 Kea 服务程序,剖析 Kea 服务程序配置文件中的每个参数的作用,并通过自动分配 IP 地址、绑定 IP 地址与 MAC 地址等实验,让读者直观地体验 DHCP 的强大功能。

14.1 动态主机地址管理协议​

DHCP 是一种基于 UDP 且仅限于在局域网内部使用的网络协议,主要用于大型局域网环境或拥有大量移动办公设备的网络中,负责自动为局域网内的设备分配 IP 地址等网络参数, 提供一站式的网络配置服务。

简单来说,DHCP 就是一个让局域网内的主机自动获取网络参数的服务。在图 14-1 所示的拓扑图中存在多台主机,如果要手动配置每台主机的网络参数会相当麻烦,日后维护起来也让人头大。而且当机房内的主机数量进一步增加时(比如有 100 台,甚至 1000 台),这个手动配置以及维护的工作量足以让运维人员崩溃。借助于 DHCP,不仅可以为主机自动分配网络参数,还能确保主机使用的IP 地址是唯一的,更重要的是,还能为特定主机分配固定的IP 地址。

图14-1 DHCP协议的拓扑示意图

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 的作用域并应用了排除范围后,剩余的用来动态分配给客户端的IP 地址范围。

租约:DHCP 客户端能够使用动态分配的IP 地址的时间。

预约:保证网络中的特定设备总是可以获取到相同的 IP 地址。

14.2 部署 Kea 服务程序​

红帽RHEL 10 系统已经彻底移除了大家熟悉的传统 ISC(Internet Systems Consortium, 互联网系统协会)DHCP 服务软件包—dhcp-server,也就是 dhcpd 服务,并选用了 ISC Kea 作为新一代 DHCP 服务程序。虽然两者的理论知识一致,但配置起来还是有很大区别的, 因此接下来的操作请一定要细心。

在确认软件仓库配置妥当之后,安装 Kea 服务程序,其软件包名称为 kea:

root@linuxprobe:~# dnf install kea
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
kea x86_64 2.6.1-4.el10 BaseOS 1.3 M
Installing dependencies:
boost-system x86_64 1.83.0-4.el10 BaseOS 16 k
kea-libs x86_64 2.6.1-4.el10 BaseOS 3.1 M
libpq x86_64 16.1-7.el10 BaseOS 253 k
log4cplus x86_64 2.1.1-7.el10 BaseOS 355 k
mariadb-connector-c x86_64 3.4.1-1.el10 BaseOS 214 k
mariadb-connector-c-config noarch 3.4.1-1.el10 BaseOS 10 k
………………省略部分输出信息………………
Installed:
boost-system-1.83.0-4.el10.x86_64
kea-2.6.1-4.el10.x86_64
kea-libs-2.6.1-4.el10.x86_64
libpq-16.1-7.el10.x86_64
log4cplus-2.1.1-7.el10.x86_64
mariadb-connector-c-3.4.1-1.el10.x86_64
mariadb-connector-c-config-3.4.1-1.el10.noarch

Complete!

Kea 服务程序用于提供 IPv4 地址信息的配置文件是 kea-dhcp4.conf,足足有 468 行之多,但大多都是注释信息,我们可以先简单看一下(输出信息暂省略,下一节会细讲):

root@linuxprobe:~# cat /etc/kea/kea-dhcp4.conf

看过本书之前版本的读者此时肯定是会心一笑,这不就是熟悉的 JSON 格式的配置文件吗?而且大部分都是空行和注释信息,并没有看起来那样恐怖。我们可以先执行下述命令, 把所有的空行和注释信息都过滤掉,生成配置文件的精简版:

root@linuxprobe:~# cd /etc/kea/
root@linuxprobe:/etc/kea# mv kea-dhcp4.conf kea-dhcp4.bak
root@linuxprobe:/etc/kea# grep -v "^$" kea-dhcp4.bak | grep -v "//" > kea-dhcp4.conf
root@linuxprobe:/etc/kea# cat -n kea-dhcp4.conf

精简后的配置文件虽然还是有很多行(127 行),但和最初相比已经减少了 3/4。我们可以先通过表 14-1 了解Kea 服务程序配置文件中常见的参数及作用。

表 14-1 Kea 服务程序配置文件中常见的参数及作用

参数作用
interfaces定义 Kea 服务程序监听的网络接口,例如 ens160
subnet定义 IP 地址作用域,例如 192.168.10.0/24
pools定义 IP 地址池范围,用于动态分配客户端 IP
reservations根据客户端的 MAC 地址或标识符分配固定 IP 地址
valid-lifetime设置 IP 地址租约的有效期(单位为秒)
renew-timer设置租约更新计时器
rebind-timer设置租约重新绑定计时器
option-data配置各种 DHCP 选项的参数集合,可对网关、DNS 服务器、NTP 服务器等网络参数进行精准设定
routers定义客户端的默认网关地址
domain-name-servers定义客户端使用的 DNS 服务器地址
domain-name为客户端指定 DNS 域名,例如 example.org
ntp-servers定义客户端使用的网络时间协议(NTP)服务器地址
nis-servers定义客户端的 NIS 域服务器地址
time-offset设置客户端与协调世界时(UTC)的时差(单位为秒),如东八区为 28800
server-name设置 DHCP 服务器的主机名或标识符
ddns-send-updates开启或关闭动态 DNS 更新(true/false)
ddns-qualifying-suffix指定动态 DNS 更新的后缀域名,例如 example.com.
host-reservation-identifiers指定在为客户端保留特定 IP 地址时所依据的标识符类型(例如 hw-address)
hw-address客户端硬件(MAC)地址,用于指定固定 IP 地址
ip-address为客户端分配的固定 IP 地址
client-classes用于对客户端进行分类,可根据不同的分类标准为各类客户端设置不同 的策略
lease-database指定存储 DHCP 服务器租约信息的数据库路径
loggers用于配置日志记录的相关参数,包括日志记录方式、级别和存储位 置等

14.3 自动管理IP地址​

DHCP 的设计初衷是为了更高效地集中管理局域网内的IP 地址资源。DHCP 服务器会自动把IP 地址、子网掩码、网关、DNS 地址等网络信息分配给有需要的客户端,而且当客户端的租约时间到期后还能自动回收所分配的IP 地址,以便交给新加入的客户端。

为了让实验更有挑战性,来模拟一个真实生产环境的需求:

“机房运营部门:明天会有 100 名学员自带笔记本电脑来我司培训学习,请保证他们能够使用机房的本地 DHCP 服务器自动获取 IP 地址并正常上网。”

机房所用的网络地址及参数信息如表 14-2 所示。

表 14-2 机房所用的网络地址及参数信息

参数名称值
IP 地址范围192.168.10.50~192.168.10.150
子网掩码255.255.255.0
网关地址192.168.10.1
DNS 服务器地址192.168.10.1

在了解了真实需求以及机房网络中的配置参数之后,按照表 14-3 配置 DHCP 服务器以及客户端。

表 14-3 DHCP 服务器以及客户端的配置信息

主机类型操作系统IP 地址
DHCP 服务器RHEL 10192.168.10.1
DHCP 客户端Windows 11使用 DHCP 自动获取地址

前文讲到,作用域一般是一个完整的 IP 地址段,而地址池中的 IP 地址才是真正供客户端使用的,因此地址池应该小于或等于作用域的 IP 地址范围。另外,由于 VMware Workstation 虚拟机软件自带 DHCP 服务,为了避免与自己配置的 Kea 服务程序产生冲突,应该先按照图 14-2 和图 14-3 将虚拟机软件自带的 DHCP 功能关闭。

图14-2 单击虚拟机软件的“虚拟网络编辑器”菜单

图14-3 关闭虚拟机自带的DHCP功能

可随意开启几台客户端,准备进行验证。但是一定要注意,DHCP 客户端与服务器需要处于同一种网络模式—仅主机模式(Hostonly),否则就会产生物理隔离,从而无法获取 IP 地址。建议开启 1~3 台客户端虚拟机验证一下效果就好,以免物理主机的 CPU 和内存的负载太高。

在确认 DHCP 服务器的 IP 地址等网络信息配置妥当后,就可以配置 Kea 服务程序了。首先打开并编辑 kea-dhcp4.conf 文件中的第 1~5 行,填入网卡名称:

root@linuxprobe:/etc/kea# vim kea-dhcp4.conf
1 {
2 "Dhcp4": {
3 "interfaces-config": {
4 "interfaces": [ "ens160" ]
5 },

第 6~9 行的功能是控制套接字,使其与服务器进行通信,实际作用不大,直接删除:

6 "control-socket": {
7 "socket-type": "unix",
8 "socket-name": "/tmp/kea4-ctrl-socket"
9 },

第 10~13 行的功能是配置租约数据库,此时也用不上,直接删除:

10 "lease-database": {
11 "type": "memfile",
12 "lfc-interval": 3600
13 },

第 14~21 行的功能是定义处理过期租约的参数,例如回收定时器的等待时间、最大回收租约数等,也直接删除:

14 "expired-leases-processing": {
15 "reclaim-timer-wait-time": 10,
16 "flush-reclaimed-timer-wait-time": 25,
17 "hold-reclaimed-time": 3600,
18 "max-reclaim-leases": 100,
19 "max-reclaim-time": 250,
20 "unwarned-reclaim-cycles": 5
21 },

第 22~24 行的功能是设置租约的续租时间、重新绑定时间和有效期。其实也可以将其删除,因为如果没有这些参数的话,Kea 会根据 RFC 2131 中规定的默认值进行回收和重绑。这里将其继续删除:

22 "renew-timer": 900,
23 "rebind-timer": 1800,
24 "valid-lifetime": 3600,

第 25~29 行的功能是指定全局的客户端 DNS 信息,这个信息比较常用,参照表 14-2 进行修改:

25 "option-data": [
26 {
27 "name": "domain-name-servers",
28 "data": "192.168.10.1"
29 },

第 30~46 行的功能是指定客户端在解析主机名时应追加的默认域名等信息,我们不需要,则直接删除:

30 {
31 "code": 15,
32 "data": "example.org"
33 },
34 {
35 "name": "domain-search",
36 "data": "mydomain.example.com, example.com"
37 },
38 {
39 "name": "boot-file-name",
40 "data": "EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00"
41 },
42 {
43 "name": "default-ip-ttl",
44 "data": "0xf0"
45 }
46 ],

第 47~55 行的功能是定义客户端类别及其特定配置,例如针对特定厂商设置引导文件等。我们用不上,继续删除:

47 "client-classes": [
48 {
49 "name": "voip",
50 "test": "substring(option[60].hex,0,6) == 'Aastra'",
51 "next-server": "192.0.2.254",
52 "server-hostname": "hal9000",
53 "boot-file-name": "/dev/null"
54 }
55 ],

第 56~60 行的功能是指定作用域和地址池,参照表 14-2 填写即可:

56 "subnet4": [
57 {
58 "id": 1,
59 "subnet": "192.168.10.0/24",
60 "pools": [ { "pool": "192.168.10.50 - 192.168.10.150" } ],

第 61~66 行的功能是指定网关地址,继续填写:

61 "option-data": [
62 {
63 "name": "routers",
64 "data": "192.168.10.1"
65 }
66 ],

第 67~113 行的功能是对主机 IP 和 MAC 地址进行绑定(也就是预约功能),我们下一节才会使用,此时先全部删除:

67 "reservations": [
68 {
69 "hw-address": "1a:1b:1c:1d:1e:1f",
70 "ip-address": "192.0.2.201"
71 },
72 {
73 "client-id": "01:11:22:33:44:55:66",
74 "ip-address": "192.0.2.202",
75 "hostname": "special-snowflake"
76 },
77 {
78 "duid": "01:02:03:04:05",
79 "ip-address": "192.0.2.203",
80 "option-data": [ {
81 "name": "domain-name-servers",
82 "data": "10.1.1.202, 10.1.1.203"
83 } ]
84 },
85 {
86 "client-id": "01:12:23:34:45:56:67",
87 "ip-address": "192.0.2.204",
88 "option-data": [
89 {
90 "name": "vivso-suboptions",
91 "data": "4491"
92 },
93 {
94 "name": "tftp-servers",
95 "space": "vendor-4491",
96 "data": "10.1.1.202, 10.1.1.203"
97 }
98 ]
99 },
100 {
101 "client-id": "01:0a:0b:0c:0d:0e:0f",
102 "ip-address": "192.0.2.205",
103 "next-server": "192.0.2.1",
104 "server-hostname": "hal9000",
105 "boot-file-name": "/dev/null"
106 },
107 {
108 "flex-id": "'s0mEVaLue'",
109 "ip-address": "192.0.2.206"
110 }
111 ]
112 }
113 ],

第 114~125 行的功能是定义 Kea 服务程序的日志级别及日志文件信息,因为暂时不用, 也可以删除:

114 "loggers": [
115 {
116 "name": "kea-dhcp4",
117 "output-options": [
118 {
119 "output": "/var/log/kea-dhcp4.log"
120 }
121 ],
122 "severity": "INFO",
123 "debuglevel": 0
124 }
125 ]

这样一番操作下来,我们的最终精简版代码如下(只有 26 行),这才是真正有用的部分:

1 {
2 "Dhcp4": {
3 "interfaces-config": {
4 "interfaces": [ "ens160" ]
5 },
6 "option-data": [
7 {
8 "name": "domain-name-servers",
9 "data": "192.168.10.1"
10 },
11 ],
12 "subnet4": [
13 {
14 "id": 1,
15 "subnet": "192.168.10.0/24",
16 "pools": [ { "pool": "192.168.10.50 - 192.168.10.150" } ],
17 "option-data": [
18 {
19 "name": "routers",
20 "data": "192.168.10.1"
21 }
22 ],
23 }
24 ],
25 }
26 }

在红帽认证考试以及生产环境中,都需要把配置过的 Kea 服务加入开机启动项中,以确保当服务器下次开机后服务依然能自动启动,并顺利地为客户端分配 IP 地址等信息。真心建议大家能养成“配置好服务程序,顺手加入开机启动项”的好习惯。

root@linuxprobe:/etc/kea# systemctl restart kea-dhcp4
root@linuxprobe:/etc/kea# systemctl enable kea-dhcp4
Created symlink '/etc/systemd/system/multi-user.target.wants/kea-dhcp4.service' → '/usr/lib/systemd/system/kea-dhcp4.service'.

把Kea 服务程序配置妥当之后就可以开启客户端来检验IP 分配效果了。在日常工作中, Windows 11 是主流的桌面操作系统,我们只需要先将虚拟机的网络适配器按图14-4 设置为“仅主机模式”,确保两台主机都处于同一个网络模式内,再将 Windows 系统的网络模式改为 DHCP,稍等片刻便可以在如图 14-5 所示的网络连接详细信息界面自动获取到网络信息了。特别方便!

图14-4 设置网卡模式

图14-5 自动获取到IP地址

如果是在生产环境中配置 Kea 服务,则有可能会因为 DHCP 没有被防火墙放行而导致失败,此时执行下面的命令即可:

root@linuxprobe:~# firewall-cmd --permanent --add-service=dhcp
success
root@linuxprobe:~# firewall-cmd --reload
success

在正常情况下,DHCP 的运作会经历 4 个过程:请求、提供、选择和确认。当客户端顺利获得一个 IP 地址及相关的网络信息后,会通过广播形式发送一个 ARP(Address Resolution Protocol,地址解析协议)请求。包括 Kea 服务程序在内的网络设备会监听该请求,当 Kea 服务程序监听到这条信息后,会将对应IP 地址标记为已分配,不再把它分配给其他主机,从根源上避免了 IP 地址冲突的情况。

14.4 分配固定 IP 地址​

DHCP 中有个术语叫“预约”,用来确保局域网中特定的设备总是获取到固定的 IP 地址。换句话说,就是 Kea 服务程序会把某个 IP 地址私藏下来,只将其用于相匹配的特定设备。这有点像高档餐厅的预约服务,虽然客人还没有到场,但是桌子上会放个写着“已预定”的小牌子。

要想把某个 IP 地址与某台主机进行绑定,就需要用到这台主机的 MAC 地址。这个 MAC 地址即网卡上一串独立的标识符,具备唯一性,因此不会存在冲突的情况。在 Linux 系统中查看 MAC 地址的示例如图 14-6 所示,在 Windows 系统中查MAC 地址的示例如图 14-7 所示。

图14-6 在Linux系统中查看网卡MAC地址

图14-7 在Windows系统中查看网卡MAC地址

在 Linux 或 Windows 系统中,都可以通过查看网络的状态来获知主机的 MAC 地址。在 Kea 服务程序的配置文件中,按照如下格式将 IP 地址与 MAC 地址进行绑定。

MAC 与 IP 地址绑定代码
"reservations": [
{
"hw-address":"MAC 地址",
"ip-address":"IP 地址",
"hostname":"主机名称"
}
]

之前刘遄老师在线下讲课时,讲完DHCP 服务后总会看到有些学员在挠头。起初我很不理解,毕竟 Kea 服务程序是 Linux 系统中一个很简单的实验,总共就那么二十几行的配置参数,大家还能写错?后来发现了原因—有些学员是以Windows 系统为对象进行的IP 与MAC 地址的绑定实验。而在 Windows 7/10 系统中看到的 MAC 地址,其格式类似于00-0C-29-16-3F-EF,间隔符为减号(-)。但是在 Linux 和 Windows 11 系统中,MAC 地址的间隔符则变成了冒号(:)。

root@linuxprobe:/etc/kea# vim kea-dhcp4.conf
{
"Dhcp4": {
"interfaces-config": {
"interfaces": [ "ens160" ]
},
"option-data": [
{
"name": "domain-name-servers",
"data": "192.168.10.1"
},
],
"subnet4": [
{
"id": 1,
"subnet": "192.168.10.0/24",
"pools": [ { "pool": "192.168.10.50 - 192.168.10.150" } ],
"option-data": [
{
"name": "routers",
"data": "192.168.10.1"
}
],
"reservations": [
{
"hw-address": "00:0C:29:16:3F:EF",
"ip-address": "192.168.10.88",
"hostname": "Windows11"
}
]
}
],
}
}

确认参数填写正确后就可以保存并退出配置文件,然后重启 Kea 服务程序即可。

root@linuxprobe:/etc/kea# systemctl restart kea-dhcp4

需要说明的是,如果你刚刚为这台主机分配了 IP 地址,由于它的 IP 地址租约时间还没有到期,因此不会立即换成新绑定的IP 地址。要想立即查看绑定效果,则需要重启客户端的网络服务,如图 14-8 所示。

图14-8 重启网卡设备

然后就能看到效果了,如图 14-9 所示。

图14-9 查看绑定后的网卡信息

复习题​

  1. 简述DHCP 的主要用途。

    答:为局域网内部的设备自动分配IP 地址等参数。

  2. DHCP 能够为客户端分配什么网络资源?

    答:可为客户端分配 IP 地址、子网掩码、网关地址以及 DNS 地址等信息。

  3. 真正供用户使用的IP 地址范围是作用域还是地址池?

    答:地址池,因为作用域内还会包含要排除掉的IP 地址。

  4. 简述DHCP 中“租约”的作用。

    答:租约分为默认租约时间和最大租约时间,用于在租约时间到期后自动回收主机的 IP地址,以免造成 IP 地址的浪费。

  5. 简述DHCP 中“预约”的作用。

    答:通过绑定 MAC 和 IP 地址,为指定的主机分配固定网卡信息,也可以理解成是预定服务。

  6. 简述DHCP 中“排除范围”的作用。

    答:确保排除范围内的IP 地址不会被分配给客户端。

  7. 把 IP 地址与主机的什么信息绑定,就可以保证该主机一直获取到固定的IP 地址?

    答:主机网卡的 MAC 地址。

  8. 在 Windows 10 系统中查看到的 MAC 地址,能直接进行绑定操作吗?

    答:不行,需要将间隔符由减号(-)改为冒号(:)。

  9. 在不直接查看客户端信息的情况下,如何获知客户端的 MAC 地址和已获得的 IP 地址信息?

    答:可在分配网络信息后,查阅服务器本地的日志文件/var/log/messages。

  10. 若已确认Kea 服务正常启动,但客户端始终无法获得网络信息,常见原因有哪些?

    答:Kea 服务所在的主机(即服务器)与客户端的网络模式不一致,物理上无法连通; 也可能是防火墙没有放行 DHCP 流量而导致的。