大多数当前的 Linux 发行版都 使用 NetworkManager 来创建和管理网络连接。这意味着我作为系统管理员需要了解它。在一系列文章中,我将分享我迄今为止学到的知识,以及为什么我认为 NetworkManager 比过去的选项有所改进。
Red Hat 在 2004 年推出了 NetworkManager,旨在简化和自动化网络配置和连接,尤其是无线连接。其目的是将用户从手动配置每个新无线网络的任务中解放出来。NetworkManager 可以管理有线网络连接,而无需接口配置文件,尽管它对无线连接使用网络连接文件。
在本文中,我将回顾什么是 NetworkManager,以及如何使用它来查看 Linux 主机的网络连接和设备。我甚至将在过程中解决几个问题。
NetworkManager 替换了什么
NetworkManager 是以前网络管理工具的替代品。最初的接口配置命令 ifconfig
及其接口配置文件已过时。您可以在 ifconfig
手册页中看到这一点,其中包含说明这一点的注释。
ip
命令取代了 ifconfig
命令,并执行基本相同的任务。这两个命令共存了一段时间,允许系统管理员使用其中任何一个,这保持了依赖于 ifconfig
的脚本的功能。尽管其手册页尚未表明这一点,但 ifconfig
命令已过时,NetworkManager 在实践中使其如此。
现在是时候重写这些脚本了,因为使用 NetworkManager 命令最有意义。
NetworkManager 的工作原理
NetworkManager 作为 systemd 服务运行,并且默认启用。NetworkManager 与 D-Bus 协同工作,以检测和配置插入 Linux 计算机的网络接口。这种网络接口的即插即用管理使用户可以非常轻松地插入新网络(有线和无线)。当在 Linux 启动 期间检测到先前安装的网络接口时,它们的处理方式与系统启动后插入的设备完全相同。在每种情况下都将所有设备视为即插即用,使得操作系统更容易处理这些设备,因为只有一套代码库来处理这两种情况。
udev 守护程序为系统中安装的每个网络接口卡 (NIC) 在网络规则文件中创建一个条目。D-Bus 向 NetworkManager 发出新网络设备(有线或无线)存在的信号。然后,NetworkManager 监听 D-Bus 上的流量,并通过为此新设备创建配置来响应。这种配置默认情况下仅存储在 RAM 中,而不是永久性的。它必须在每次计算机启动时创建。
NetworkManager 使用来自 D-Bus 的信息来初始化每个 NIC。它首先查找提供更永久静态配置的配置文件。当收到新设备通知时,NetworkManager 会检查 /etc/sysconfig/network-scripts
中是否存在旧的网络接口配置文件 (ifcfg-*
)。ifcfg-rh 插件允许使用这些旧版文件以实现向后兼容性。
接下来,NetworkManager 查找其自己的接口连接文件,这些文件位于 /etc/NetworkManager/system-connections
目录中。包括 Fedora 在内的大多数发行版都将其网络连接文件保存在 /etc/NetworkManager/system-connections
目录中,使用网络的名称作为文件名。
例如,我的 System76 Oryx Pro 笔记本电脑最初使用 POP!_OS
。我已经将其替换为 Fedora,目前版本为 35,并且我使用它进行的每个无线连接都在 /etc/NetworkManager/system-connections
中有一个文件。这些文件维护了每个网络的 Service Set Identifier (SSID) 和无线密码的记录。无线路由器中的动态主机配置协议 (DHCP) 服务器为这些无线连接提供其余的网络配置数据。出于安全目的,因为这些文件包含密码,所以它们只能由 root 用户读/写,就像系统帐户文件 /etc/passwd
和 /etc/shadow
一样。
该笔记本电脑上的 /etc/NetworkManager/system-connections directory
包含有线网络以及我连接的每个无线网络的文件。这些文件的结构与旧的 ifcfg
文件不同,但它们采用 ASCII 纯文本格式,可读且易于理解。
此过程对顺序敏感。找到的第一组配置文件将被使用。如果未找到配置文件,NetworkManager 将使用来自 DHCP 服务器的数据生成配置。如果接口配置文件不存在,则插入新设备或连接到新的无线网络会导致 udev 通知 NetworkManager 新设备或无线连接。在 Fedora 28 及更早版本中,NetworkManager 会创建新的接口配置文件。从 Fedora 29 及更高版本开始,NetworkManager 仅创建连接,而不创建接口配置文件。
如果未找到配置文件或 DHCP 服务器,则无法进行网络连接。
查看接口配置
NetworkManager 的命令行界面程序 nmcli 提供了多个选项,用于确定主机中安装的任何网络接口硬件的当前状态以及当前活动的连接。nmcli 程序可以管理任何主机上的网络,无论它是否使用图形用户界面 (GUI),因此它也可以通过安全外壳 (SSH) 连接管理远程主机。它适用于有线和无线连接。
我将从使用 nmcli 工具的一些基本信息开始。我正在使用我设置为路由器的 Fedora 系统,因为具有多个网络接口的示例将比仅具有单个接口的简单工作站主机更有趣。
我将从最简单的命令 nmcli
开始,不带任何选项。这个简单的命令显示的信息类似于现在已过时的 ifconfig
命令,包括 NIC 的名称和型号、媒体访问控制 (MAC) 地址和(互联网协议)IP 地址,以及哪个 NIC 配置为默认网关。它还显示每个接口的 DNS 配置。
nmcli 命令需要管理员权限。大多数发行版建议您使用 sudo
,但我只是切换到 root
用户。
$ su -
# nmcli
enp4s0: connected to enp4s0
"Realtek RTL8111/8168/8411"
ethernet (r8169), 84:16:F9:04:44:03, hw, mtu 1500
ip4 default, ip6 default
inet4 45.20.209.41/29
route4 0.0.0.0/0
route4 45.20.209.40/29
inet6 2600:1700:7c0:860:8616:f9ff:fe04:4403/64
inet6 fe80::8616:f9ff:fe04:4403/64
route6 2600:1700:7c0:860::/64
route6 ::/0
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
inet6 fe80::8616:f9ff:fe03:e989/64
route6 fe80::/64
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
inet6 fe80::8616:f9ff:fe03:fd85/64
route6 fe80::/64
eno1: unavailable
"Intel I219-V"
ethernet (e1000e), 04:D9:F5:1C:D5:C5, hw, mtu 1500
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: enp1s0
servers: 192.168.0.52 8.8.8.8
interface: enp2s0
使用命令 nmcli device show
获取有关已知设备的完整信息,使用 nmcli connection show
获取活动连接配置文件的概述。有关完整的使用详情,请查阅 nmcli(1) 和 nmcli-examples(7) 手册页。您还可以以 root 用户身份发出帮助命令 nmcli -h
,以查看基本的顶级 nmcli
命令
# nmcli -h
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }
OPTIONS
-a, --ask ask for missing parameters
-c, --colors auto|yes|no whether to use colors in output
-e, --escape yes|no escape columns separators in values
-f, --fields <field,...>|all|common specify fields to output
-g, --get-values <field,...>|all|common shortcut for -m tabular -t -f
-h, --help print this help
-m, --mode tabular|multiline output mode
-o, --overview overview mode
-p, --pretty pretty output
-s, --show-secrets allow displaying passwords
-t, --terse terse output
-v, --version show program version
-w, --wait <seconds> set timeout waiting for finishing operations
OBJECT
g[eneral] NetworkManager's general status and operations
n[etworking] overall networking control
r[adio] NetworkManager radio switches
c[onnection] NetworkManager's connections
d[evice] devices managed by NetworkManager
a[gent] NetworkManager secret agent or polkit agent
m[onitor] monitor NetworkManager changes
请注意,对象可以拼写出来,也可以缩写到第一个字符。这些对象都是唯一的,因此只需要第一个字符即可指定任何单个对象。
尝试 nmcli g
以查看常规状态。
# nmcli g
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
connected full enabled enabled enabled enabled
该输出显示的信息不多。我也知道主机(在本例中)没有 WiFi 硬件,因此这是一个具有误导性的结果。因此,您不应使用 nmcli g
命令。更好的对象命令是 c
[onnection] 和 d
[evice],它们是我最常用的命令。
# nmcli c
NAME UUID TYPE DEVICE
enp4s0 b325fd44-30b3-c744-3fc9-e154b78e8c82 ethernet enp4s0
enp1s0 c0ab6b8c-0eac-a1b4-1c47-efe4b2d1191f ethernet enp1s0
enp2s0 8c6fd7b1-ab62-a383-5b96-46e083e04bb1 ethernet enp2s0
enp0s20f0u7 0f5427bb-f8b1-5d51-8f74-ac246b0b00c5 ethernet --
enp1s0 abf4c85b-57cc-4484-4fa9-b4a71689c359 ethernet --
# nmcli d
DEVICE TYPE STATE CONNECTION
enp4s0 ethernet connected enp4s0
enp1s0 ethernet connected enp1s0
enp2s0 ethernet connected enp2s0
eno1 ethernet unavailable --
lo loopback unmanaged --
这里有很多非常有趣的信息。请注意,使用 c
对象命令的最后两个条目在设备列中没有条目。此结果可能意味着它们未激活或不存在,或者存在一个或多个配置错误。
我们使用 d
对象命令获得的附加信息甚至没有显示 enp0s20f0u7 设备。它还显示了设备 eno1(主板设备),该设备未使用 c
对象命令显示。
您的输出应该更像这样,尽管设备名称会有所不同,并且它将取决于 NIC 连接到 PCI 总线的具体位置。
# nmcli c
NAME UUID TYPE DEVICE
Wired connection 1 6e6f63b9-6d9e-3d13-a3cd-d54b4ca2c3d2 ethernet enp0s3
# nmcli d
DEVICE TYPE STATE CONNECTION
enp0s3 ethernet connected Wired connection 1
lo loopback unmanaged --
似乎我有一些异常情况需要探索。首先,我想知道连接列表中设备 enp0s20f0u7 是什么。由于 NetworkManager 在设备列表中无法识别此设备,因此可能在 /etc/sysconfig/network-scripts
中存在网络配置文件,即使主机上不存在此类硬件设备。我检查了该目录,找到了接口配置文件,并显示了内容。
# ls -l
total 20
-rw-r--r-- 1 root root 352 Jan 2 2021 ifcfg-eno1
-rw-r--r-- 1 root root 419 Jan 5 2021 ifcfg-enp0s20f0u7
-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 453 Jul 27 2020 ifcfg-enp4s0
cat ifcfg-enp0s20f0u7
# Interface configuration file for ifcfg-enp0s20f0u7
# This is a USB Gb Ethernet dongle
# This interface is for the wireless routers
# Correct as of 20210105
TYPE="Ethernet"
BOOTPROTO="static"
NM_CONTROLLED="yes"
DEFROUTE="no"
NAME=enp0s20f0u7
UUID="fa2117dd-6c7a-44e0-9c9d-9c662716a352"
ONBOOT="yes"
HWADDR=8c:ae:4c:ff:8b:3a
IPADDR=192.168.10.1
PREFIX=24
DNS1=192.168.0.52
DNS2=8.8.8.8
在查看此文件后,我回想起我曾经使用 USB 千兆网卡一段时间,因为安装在该主机上的主板 NIC 显然已失效。这是一个快速修复,后来我在 PCIe 主板总线上安装了一个新的 NIC,因此我可以删除此接口配置文件。但是,我没有删除它;我将其移动到 /root
目录,以防我再次需要它。
请注意我使用的注释,以确保我未来的自己或其他系统管理员会了解此文件存在的原因。
第二个异常是为什么 enp1s0 的条目出现两次。这仅在多个接口配置文件中指定了 NIC 名称时才会发生。因此,我尝试了以下步骤,果然,enp1s0 错误地出现在 ifcfg-eno1
配置文件以及 ifcfg-enp1s0
文件中。
# grep enp1s0 *
ifcfg-eno1:NAME=enp1s0
ifcfg-enp1s0:# Interface configuration file for enp1s0 / 192.168.10.1
ifcfg-enp1s0:NAME=enp1s0
# cat ifcfg-eno1
## Interface configuration file for eno1 / 192.168.10.1
## This interface is for the wireless routers
## Correct as of 20200727
TYPE="Ethernet"
BOOTPROTO="static"
NM_CONTROLLED="yes"
DEFROUTE="no"
NAME=enp1s0
ONBOOT="yes"
HWADDR=04:d9:f5:1c:d5:c5
IPADDR=192.168.10.1
PREFIX=24
DNS1=192.168.0.52
DNS2=8.8.8.8
我将 NAME 更改为 NAME=eno1 并重启了 NetworkManager。接口配置文件中的更改只有在我重启 NetworkManager 后才会激活。设备和连接结果现在看起来像这样。我仍然没有使用板载 NIC,现在我已经从 ifcfg-eno1
接口配置文件中删除了错误的名称,这可能没问题。这将需要该路由器的停机时间。
# systemctl restart NetworkManager
# nmcli d
DEVICE TYPE STATE CONNECTION
enp4s0 ethernet connected enp4s0
enp1s0 ethernet connected enp1s0
enp2s0 ethernet connected enp2s0
eno1 ethernet unavailable --
lo loopback unmanaged --
# nmcli c
NAME UUID TYPE DEVICE
enp4s0 b325fd44-30b3-c744-3fc9-e154b78e8c82 ethernet enp4s0
enp1s0 c0ab6b8c-0eac-a1b4-1c47-efe4b2d1191f ethernet enp1s0
enp2s0 8c6fd7b1-ab62-a383-5b96-46e083e04bb1 ethernet enp2s0
eno1 abf4c85b-57cc-4484-4fa9-b4a71689c359 ethernet --
另一个选项是仅显示活动连接。这是一个具有清晰结果的好选项,但如果您仅使用它,它也可能会掩盖其他问题。
# nmcli connection show --active
NAME UUID TYPE DEVICE
enp4s0 b325fd44-30b3-c744-3fc9-e154b78e8c82 ethernet enp4s0
enp1s0 c0ab6b8c-0eac-a1b4-1c47-efe4b2d1191f ethernet enp1s0
enp2s0 8c6fd7b1-ab62-a383-5b96-46e083e04bb1 ethernet enp2s0
在将 ifcfg-eno1
文件中的设备名称更改为正确的名称后,我怀疑主板 NIC eno1 将再次工作。下次我对该主机进行维护会话时,我将对此进行实验。
这是否比具有单个 NIC 的主机更有趣?并且我在此过程中发现了一些问题。
Red Hat Enterprise Linux (RHEL) 8 文档“配置和管理网络”中介绍了使用 NetworkManager 工具管理网络。
最终想法
我是“如果没坏,就不要修理它”哲学的拥护者。但是,即使是从命令行使用 NetworkManager 的最简单用法,查看网络设备和连接的当前状态,也向我展示了我在以前的配置中遗漏的两个异常情况。我现在是 NetworkManager 的粉丝。旧的工具很好,但 NetworkManager 更好;它提供的额外信息非常宝贵。
在本系列的第 2 部分中,我将讨论管理网络接口。
1 条评论