Linux 上 NetworkManager 入门

了解什么是 NetworkManager,以及如何使用它来查看 Linux 主机的网络连接和设备。
6 位读者喜欢这篇文章。
Tools for the sysadmin

opensource.com

大多数当前的 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 部分中,我将讨论管理网络接口。

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

1 条评论

网络管理器套件不仅取代了旧版工具,而且还在当今的现代基础设施即代码 (IaC) 环境中提高了您的工作效率。

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