之前介绍了NetworkManager的作用以及它为查看网络连接和设备提供的一些工具。我讨论了使用nmcli 命令来查看主机上的网络设备和连接的状态。我还提到NetworkManager不需要大多数主机的接口配置文件。然而,它可以创建自己的INI风格的连接配置文件,而且它可以识别旧的、现在已经废弃的网络接口配置文件。
本文探讨了三个问题:
- 为什么我不使用接口配置文件?
- 我为什么要使用接口配置文件?
- 为什么我使用旧的网络接口配置文件?
我的网络哲学
我经常谈及哲学,有适用于计算机、操作系统和网络的设计和结构的信条。我不会用所有的细节来烦扰你,但在设计或重新设计网络时,有一些事情需要考虑。
作为一个 "懒惰的系统管理员",我喜欢 "寻找简单"--是的,这是其中的两个原则--创造一个优雅的网络设计。这不仅仅是关于网络组件和线路的物理设计和布局,尽管最好的、最优雅的、最容易工作的网络都是物理布局良好的,看起来也不错。然而,这次讨论是关于网络的逻辑结构。
为什么我不使用接口配置文件?
我不在我的网络上使用接口配置文件,主要是因为每台主机都是在启动时使用动态主机配置协议(DHCP)服务器进行动态配置的。这允许集中配置和管理从几台计算机到数百甚至数千台系统。底线是,每台主机所需的所有配置数据都存储在DHCP配置文件中,/etc/dhcp/dhcpd.conf ,在那里进行集中管理。
我通过使用为大多数连接的主机提供集中管理的工具来使我的网络变得简单--所有作为路由器和提供服务器服务的主机除外。我的想法是,使用DHCP来提供大多数网络主机所需的所有网络配置数据,可以简化我的工作,让我成为一个 "懒惰的系统管理员"。假设网络上有什么变化,例如默认网关的IP地址或主名称服务器的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路由器的网卡上都用静态设置进行了配置。
该 Linux 路由器上的另一个接口通过我的 ISP 提供的静态 IP 地址连接到外部世界。如果我将该接口设置为由DHCP配置,ISP的路由器将为其提供我所分配的8个地址块中的一个其他IP地址。
任何类型的静态网络配置,相对于DHCP来说,都需要网络配置文件。
为什么我仍然使用老式的ifcfg-<interface-name>文件?
这个问题的答案其实很简单。我只是还没来得及做这个转换。这些文件位于/etc/sysconfig/network-scripts 目录中,幸运的是,如果NetworkManager没有自己的网络连接文件,它仍然会搜索并使用这些文件。不会有任何网络连接文件,因为它们不会被自动创建,而且我也不需要创建它们。
我打算在本系列的第三部分进行转换,使我的网络达到目前的配置做法。然而,现在,了解旧式的网络配置文件仍然是一个好主意,因为周围仍然有很多这样的文件。
我现在有什么
我将回顾一下我的路由器上的网络现状。除了本地环路(lo)--这在Unix和Linux主机上总是存在的--这台主机目前有三个活跃的网络接口卡(NIC)。由于本系列第一部分中描述的板载网卡的问题,我在这台主机的UEFI/BIOS中停用了它,使它不再显示。我还在我的网络上禁用了IPv6,因为我不需要它。
下面是nmcli 命令,显示了我的路由器/防火墙主机上的网卡的状态。
[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
这些网卡中的每一个都有一个接口配置文件,在/etc/sysconfig/network-scripts/ 目录中。这是因为它们最初安装的时候,NetworkManager 或者早期的网络服务在安装时自动创建了这些文件。由于NetworkManager继续识别这些文件,所以我没有迫切的需要做任何不同的事情。
接口配置文件的命名
幸运的是,你们中的大多数人都错过了我们这些老系统管理员在添加、删除或仅仅是移动带有多个网卡的主机中的网卡硬件时的一些乐趣。似乎每当有什么变化时,所有的网卡都会被重新命名。这意味着我需要确定每个网卡的名称,并修改接口配置文件以匹配正确的名称。
现在有非常一致的网卡命名惯例,基于网卡在PCIe或USB数据总线上的逻辑位置。这个惯例是在2009年左右创建的,以消除这些问题。
它是如何工作的--某种程度上
udev 设备管理器检测系统中是否有新的设备,如新的网卡,并创建一个规则来识别和命名它,如果不存在的话。在启动阶段的早期,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 "中详细描述,并解释了这些名称的由来。使用NetworkManager工具来管理网络,在RHEL 8文件 "配置和管理网络 "中有所介绍。
以下是RHEL 7 "网络指南 "第11章的摘录。
- 方案1:如果固件或BIOS提供的板载设备的索引号(例如:eno1)适用于固件或BIOS中的信息,否则将回到方案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配置变量。
在旧式网络接口配置文件中发现的一些比较常见的配置变量。
| 配置变量 | 描述 |
|---|---|
| 类型 | 网络的类型,如以太网或令牌环。 |
| PROXY_METHOD | 代理配置方法。"none "表示没有使用代理。 |
| BROWSER_ONLY | 代理配置是否只用于浏览器。 |
| BOOTPROTO | 选项有dhcp、bootp、none和static。none "选项意味着DHCP。 |
| DEFROUTE | 该接口是该主机通往外界的默认路由。 |
| IPv4_FAILURE_FATAL | 如果该选项被设置为 "no",获得IPv4连接的失败将不影响任何试图进行IPv6连接的尝试。 |
| 名称 | 接口名称,如enp0s3。这应该与接口配置文件名称中的接口名称一致。 |
| UUID | 接口的通用唯一标识符。它是用接口名称的哈希值创建的。HWADDR是一种较早的将文件与硬件接口绑定的方法,我发现UUID可以被注释掉或删除而不会有问题。 |
| DEVICE | 这个配置文件所绑定的接口的名称。 |
| ONBOOT | 如果是,这将在启动时(真正的启动时间)启动该接口。如果设置为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。 |
| 搜索 | 在对不合格的主机名进行查询时要搜索的 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。默认为 "是"。 |
| IPv6_AUTOCONF | 是指使用DHCP对该接口的IPv6进行配置。 |
| IPv6_DEFROUTE | 该接口是该主机通往外界的IPv6默认路由。 |
| IPv6_FAILURE_FATAL | 如果设置为 "no",获得IPv6连接的失败将不会影响任何试图进行IPv4连接的尝试。 |
| IPv6_ADDR_GEN_MODE | 配置IPv6稳定隐私寻址。 |
还有很多配置变量没有在这里列出,但这些是最经常使用的变量。
最后的想法
周围仍有很多Linux主机在使用本文所述的接口配置文件。尽管已经被废弃,NetworkManager仍然可以识别这些文件,并且可以使用它们来配置网络接口。然而,大多数现代Linux系统都使用NetworkManager,所以不需要配置文件,除非它们服务于特殊的使用情况,比如服务器或路由器。
我有几台主机,需要的不仅仅是标准的NetworkManager配置。对我来说,把旧的接口配置文件改成NetworkManager目前使用的连接配置文件并不是一个优先事项。为了防止将来我的网络出现问题,我需要切换到NetworkManager网络连接文件。