第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 10 | 192.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 查看绑定后的网卡信息
复习题
-
简述DHCP 的主要用途。
答:为局域网内部的设备自动分配IP 地址等参数。
-
DHCP 能够为客户端分配什么网络资源?
答:可为客户端分配 IP 地址、子网掩码、网关地址以及 DNS 地址等信息。
-
真正供用户使用的IP 地址范围是作用域还是地址池?
答:地址池,因为作用域内还会包含要排除掉的IP 地址。
-
简述DHCP 中“租约”的作用。
答:租约分为默认租约时间和最大租约时间,用于在租约时间到期后自动回收主机的 IP地址,以免造成 IP 地址的浪费。
-
简述DHCP 中“预约”的作用。
答:通过绑定 MAC 和 IP 地址,为指定的主机分配固定网卡信息,也可以理解成是预定服务。
-
简述DHCP 中“排除范围”的作用。
答:确保排除范围内的IP 地址不会被分配给客户端。
-
把 IP 地址与主机的什么信息绑定,就可以保证该主机一直获取到固定的IP 地址?
答:主机网卡的 MAC 地址。
-
在 Windows 10 系统中查看到的 MAC 地址,能直接进行绑定操作吗?
答:不行,需要将间隔符由减号(-)改为冒号(:)。
-
在不直接查看客户端信息的情况下,如何获知客户端的 MAC 地址和已获得的 IP 地址信息?
答:可在分配网络信息后,查阅服务器本地的日志文件/var/log/messages。
-
若已确认Kea 服务正常启动,但客户端始终无法获得网络信息,常见原因有哪些?
答:Kea 服务所在的主机(即服务器)与客户端的网络模式不一致,物理上无法连通; 也可能是防火墙没有放行 DHCP 流量而导致的。