第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地址。
DHCP应用十分广泛,无论是服务器机房还是家庭、机场、咖啡馆,都会见到它的身影。比如,本书的一位读者开了家咖啡厅,在为顾客提供香醇咖啡的同时,还为顾客免费提供无线上网服务。这样一来,顾客就能一边惬意地喝着咖啡,一边连着无线网络刷朋友圈了。但是,作为咖啡厅老板的您,肯定不希望(也没有时间)为每一位造访的顾客手动设置IP地址、子网掩码和网关地址等信息。另外,考虑到咖啡馆使用的内网网段一般为192.168.10.0/24(C类私有地址),最多可容纳200多台主机,而咖啡厅一天的客流量肯定不止200人。如果采用手动方式为他们分配IP地址,则当他们在离开咖啡厅时并不会自动释放这个IP地址,这就可能出现IP地址不够用的情况。这一方面会造成IP地址的浪费,另外一方面也增加了IP地址的管理成本。而使用DHCP,这一切都迎刃而解—老板只需安心服务好顾客,为其提供美味的咖啡;顾客通过运行DHCP的服务器自动获得上网所需的IP地址,等离开咖啡厅时IP地址将被DHCP服务器收回,以备其他顾客使用。
图14-1 DHCP协议的拓扑示意图
既然确定在今后的生产环境中肯定离不开DHCP了,那么也就有必要好好地熟悉一下DHCP涉及的常见术语了。
作用域:一个完整的IP地址段,DHCP根据作用域来管理网络的分布、IP地址的分配及其他配置参数。
超级作用域:用于管理处于同一个物理网络中的多个逻辑子网段,它包含了可以统一管理的作用域列表。
排除范围:把作用域中的某些IP地址排除,确保这些IP地址不会分配给DHCP客户端。
地址池:在定义了DHCP的作用域并应用了排除范围后,剩余的用来动态分配给客户端的IP地址范围。
租约:DHCP客户端能够使用动态分配的IP地址的时间。
预约:保证网络中的特定设备总是获取到相同的IP地址。
14.2 部署Kea服务程序
红帽RHEL 10系统已彻底的移除了大家熟悉的传统ISC DHCP服务软件包——dhcp-server,也就是dhcpd服务,并选用了ISC Kea作为新一代DHCP服务程序。虽然理论知识上一致,但配置起来还是有很大区别的,读者们接下来的操作一定要细心。
在确认软件仓库配置妥当之后,安装ISC 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行了。此时我们可以先通过表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 | 定义客户端保留地址时使用的标识符类型(如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服务程序收到这条信息后,也不会再把这个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系统中查看到的MAC地址,能直接进行绑定操作吗?
答:不行,需要将间隔符由减号(-)改为冒号(:)。
9.不能直接查看客户端信息的情况下,如何获知对方的MAC和已获得IP地址信息?
答:可在分配网卡信息后,查阅服务器本地的日志文件:“/var/log/messages”。
10.若已确认Kea服务已正常启动,但客户端怎样都无法获得网卡信息,常见有哪些原因?
答:常见于两台主机的网络模式不一致,物理上无法连通。也可能由防火墙导致,需手动放行下dhcp协议。