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

通过本实用教程,简化复杂的接口配置文件世界。
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-<接口名称> 文件

这个问题的答案很简单。我只是还没有抽出时间来进行转换。这些文件位于 /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 网络连接文件。本系列的下一篇文章将介绍我如何进行切换。

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,你的解释很棒,我从你那里学到了很多东西。

知识共享许可协议本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.