在本系列的第一篇文章中,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-<接口名称> 文件
这个问题的答案很简单。我只是还没有抽出时间来进行转换。这些文件位于 /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 命名约定。大多数其他发行版也使用此命名约定。
RHEL 7 文档“Networking Guide”详细描述了这些发行版的 NIC 命名约定,并解释了名称的由来。使用 NetworkManager 工具管理网络在 RHEL 8 文档“Configuring and Managing Networking”中进行了介绍。
以下是 RHEL 7 “Networking Guide”第 11 章的摘录
- 方案 1:如果固件或 BIOS 提供的板载设备的索引号适用且可用,则应用包含该信息的名称(示例:eno1),否则回退到方案 2。
- 方案 2:如果固件或 BIOS 提供的 PCI Express 热插拔插槽索引号适用且可用,则应用包含该信息的名称(示例:ens1),否则回退到方案 3。
- 方案 3:如果适用,则应用包含硬件连接器的物理位置的名称(示例:enp2s0),否则直接回退到方案 5,适用于所有其他情况。
- 方案 4:默认情况下不使用包含接口 MAC 地址的名称(示例:enx78e7d1ea46da),但如果用户选择,则可以使用。
- 方案 5:如果所有其他方法都失败,则使用传统的不可预测的内核命名方案(示例:eth0)。
修订后的命名方案的主要功能是提供一组一致的网卡名称,以便安装新的网卡甚至只是重新启动都不会导致网卡名称更改。光是这一点就非常值得做出这些改变。我有很多机会与单个主机上看似随机重命名的多个 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 | 分配给此网卡的 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 | 在对非限定主机名(例如使用 studentvm1 而不是 studentvm1.example.com)进行查找时要搜索的 DNS 域名。 |
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 表示对该接口上的 IPv6 使用 DHCP 进行配置。 |
IPv6_DEFROUTE | 此接口是此主机连接到外部世界的 IPv6 默认路由。 |
IPv6_FAILURE_FATAL | 如果设置为“no”,则无法获得 IPv6 连接不会影响任何尝试建立 IPv4 连接的操作。 |
IPv6_ADDR_GEN_MODE | 配置 IPv6 稳定隐私寻址。 |
配置变量远不止此处列出的这些,但这些是使用最频繁的变量。
最后的想法
仍然有很多 Linux 主机使用本文中描述的接口配置文件。尽管已被弃用,但 NetworkManager 仍然可以识别这些文件,并可以使用它们来配置网络接口。但是,大多数现代 Linux 系统都使用 NetworkManager,因此除非它们用于特殊用途(如服务器或路由器),否则不需要任何配置文件。
我有一些主机需要的不仅仅是标准的 NetworkManager 配置。对我来说,从旧的接口配置文件更改为 NetworkManager 使用的当前连接配置文件一直不是优先事项。为了防止将来出现网络问题,我需要切换到 NetworkManager 网络连接文件。本系列的下一篇文章将介绍我如何进行切换。
3 条评论