系统管理员网络接口配置文件指南

通过这份方便的教程,简化复杂的接口配置文件世界。
5 位读者喜欢这篇文章。
Why the operating system matters even more in 2017

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

在本系列的第一篇文章《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 网络连接文件。本系列的下一篇文章将介绍我如何进行切换。

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件方面的工作,自 1969 年以来一直从事计算机方面的工作。他是“系统管理员的 Linux 哲学”的坚定拥护者和传播者。

3 条评论

有趣的文章,谢谢。

在将您的配置修改为更现代的配置时,您为什么选择 NetworkManager 而不是 systemd-networkd?

目前,systemd-networkd 已安装但已禁用,因为它确实如此。NetworkManager 已启用,因此这是大多数人将使用的工具。systemd-timesyncd 也是如此。它在那里,但默认情况下不主动使用。这通常表明这些目前是前沿工具,可能尚未为黄金时段做好准备。

想要尝试这些高级工具的用户可以进行过渡。有许多 systemd-networkd 相关的手册页讨论了如何在两个方向上进行过渡。我还没有完全准备好过渡到 systemd-networkd。当它成为默认的网络管理工具时,我可能会这样做。

回复 作者 window7

谢谢 David,您的解释很棒,我从您那里学到了很多东西。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.