在本系列的第一篇文章《Linux 上 NetworkManager 入门》中,我研究了 NetworkManager 的功能以及它提供的一些用于查看网络连接和设备的工具。我讨论了使用 nmcli
命令来查看主机上网络设备和连接的状态。我还提到,对于大多数主机来说,NetworkManager 不需要接口配置文件。然而,它可以创建自己的 INI 风格的连接配置文件,并且它也识别较旧且现在已弃用的网络接口配置文件。
本文探讨了三个问题:
- 为什么我不使用接口配置文件?
- 为什么我使用接口配置文件?
- 为什么我使用旧的网络接口配置文件?
听起来很困惑?请继续阅读。
我的网络哲学
我经常谈论哲学。我甚至写了一本书《系统管理员的 Linux 哲学》,其中包含一些适用于计算机、操作系统和网络的设计和结构的原则。我不会用所有细节来烦扰您,但是在设计或重新设计网络时,有一些事情需要考虑。
作为一名“懒惰的系统管理员”,我喜欢“找到简单性”——是的,这是其中的两个原则——并创建一个优雅的网络设计。这不仅仅是关于网络组件和布线的物理设计和布局,尽管最好、最优雅、最容易操作的网络在物理上布局良好并且看起来也很棒。然而,本次讨论是关于网络的逻辑结构。
为什么我不使用接口配置文件?
我在我的网络上不使用接口配置文件,主要是因为每台主机都在启动时使用动态主机配置协议 (DHCP) 服务器进行动态配置。这允许对从几台计算机到数百甚至数千个系统的集中配置和管理。最重要的是,每台主机所需的所有配置数据都存储在 DHCP 配置文件 /etc/dhcp/dhcpd.conf
中,并在其中进行集中管理。
我通过使用为大多数连接的主机(所有主机,除了作为路由器并提供服务器服务的主机)提供集中管理的工具,从而在我的网络上施加简单性。这个想法是,使用 DHCP 提供大多数网络主机所需的所有网络配置数据可以简化我的工作,并让我成为“懒惰的系统管理员”。假设网络上发生了一些变化,例如默认网关或主域名服务器的 IP 地址?在单个位置,即 dhcpd.conf
文件中更改该信息,比在十台或一千台主机上更改静态配置要轻松得多。
当 DHCP 提供网络配置信息时,NetworkManager 不需要本地配置文件。默认情况下,所有 Fedora 和 Red Hat 主机都从 DHCP 服务器获取其网络配置。这使得在网络上安装新主机变得容易而简单。您只需要一台 DHCP 服务器。
对于大多数只有一个主机的网络,例如在家庭办公室中,有一两台笔记本电脑和一些其他设备,ISP 提供的无线路由器包含 DHCP 服务器,该服务器需要为您的所有设备提供完整的配置数据集。即使您使用大多数无线路由器背面的 4 端口有线交换机来连接有线台式计算机,路由器的 DHCP 服务器也会提供网络配置数据。
为什么我使用接口配置文件?
我的大多数网络主机都不需要静态网络配置,而是使用 DHCP。
但是,在两台主机上我确实使用了静态网络配置:我的网络服务器(运行 DHCP 服务器的服务器)和我用于网络/防火墙的 Linux 主机。最好使用不依赖于外部配置的静态设置来配置这两台主机。
花一分钟思考一下。如果 DHCP 服务器必须具有 IP 地址才能将网络配置信息(包括 IP 地址)发送给自己……好吧,这行不通——有点像网络等效的鸡和蛋的情况。
DHCP 客户端使用网络上的广播请求网络配置,服务器使用请求客户端的 MAC 地址响应此请求。DHCP 服务器也不能是 DHCP 客户端,因此这行不通。
即使可以使用 DHCP 服务器来设置自己的 IP 地址和其他网络配置属性,我在互联网上看到的所有建议都表明这将是一个非常糟糕的主意,并且没有哪个优秀的管理员会考虑这样做。
我用于路由器和防火墙的 Linux 主机有四个网络接口,其中三个当前处于活动状态,主板上有一个接口已损坏。它还具有一组必须始终保持一致的转发和路由规则。使用静态网络设置处理此配置是最好的。
例如,我的路由器上的一个接口连接到我的无线路由器的 WAN 侧。无线路由器为其 LAN 和 WiFi 侧连接的主机提供内部 DHCP 服务器,但依赖于 WAN 侧的静态或 DHCP 配置。因此,我使用静态设置配置无线路由器的 WAN 侧以及将其连接到我的 Linux 路由器的 NIC。
该 Linux 路由器上的另一个接口通过我的 ISP 提供的静态 IP 地址连接到外部世界。如果我将该接口设置为由 DHCP 配置,则 ISP 的路由器将为其提供我已分配的八个地址块中的剩余其他 IP 地址之一。
与 DHCP 相对的任何类型的静态网络配置都需要网络配置文件。
为什么我仍然使用旧式 ifcfg-<interface-name> 文件
这个答案非常简单。我只是还没有来得及进行切换。这些文件位于 /etc/sysconfig/network-scripts
目录中,幸运的是,NetworkManager 仍然会搜索并使用这些文件,如果它没有自己的网络连接文件。不会有任何网络连接文件,因为它们不会自动创建,而且我也不需要创建它们。
我打算在本系列的第 3 部分中进行切换,并将我的网络升级到当前的配置实践。然而,就目前而言,了解旧式网络配置文件仍然是一个好主意,因为仍然有很多文件存在。
我现在拥有的
我将回顾我的路由器上网络的当前状态。除了本地环回 (lo
)(在 Unix 和 Linux 主机上始终存在)之外,该主机目前有三个活动的网络接口卡 (NIC)。由于本系列第 1 部分中描述的板载 NIC 问题,我在该主机的 UEFI/BIOS 中禁用了它,因此它不再显示出来。我还禁用了 IPv6在我的网络上,因为我不需要它。
以下是 nmcli
命令,显示我的路由器/防火墙主机上 NIC 的状态:
[root@wally ~]# nmcli
np4s0: connected to enp4s0
"Realtek RTL8111/8168/8411"
ethernet (r8169), 84:16:F9:04:44:03, hw, mtu 1500
ip4 default
inet4 45.20.209.41/29
route4 45.20.209.40/29 metric 102
route4 default via 45.20.209.46 metric 102
enp1s0: connected to enp1s0
"Realtek RTL8111/8168/8411"
ethernet (r8169), 84:16:F9:03:E9:89, hw, mtu 1500
inet4 192.168.10.1/24
route4 192.168.10.0/24 metric 101
enp2s0: connected to enp2s0
"Realtek RTL8111/8168/8411"
ethernet (r8169), 84:16:F9:03:FD:85, hw, mtu 1500
inet4 192.168.0.254/24
route4 192.168.0.0/24 metric 100
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
interface: enp4s0
servers: 192.168.0.52 8.8.8.8
interface: enp2s0
servers: 192.168.0.52 8.8.8.8
interface: enp1s0
这些 NIC 中的每一个在 /etc/sysconfig/network-scripts/
目录中都有一个接口配置文件。这是因为它们最初是在 NetworkManager 或更早的网络服务在安装期间自动创建这些文件时安装的。由于 NetworkManager 继续识别这些文件,因此我没有迫切需要做任何不同的事情。
接口配置文件命名
幸运的是,你们大多数人都错过了我们这些老牌系统管理员在添加、删除或只是移动具有多个 NIC 的主机中的 NIC 硬件时曾经有过的乐趣。似乎每当有任何更改时,所有 NIC 都会被重命名。这意味着我需要确定每个 NIC 被赋予的名称,并修改接口配置文件以匹配正确的名称。
现在有了非常一致的 NIC 命名约定,该约定基于 NIC 在 PCIe 或 USB 数据总线上的逻辑位置。此约定创建于 2009 年左右,旨在消除这些问题。
它的工作原理——有点
udev
设备管理器检测到何时向系统添加了新设备(例如新的 NIC),并在不存在规则时创建规则以识别和命名它。在启动阶段的早期,Linux 内核使用 udev
来识别连接的设备,包括网络接口控制器。在此阶段,设备仍然以其传统名称 ethX 命名。此后不久,systemd
根据一系列分层命名方案重命名设备。
我以我的防火墙系统为例,说明具有多个网络连接的系统。您也可以在自己的 Linux 主机上执行此操作。
[root@wally ~]# dmesg | grep eth
[ 2.081738] r8169 0000:01:00.0 eth0: RTL8168e/8111e, 84:16:f9:03:e9:89, XID 2c2, IRQ 126
[ 2.081830] r8169 0000:01:00.0 eth0: jumbo features [frames: 9194 bytes, tx checksumming: ko]
[ 2.089218] r8169 0000:02:00.0 eth1: RTL8168e/8111e, 84:16:f9:03:fd:85, XID 2c2, IRQ 127
[ 2.089303] r8169 0000:02:00.0 eth1: jumbo features [frames: 9194 bytes, tx checksumming: ko]
[ 2.094383] r8169 0000:04:00.0 eth2: RTL8168e/8111e, 84:16:f9:04:44:03, XID 2c2, IRQ 128
[ 2.094467] r8169 0000:04:00.0 eth2: jumbo features [frames: 9194 bytes, tx checksumming: ko]
[ 2.142068] r8169 0000:01:00.0 enp1s0: renamed from eth0
[ 2.152128] r8169 0000:04:00.0 enp4s0: renamed from eth2
[ 2.161346] r8169 0000:02:00.0 enp2s0: renamed from eth1
[root@wally ~]#
此示例表明,在 Linux 启动序列开始两秒多一点后,找到了 ethX 网络设备,不到一秒后,它们被重命名为 enpXs0。
当前所有版本的 RHEL、CentOS 和 Fedora 都使用最新的 NIC 命名约定。大多数其他发行版也使用此命名约定。
这些发行版的 NIC 命名约定在 RHEL 7 文档“Networking Guide”中详细描述,并解释了名称的由来。RHEL 8 文档“Configuring and Managing Networking”中介绍了使用 NetworkManager 工具管理网络。
以下是 RHEL 7 “Networking Guide”第 11 章的摘录
- 方案 1:如果固件或 BIOS 中的信息适用且可用,则应用包含板载设备的固件或 BIOS 提供的索引号的名称(示例:eno1),否则回退到方案 2。
- 方案 2:如果固件或 BIOS 中的信息适用且可用,则应用包含固件或 BIOS 提供的 PCI Express 热插拔插槽索引号的名称(示例:ens1),否则回退到方案 3。
- 方案 3:如果适用,则应用包含硬件连接器物理位置的名称(示例:enp2s0),否则在所有其他情况下直接回退到方案 5。
- 方案 4:默认情况下不使用包含接口 MAC 地址的名称(示例:enx78e7d1ea46da),但如果用户选择,则可以使用。
- 方案 5:如果所有其他方法都失败,则使用传统的不可预测的内核命名方案(示例:eth0)。
修订后的命名方案的主要功能是提供一组一致的 NIC 名称,以便安装新的 NIC 甚至只是重新启动也不会导致 NIC 名称更改。仅凭这一点就非常值得进行这些更改。我有过很多次与单个主机上多个 ethX 设备明显随机重命名作斗争的机会。这远不如学习修订后的命名方案有趣。
了解接口配置文件
这些接口配置文件易于创建和修改。我的防火墙/路由器主机上的以下配置文件都位于 /etc/sysconfig/network-scripts
目录中。此目录以前包含用于管理网络连接的所有脚本,但 NetworkManager 使它们过时了。只有已弃用的接口配置文件可能仍保留在此目录中。
-rw-r--r-- 1 root root 381 Jan 11
2021 ifcfg-enp1s0
-rw-r--r-- 1 root root 507 Jul 27
2020 ifcfg-enp2s0
-rw-r--r-- 1 root root 924 Mar 31 14:24 ifcfg-enp4s0
这是将防火墙主机连接到我的家庭网络的接口的配置文件,您可以从注释中看到:
[root@wally network-scripts]# cat ifcfg-enp2s0
# Interface configuration file for enp2s0 / 192.168.0.254
# This interface is for the internal network
# Correct as of 20220711
HWADDR=84:16:f9:03:fd:85
NAME="enp2s0"
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.254
PREFIX=24
DNS1=192.168.0.52
DNS2=8.8.8.8
DEFROUTE=no
PEERDNS=yes
PEERROUTES=no
IPV4_FAILURE_FATAL=no
此文件用于相当简单的静态配置,该配置提供 IP 地址、CIDR 前缀和两个 DNS 服务器 IP 地址。未指定默认路由(网关)IP 地址,因为它在其他接口配置文件之一中配置。
下面的代码块显示了从我的 Linux 路由器到 ISP 路由器的连接的接口配置文件。它使用我的 ISP 提供给我的静态 IP 地址之一。
##############################################################################
# Interface configuration file for enp4s0 / 45.20.209.41
# This NIC was installed to circumvent problems with motherboard NIC, eno1.
------------------------------------------------------------------------------
# This interface is for the WAN - the AT&T fiber optic external network
# Correct as of 20220711
##############################################################################
TYPE= "Ethernet"
BOOTPROTO="static"
NM_CONTROLLED= "yes"
DEFROUTE= "yes"
NAME=enp4s0
UUID="fa2117dd-6c7a-44e0-9c9d-9c662716a352"
ONBOOT= "yes"
HWADDR=84:16:f9:04:44:03
IPADDR=45.20.209.41
PREFIX=29
GATEWAY=45.20.209.46
DNS1=192.168.0.52
DNS2=8.8.8.8
DNS3=8.8.4.4
PEERDNS=no
IPv6INIT=no
IPv6_AUTOCONF=no
IPv6_DEFROUTE=no
由于我不使用 IPv6 并且已禁用它,因此我可以删除这两个文件中的 IPv6 语句。
网络配置变量
下表列出了最常见的网络配置变量,以及每个变量的简要说明。许多 IPv6 选项在功能上等同于名称相似的 IPv4 选项。本地配置变量设置会覆盖 DHCP 服务器提供的设置。您可以使用 DHCP 配置主机,但使用接口配置文件来覆盖一个或多个 DHCP 配置变量。
配置变量 | 描述 |
---|---|
TYPE | 网络类型,例如以太网或令牌环网。 |
PROXY_METHOD | 代理配置方法。“none”表示不使用代理。 |
BROWSER_ONLY | 代理配置是否仅用于浏览器。 |
BOOTPROTO | 选项有 dhcp、bootp、none 和 static。“none”选项意味着 DHCP。 |
DEFROUTE | 此接口是此主机通往外部世界的默认路由。 |
IPv4_FAILURE_FATAL | 如果设置为“no”,则无法获得 IPv4 连接不会影响任何尝试建立 IPv6 连接。 |
NAME | 接口名称,例如 enp0s3。这应该与接口配置文件名中的接口名称匹配。 |
UUID | 接口的通用唯一标识符。它是使用接口名称的哈希创建的。HWADDR 是将文件绑定到硬件接口的较旧方法,我发现 UUID 可以被注释掉或删除而不会出现问题。 |
DEVICE | 此配置文件绑定到的接口名称。 |
ONBOOT | 如果为 yes,则在启动时(实际上是启动时间)启动此接口。如果设置为 no,则在用户在 GUI 中登录或手动启动接口之前,该接口不会启动。 |
HWADDR | 接口的 MAC 地址。这是文件中更重要的字段之一,因为它用于将文件绑定到正确的硬件接口。UUID 是最近添加的,也可以使用,但 HWADDR 是第一个也是使用更广泛的。 |
DNS1, DNS2 | 最多可以指定两个域名服务器。 |
USERCTL | 指定非特权用户是否可以启动和停止此接口。选项为 yes/no。 |
IPADDR | 分配给此 NIC 的 IP 地址。 |
BROADCAST | 此网络的广播地址,例如 10.0.2.255。 |
NETMASK | 此子网的子网掩码,例如 255.255.255.0。使用 NETMASK 或 PREFIX,但不要同时使用两者。 |
PREFIX | 网络的 CIDR 前缀,例如 24。使用 NETMASK 或 PREFIX,但不要同时使用两者。 |
NETWORK | 此子网的网络 ID,例如 10.0.2.0。 |
SEARCH | 在查找不合格主机名时要搜索的 DNS 域名,例如使用 studentvm1 而不是 studentvm1.example.com。 |
GATEWAY | 此子网的网络路由器或默认网关,例如 10.0.2.1。 |
PEERDNS | yes 值表示要修改 /etc/resolv.conf,方法是插入此文件中 DNS1 和 DNS2 选项指定的 DNS 服务器条目。No 表示不更改 resolv.conf 文件。当在 BOOTPROTO 行中指定 DHCP 时,默认为 Yes。 |
IPv6INIT | 是否初始化 IPv6。默认为 yes。 |
IPv6_AUTOCONF | Yes 表示在此接口上使用 DHCP 配置 IPv6。 |
IPv6_DEFROUTE | 此接口是此主机通往外部世界的 IPv6 默认路由。 |
IPv6_FAILURE_FATAL | 如果设置为“no”,则无法获得 IPv6 连接不会影响任何尝试建立 IPv4 连接。 |
IPv6_ADDR_GEN_MODE | 配置 IPv6 稳定隐私寻址。 |
此处列出的配置变量还有很多,但这些是最常用的变量。
最后的想法
仍然有很多 Linux 主机使用本文中描述的接口配置文件。尽管已被弃用,但 NetworkManager 仍然识别这些文件,并且可以使用它们来配置网络接口。但是,大多数现代 Linux 系统都使用 NetworkManager,因此除非它们服务于特殊的用例(如服务器或路由器),否则不需要配置文件。
我有几台主机需要的不仅仅是标准的 NetworkManager 配置。对我来说,从旧的接口配置文件更改为 NetworkManager 使用的当前连接配置文件一直不是优先事项。为了防止我的网络将来出现问题,我需要切换到 NetworkManager 网络连接文件。本系列的下一篇文章将介绍我如何进行切换。
3 条评论