动态主机配置协议 (DHCP) 提供了一种集中式和自动化的方法,用于在主机连接到网络时配置主机的网络属性。 DHCP 服务器将 IP 地址分配给主机,以及配置信息,例如 DNS 服务器、用于 DNS 搜索的域名、默认网关、NTP(网络时间协议)服务器、必要时可以执行网络启动的服务器等等。 DHCP 消除了单独配置每个网络主机的需要。
DHCP 对于配置笔记本电脑、移动电话、平板电脑和其他可能作为未知访客连接的设备也很有用。 此配置对于公共场所的 WiFi 访问是典型的。 但是,DHCP 在封闭的专用网络中使用时,通过使用中央 DHCP 数据库管理已知主机的静态 IP 地址分配,可以提供更多优势。
DHCP 服务器使用系统管理员创建的信息数据库。 此数据库完全包含在 /etc/dhcp/dhcpd.conf
配置文件中。 DHCPD 代表 *DHCP 守护程序*,它是后台服务器进程。 像所有精心设计的 Linux 配置文件一样,它是一个简单的 ASCII 纯文本文件。 这种结构意味着它是开放的并且是可知的。 可以通过标准的简单文本操作工具(如 cat
和 grep
)对其进行检查,并且可以通过任何文本编辑器(如 EMACS 或 Vim)或流编辑器(如 sed
)对其进行修改。
DHCP 客户端始终安装在 Linux 主机上 - 至少在基于 Red Hat 的发行版和我尝试过的所有其他发行版上 - 因为它们很可能使用 DHCP 而不是静态配置连接到网络。
当配置为 DHCP 的主机启动或其 NIC 被激活时,它会向网络发送广播请求,要求 DHCP 服务器响应。 客户端和服务器进行一些对话,服务器将配置数据发送到客户端,客户端使用它来配置其网络连接。 主机可以有多个 NIC 连接到不同的网络。 任何或所有都可以使用 DHCP 或静态配置进行配置。 我将使本文的设置保持简单,只有几个主机 - 我自己的个人网络。
网络描述
本文使用我自己的网络进行说明。 这比在虚拟网络上使用一组虚拟机更有趣和更现实。 我网络上的每个主机都安装了 Fedora 36 Xfce spin。 由于我渴望进行实验,因此我的网络比标准家庭或小型企业网络更小,但包含更复杂的网络配置。
在设置 DHCP 之前,我创建了一个网络地址映射,如图 1 所示。此图包括每个主机的 MAC 地址、IP 地址和 NIC 名称。 该映射使我能够可视化我网络的逻辑结构,并确定哪些主机需要 DHCP 配置,哪些主机需要静态 IP 配置。
NIC |
MAC |
静态/DHCP |
IP 地址 |
注释 |
wally1 |
|
|
主防火墙和路由器 |
|
eno1 |
04:d9:f5:1c:d5:c5 |
静态 |
不适用 |
由于错误而被禁用 |
enp1s0 |
84:16:f9:03:e9:89 |
静态 |
192.168.10.1/24 |
SSID Linux Boy |
enp2s0 |
84:16:f9:03:fd:85 |
静态 |
192.168.0.254/24 |
内部网络 |
enp4s0 |
84:16:f9:04:44:03 |
静态 |
45.20.209.41/29 |
WAN 连接 |
|
|
|
|
|
yorktown |
|
|
主服务器 |
|
enp0s31f6 |
e0:d5:5e:a2:de:a4 |
静态 |
192.168.0.52/24 |
DHCP、NTP、DNS、HTTP 等 |
|
|
|
|
|
david |
|
|
主工作站 |
|
enp0s31f6 |
b0:6e:bf:3a:43:1f |
DHCP |
192.168.0.1/24 |
|
|
|
|
|
|
bunkerhill |
|
|
测试工作站 |
|
eno1 |
2c:f0:5d:26:c2:09 |
DHCP |
192.168.0.9/24 |
|
|
|
|
|
|
enterprise |
|
|
工作站 |
|
eno1 |
30:9c:23:e9:a4:e6 |
DHCP |
192.168.0.2/24 |
|
|
|
|
|
|
essex |
|
|
测试工作站 |
|
eno1 |
e0:69:95:45:c4:cd |
DHCP |
192.168.0.6/24 |
|
intrepid |
|
|
测试工作站 |
|
enp0s25 |
00:1e:4f:df:3a:d7 |
DHCP |
192.168.0.5/24 |
|
|
|
|
|
|
wasp |
|
|
测试工作站 |
|
eno1 |
e8:40:f2:3d:0e:a8 |
DHCP |
192.168.0.8/24 |
|
|
|
|
|
|
hornet |
|
|
测试工作站 |
|
enp0s25 |
e0:69:95:3c:07:37 |
DHCP |
192.168.0.07/24 |
|
|
|
|
|
|
voyager |
|
|
笔记本电脑 |
|
enp111s0 |
80:fa:5b:63:37:88 |
DHCP |
192.168.0.201/24 |
|
图 1:网络地址映射
yorktown 服务器托管 DHCP 服务和我的其余服务器服务。 主机 wally 是我的防火墙和路由器。 主机 yorktown 和 wally 都使用静态网络配置,其余主机使用 DHCP 配置,如图 1 所示。
安装 DHCP 服务器
首先,我检查了 DHP 安装状态,然后安装了 DHCP 服务器,如图 2 所示。
[root@yorktown ~]# dnf list installed dhcp*
Installed Packages
dhcp-client.x86_64 12:4.3.6-28.fc29 @anaconda
dhcp-common.noarch 12:4.3.6-28.fc29 @anaconda
dhcp-libs.x86_64 12:4.3.6-28.fc29 @anaconda
[root@yorktown ~]#
图 2:检查我的服务器上安装了哪些 DHCP 包。
默认情况下未安装 DHCP 服务器,所以我自己添加了它。 此任务必须以 root 身份执行。 结果表明 DHCP 客户端已安装,以及客户端、服务器以及可能的 DHCP 开发包通用的库和支持文件。 DHCP 服务器未安装,因此我使用图 3 中的命令安装了它。
[yorktown ~]# dnf install -y dhcp-server
Last metadata expiration check: 2:39:06 ago on Wed 26 Dec 2018 12:19:46 PM EST.
Dependencies resolved.
=================================================================================================
Package Arch Version Repository Size
=================================================================================================
Installing:
dhcp-server x86_64 12:4.3.6-28.fc29 fedora 431 k
[...]
Installed:
dhcp-server-12:4.3.6-28.fc29.x86_64
Complete!
图 3:安装 DHCP 服务器软件包。
这很容易,并且不需要重启服务器。
配置 DHCP 服务器
安装 DHCP 服务器后,下一步是配置服务器。 在同一网络上拥有多个 DHCP 服务器可能会导致问题,因为没有人会知道哪个 DHCP 服务器正在向客户端提供网络配置数据。 但是,一台主机上的单个 DHCP 服务器可以侦听多个网络,并向多个网络上的客户端提供配置数据。
DHCP 可以为网关和其他服务器提供 DNS 名称。 例如,NTP 服务器可以使用该服务器的主机名 (NTP1) 而不是 IP 地址。 大多数情况下,这效果很好,但如果 DNS 名称服务服务器被禁用或者我自己的服务器不存在,则此配置可能会导致问题。
图 1 中指定的 IP 地址是 DHCP 将分配给我内部网络上的主机的 IP 地址。 我已为我的网络随意选择了这些 IP 地址。
对于您的网络,主机名、MAC 地址和 IP 地址等详细信息将有所不同,但基本要求将是相同的。
dhcpd.conf 文件
作为 root 用户,您可以查看现有的 dhcpd.conf
文件,该文件在首次安装时不起作用。 将 /etc/dhcp
设置为 PWD,然后 cat
dhcpd.conf
文件以查看内容。 文件中没有太多内容,但它确实指向一个名为 /usr/share/doc/dhcp-server/dhcpd.conf.example
的示例文件,您可以阅读该文件以了解 dhcpd.conf
文件的主要组件和语法。 我强烈建议您阅读此示例文件。
多年前,当我第一次决定迁移到 DHCP 配置用于我的网络时,我从以前版本的示例文件开始。 我在此部分中添加的注释表明它可能基于 Fedora 18 版本的 dhcpd.conf
,并且我的文件仍然基于该旧文件。 我保留了许多原始注释,并在我的最终文件中注释掉了默认设置。 由于此文件旨在作为指南和工作 dhcpd.conf
配置的基础,因此我决定尽可能多地保留原样,以防我以后需要该信息。
dhcpd.conf(5)
手册页还包含 DHCP 服务器可能需要的各种配置语句的出色描述。
任何 dhcpd.conf
文件中都有两个主要部分。 全局部分包含此服务器为其提供 DHCP 服务的的所有子网的设置。 第二部分是子网声明。 如果此服务器为多个网络提供 DHCP 服务,则可以使用多个子网声明。
语法
dhcpd 服务对其对 dhcpd.conf
文件的解释非常严格。 每个子网和每个在每个子网中声明的主机必须以大括号 ({}
) 开头和结尾,并且所有语句必须以分号 (;
) 结尾。 过去,缺少大括号不止一次给我带来了很多痛苦和咬牙切齿。 子网声明的大括号也包围着主机声明,因为主机声明需要位于子网声明内。
全局部分
此全局部分(如图 4 所示)包含 DHCP 服务的子网通用的全局配置项。 我只有一个子网,但我仍然将这些语句放在全局部分中,因为它们对于所有子网来说可能都是相同的。 如果它们对于给定的子网有所不同,则在子网声明中创建具有不同值的语句将覆盖全局声明。
由于我只有一个网络,因此我保留了在此示例文件的此部分中找到的选项声明,因为我没有理由更改或删除它们。
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
# see dhcpd.conf(5) man page
#
#
# Changes based on the sample dhcpd.conf for Fedora 18.
# option definitions common to all supported networks...
# option domain-name "example.org";
# option domain-name-servers ns1.example.org, ns2.example.org;
#
# All networks get the default lease times
default-lease-time 7200; # 2 hours
max-lease-time 14400; # 4 hours
# Use this to enable / disable dynamic dns updates globally.
ddns-update-style none;
#
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
#
# ignore client-updates;
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
#
图 4:dhcpd.conf
文件的全局部分。
我在此部分中对原始文件进行了三处更改
- 默认租约时间:我设置了以秒为单位的默认租约时间。此设置决定了客户端主机必须刷新 IP 地址租约的频率。如果客户端频繁连接和断开连接,则较短的时间是有利的。默认租约时间为 10 分钟非常短,因此我将其设置为两个小时。我还将最长租约时间从两个小时更改为四个小时。
- 动态 DNS:我禁用了动态 DNS,因为我在我的网络中不使用它。
- 权威服务器:我指定此服务器是我网络的权威 DHCP 服务器。
子网部分
dhcpd.conf
文件的子网部分包含两个小节。第一个小节包含定义子网中所有主机共有的值。主机声明小节包含由 DHCP 具体管理的所有主机的声明。
子网部分的通用部分
子网部分的通用小节(如图 5 所示)为该子网的主机小节中声明的所有主机设置了许多通用值。我在第一行中将子网定义为旧式分类法中的 C 类范围 192.168.0.0,子网掩码为 255.255.255.0。这在无类别域间路由 (CIDR) 网络表示法中转换为 192.168.0.0/24。
我没有在任何文档中看到 dhcpd.conf
文件可以在此时使用 CIDR 表示法 进行 IPv4 操作的任何指示。dhcpd.conf
手册页表明您可以对 IPv6 使用 CIDR 表示法。
此小节指定路由器 IP 地址和网络掩码、域名和 DNS 域搜索名称。当执行查询中未指定域名时,将使用域名搜索名称。当指定诸如 ping essex
之类的命令时,将对 essex.both.org
执行 DNS 搜索。
由于我不使用 NIS 域名,因此我注释掉了该选项。
本节还向客户端提供 DNS 服务器 列表。客户端按列出顺序搜索这些服务器。我使用 Google DNS 服务器作为内部 DNS 服务器的备份,部分原因是我在 Google Domains 中注册了我的域名。
subnet 192.168.0.0 netmask 255.255.255.0 {
# --- default gateway
option routers 192.168.0.254;
option subnet-mask 255.255.255.0;
# option nis-domain "both.org";
option domain-name "both.org";
option domain-search "both.org";
option domain-name-servers 192.168.0.52, 8.8.8.8, 8.8.4.4;
option time-offset -18000; # Eastern Standard Time
option ntp-servers 192.168.0.52;
# option netbios-name-servers 192.168.0.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type 2;
################################################################################
# Dynamic DHCP allocation range for otherwise unknown hosts #
################################################################################
range dynamic-bootp 192.168.0.220 192.168.0.229;
# default-lease-time 21600;
# max-lease-time 43200;
图 5:我的网络的子网部分的通用小节。
我指定了我的本地 网络时间协议 (NTP) 服务器以及与 GMT 的偏移量。此服务同步我所有主机上的时间。
还可以使用 DHCP 配置访客主机(如笔记本电脑和其他移动设备)的网络设置。我没有这些计算机的任何信息(例如 MAC 地址),但仍然必须分配 IP 地址。在大多数情况下,访客主机必须信任 DHCP 服务。我不喜欢我的网络上有访客,因此我通常将访客主机降级到第二个网络子网。此方法可以保护我的主网络,因为访客主机无法访问它。
我的 dhcpd.conf
文件中此部分的最后一个活动行指定了可能插入我的有线网络的设备的一小部分 IP 地址范围。例如,当我确定笔记本电脑和台式机系统没有感染时,我会将它们插入到我的网络中进行工作,通常仅在我擦除硬盘驱动器并安装 Linux 后才这样做。我从不将 Windows 计算机直接连接到我的网络。
原始示例文件对此第一个子网使用了与我在全局部分中指定的租约时间不同的租约时间,因此我已将其注释掉。
子网部分的主机声明部分
图 6 所示的子网部分是声明各个主机的位置。每个主机都需要一个名称、其 NIC 的 MAC 地址以及它将始终使用的固定地址。
我在此主机声明小节中使用注释来帮助定义和记录我的网络的地址结构。我还使用 DNS 区域文件中的注释来记录相同的信息。
################################################################################
# The range from 192.168.0.1 - 20 is for my personal hosts and workstations. #
################################################################################
# david
host david {
hardware ethernet b0:6e:bf:3a:43:1f;
fixed-address 192.168.0.1;
}
# bunkerhill
host alice {
hardware ethernet 30:9C:23:E9:A4:E6;
fixed-address 192.168.0.2;
}
# intrepid
host intrepid {
hardware ethernet 00:1e:4f:df:3a:d7;
fixed-address 192.168.0.5;
}
# essex
host essex {
hardware ethernet E0:69:95:45:C4:CD;
fixed-address 192.168.0.6;
}
# Hornet
host hornet {
hardware ethernet e0:69:95:3c:07:37;
fixed-address 192.168.0.7;
}
# Wasp
host wasp {
hardware ethernet e8:40:f2:3d:0e:a8;
fixed-address 192.168.0.8;
}
# bunkerhill
host bunkerhill {
hardware ethernet 2c:f0:5d:26:c2:09;
fixed-address 192.168.0.9;
}
################################################################################
# IP Addresses between 192.168.0.50 and 192.168.0.59 are for physical servers #
# which always use static IP addressing. #
################################################################################
################################################################################
# The range from 192.168.0.70 - 80 is for network printers. #
################################################################################
host brother1 {
hardware ethernet 30:05:5C:71:F7:7C;
fixed-address 192.168.0.70;
}
################################################################################
# The range from 192.168.0.91 - 100 is for various hosts under test #
################################################################################
host test1 {
hardware ethernet 00:1E:4F:B1:EB:78;
fixed-address 192.168.0.91;
}
host admin {
hardware ethernet 00:22:4d:a6:5c:1b;
fixed-address 192.168.0.92;
}
################################################################################
# The range from 192.168.0.100 to 192.168.0.150 is for most virtual machines. #
################################################################################
host testvm1 {
hardware ethernet 08:00:27:7B:A7:0C;
fixed-address 192.168.0.101;
}
host testvm2 {
hardware ethernet 08:00:27:BE:E1:02;
fixed-address 192.168.0.102;
}
host fedora35vm {
hardware ethernet 08:00:27:A8:E7:4F;
fixed-address 192.168.0.135;
}
host fedora36vm {
hardware ethernet 08:00:27:07:CD:FE;
fixed-address 192.168.0.136;
}
################################################################################
# The range from 192.168.0.160 - 192.168.0.179 is reserved #
################################################################################
################################################################################
################################################################################
################################################################################
# The range from 192.168.0.180 to 192.168.0.189 is for virtual machines used #
# in book research. These addresses usually connect to a second or third NIC #
# for those hosts to provide a back-door access. #
################################################################################
################################################################################
################################################################################
# Adapter 2
host studentvm1 {
hardware ethernet 08:00:27:C4:6E:06;
fixed-address 192.168.0.181;
}
# Adapter 2
host studentvm2 {
hardware ethernet 08:00:27:9F:67:CB;
fixed-address 192.168.0.182;
}
################################################################################
# The range from 192.168.190 - 199 is for windows and other strange stuff #
################################################################################
# Windows10 VM
host win10 {
hardware ethernet 08:00:27:8C:79:E8;
fixed-address 192.168.0.190;
}
################################################################################
# The range from 192.168.0.200 - 209 is for mobile and miscellaneous devices #
################################################################################
# voyager (System76 Oryx Pro 4)
host voyager {
hardware ethernet 80:fa:5b:63:37:88;
fixed-address 192.168.0.201;
}
# voyager2 (System76 Oryx Pro 6)
host voyager2 {
hardware ethernet 80:fa:5b:8d:c6:75;
fixed-address 192.168.0.202;
}
}
图 6:dhcpd.conf
文件的主机声明部分。
可以为任何子网或子网中的任何主机进行不同的选项声明。例如,一个子网可能指定与其余子网不同的路由器,或者一个主机可能使用与子网中其他主机不同的路由器。
为了激活新的 DHCP 配置,我启动、启用并验证了 DHCP 服务,如图 7 所示。
[yorktown ~]# systemctl start dhcpd
[yorktown ~]# systemctl enable dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
[yorktown ~]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/dhcpd.service.d
└─override.conf
Active: active (running) since Sun 2022-06-26 15:57:12 EDT; 11s ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Process: 1347205 ExecStartPre=/bin/sleep 60 (code=exited, status=0/SUCCESS)
Main PID: 1347220 (dhcpd)
Status: "Dispatching packets..."
Tasks: 1 (limit: 38318)
Memory: 4.9M
CPU: 15ms
CGroup: /system.slice/dhcpd.service
└─ 1347220 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
Jun 26 15:57:12 yorktown.both.org dhcpd[1347220]: Wrote 10 leases to leases file.
Jun 26 15:57:12 yorktown.both.org dhcpd[1347220]: Listening on LPF/enp0s31f6/e0:d5:5e:a2:de:a4/192.168.0.0/24
Jun 26 15:57:12 yorktown.both.org dhcpd[1347220]: Sending on LPF/enp0s31f6/e0:d5:5e:a2:de:a4/192.168.0.0/24
Jun 26 15:57:12 yorktown.both.org dhcpd[1347220]: Sending on Socket/fallback/fallback-net
Jun 26 15:57:12 yorktown.both.org dhcpd[1347220]: Server starting service.
Jun 26 15:57:12 yorktown.both.org systemd[1]: Started dhcpd.service - DHCPv4 Server Daemon.
Jun 26 15:57:16 yorktown.both.org dhcpd[1347220]: DHCPREQUEST for 192.168.0.2 from 30:9c:23:e9:a4:e6 via enp0s31f6
Jun 26 15:57:16 yorktown.both.org dhcpd[1347220]: DHCPACK on 192.168.0.2 to 30:9c:23:e9:a4:e6 via enp0s31f6
Jun 26 15:57:17 yorktown.both.org dhcpd[1347220]: DHCPREQUEST for 192.168.0.8 from e8:40:f2:3d:0e:a8 via enp0s31f6
Jun 26 15:57:17 yorktown.both.org dhcpd[1347220]: DHCPACK on 192.168.0.8 to e8:40:f2:3d:0e:a8 via enp0s31f6
图 7:启动并验证 DHCP 服务器是否启动且没有错误。在此示例中,您甚至可以看到几个已完成的请求。
状态命令不应有任何错误,但是,像我的服务器一样,可能有几个语句指示 DHCP 守护程序正在侦听特定的 NIC 以及 NIC 的 MAC 地址。如果此信息不正确,请验证 dhcpd.conf
文件是否有效并重新启动 DHCP 服务器。如果配置中存在语法错误,它们将出现在状态报告中。
我还在我的一些主机上运行了图 8 所示的命令,以验证网络是否配置了正确的 IP 地址、路由器和 DNS 服务器。此命令显示每个主机上安装的 NIC,包括环回设备 lo。
[essex ~]# nmcli
eno1: connected to Wired connection 1
"Intel 82579V"
ethernet (e1000e), E0:69:95:45:C4:CD, hw, mtu 1500
ip4 default
inet4 192.168.0.6/24
route4 192.168.0.0/24 metric 100
route4 default via 192.168.0.254 metric 100
inet6 fe80::3220:6681:4348:71df/64
route6 fe80::/64 metric 1024
lo: unmanaged
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
DNS configuration:
servers: 192.168.0.52 8.8.8.8 8.8.4.4
domains: both.org
interface: eno1
图 8:验证 DHCP 是否向主机提供了正确的数据。
总结
DHCP 向网络上的客户端主机提供网络配置数据,从而实现集中式网络配置管理。DHCP 服务器可以向客户端提供各种配置选项,包括连接到网络可能需要的许多 Windows 主机。此配置数据包括网关路由器、NTP 服务器、DNS 服务器、PXE 引导服务器等等。
我对大多数主机使用 DHCP,因为从长远来看,这比在每台主机上进行静态配置的工作量要少。新安装主机上的 NetworkManager 的默认设置为使用 DHCP。
1 条评论