如何从命令行管理 Linux 网络连接

nmcli
命令让您可以直接从命令行利用 Linux NetworkManager 的强大功能,使其非常适合没有桌面环境和远程 SSH shell 管理的服务器。
nmcli 命令
nmcli
命令不是新命令,它于 2010 年发布。它与 ip 命令一起取代了古老但已弃用的 ifconfig
。旧习难改,许多系统管理员仍在使用 ifconfig
。他们已经知道如何使用它,没有学习曲线,他们只需要完成工作。那么为什么还要学习另一种工具呢?
好吧,最终,ifconfig
将被发行版删除,所以这是一个即将到来的变化,不管你喜不喜欢。但是 nmcli
本身就有一些巧妙的技巧,因此值得了解它可以提供什么。
ncmli 概念和语法
与所有 CLI 命令一样,nmcli
接受命令行参数。这些参数分为三类。
- 选项:这些修改
nmcli
的行为 - 部分:这些部分告诉
nmcli
您正在调用哪一组操作。将部分视为命令的集合。 - Actions:这些告诉
nmcli
你想让它做什么。将它们视为命令。
一般的语法格式是:
nmcli <options> <sections> <action>
- 帮助:提供有关
ncmcli
命令的简短帮助文本 - General:检索 NetworkManager 的状态和配置
- 网络:查询、启用或禁用网络连接
- 无线电:查询、启用或禁用 Wi-Fi 网络连接
- Monitor:监控NetworkManager和网络连接的状态变化
- 连接:直接操作网络接口,包括启用和禁用它们、添加新连接以及删除现有连接
- 设备:修改网络设备参数并连接或断开设备与现有连接
- Secret:将
nmcli
注册为 NetworkManager 秘密代理。因为nmcli
会自动执行此操作,所以很少使用。
使用 nmcli 的第一步
让我们确保 NetworkManager 已安装、正在运行,并且我们可以使用 nmcli
连接到它。我们将使用 general
部分的 status
操作。
nmcli general status

实际上,status 是 general 的默认操作,因此我们可以将这个词从命令中删除。但是我们已经验证了 nmcli
- 以及 NetworkManager - 已经安装并且可以运行。让我们进一步了解这台电脑。
我们可以使用连接部分的显示操作列出所有内存中和磁盘上的网络连接配置文件:
nmcli connection show

输出比终端窗口宽。我们的结果是:
NAME UUID TYPE DEVICE
Wired connection 1 d2864443-9cee-31ec-ab2e-55e9ebddd53e ethernet enp0s3
ethernet-enp0s8 9aad8efa-3427-4a5c-bef5-270340cd33d0 ethernet enp0s8
ethernet-enp0s9 5bc49cef-bc3d-4832-9073-460b408932b6 ethernet enp0s9
本文使用的测试机运行的是 Ubuntu 21.10 的预发布版本。它安装了三个网络适配器,分别名为enp0s3
、enp0s8
和enp0s9
。
了解管道
网络连接允许您的计算机通过网络与另一台设备进行通信。在内部,nmcli
将有关网络连接的所有信息保存在它称为连接的数据对象中。
nmcli
连接封装了与该连接相关的所有信息,包括数据链路层和 IP 地址信息。您可以将 nmcli
的连接视为真实网络连接的配置细节。
要到达外部世界,连接必须使用网络接口设备,例如网卡。连接绑定到设备。当设备处于活动状态并且能够接收或传输数据时,连接被称为 active
或 up
。毫不奇怪,相应的非活动状态称为 inactive
或 down
。
添加网络连接
使用 nmcli
,您可以创建网络连接并使用单个命令设置其一些配置选项。在这台测试计算机上,enp0s8
上没有连接,我们的有线连接(以太网)编号 2 的名称。我们将添加到 enp0s8
的连接。因为我们正在进行系统更改,所以您需要使用 sudo
:
sudo nmcli connection add type ethernet ifname enp0s8

此命令使用 connection
部分中的 add
操作。我们使用 type
选项来请求以太网连接,并使用 ifname
(接口名称)选项来指定我们希望此连接使用的网络接口设备。
让我们检查一下发生了什么:
nmcli connection show

NAME UUID TYPE DEVICE
Wired connection 1 d2864443-9cee-31ec-ab2e-55e9ebddd53e ethernet enp0s3
ethernet-enp0s8 9aad8efa-3427-4a5c-bef5-270340cd33d0 ethernet enp0s8
ethernet-enp0s9 5bc49cef-bc3d-4832-9073-460b408932b6 ethernet enp0s9
ethernet-enp0s8-1 b874aa09-3a25-4f52-b20b-1b95d9741be9 ethernet --
我们的新连接 ethernet-enp0s8-1
已创建。它的通用唯一标识符 (UUID) 已分配,连接类型为以太网。我们现在可以使用 up
命令激活它。 up
命令后必须跟有连接名称或其 UUID:
nmcli connection up ethernet-enp0s8-1

让我们再次检查我们的活动连接:
nmcli connection show --active

NAME UUID TYPE DEVICE
Wired connection 1 d2864443-9cee-31ec-ab2e-55e9ebddd53e ethernet enp0s3
ethernet-enp0s8-1 b874aa09-3a25-4f52-b20b-1b95d9741be9 ethernet enp0s8
ethernet-enp0s9 5bc49cef-bc3d-4832-9073-460b408932b6 ethernet enp0s9
我们的新连接 ethernet-enp0s8-1
现在已激活并绑定到 enp0s8
网络接口设备。
调整连接
当然,ncmli
也允许您更改现有连接的参数。假设我们要将网络接口从动态主机配置协议 (DHCP) 切换为使用静态 IP 地址。为了匹配我们的网络,我们的新连接需要一个固定的 IP 地址 192.168.1.40。
为此,您需要发出两个命令。一种设置 IP 地址,一种设置连接获取 IP 地址的方法为手动:
nmcli connection modify ethernet-enp0s8-1 ipv4.address 192.168.1.40/24
nmcli connection modify ethernet-enp0s8-1 ipv4.method manual

我们为 IP 地址提供的“/24”是无类域间路由 (CIDR) 中的子网掩码。在此上下文中,“/24”表示“255.255.255.0”。
在连接“退回”之前,更改不会生效。即,禁用并重新联机。第一个命令断开连接,第二个命令恢复连接。
nmcli connection down ethernet-enp0s8-1
nmcli connection up ethernet-enp0s8-1

如果您想撤销更改并从静态 IP 地址移动到 DHCP IP 地址,请使用 auto
选项而不是 manual
。
nmcli connection modify ethernet-enp0s8-1 ipv4.method auto
设备管理
nmcli
device
部分包含可让您管理计算机上安装的网络接口的操作(命令)。要查看计算机上所有网络接口的状态,请使用:
nmcli device status

显示设备详细信息
要检查网络接口的详细信息,我们使用 device
部分中的 show
操作。如果您不提供设备名称,则会检索并显示所有设备的详细信息。您可以上下滚动和翻页来查看它们。
让我们看一下 enp0s8
,我们的新连接正在使用的设备。我们可以验证正在使用的 IP 地址是我们之前请求的地址。
nmcli device show enp0s8

GENERAL.DEVICE: enp0s8
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 08:00:27:79:A7:68
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ethernet-enp0s8-1
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/8
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.1.40/24
IP4.GATEWAY: --
IP4.ROUTE[1]: dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 102
IP6.ADDRESS[1]: fe80::3241:457d:cd1c:2436/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 102
nmcli
返回一屏信息。一些常用的项目是:
- DEVICE:我们正在检查的设备的名称。
- TYPE:使用此设备的连接类型。
- HWADDR:接口卡的MAC地址。
- STATE:此设备上是否有实时连接。
- IP4.ADDRESS[1]:此设备的 IP 地址和子网掩码。
- CONNECTION:使用此设备的连接名称。
nmcli 交互式编辑器
虽然 nmcli
是一个命令行工具,但它确实有一个基本的交互式编辑器。连接部分中的编辑操作会在您通过命令行传递的连接上打开交互式编辑器:
nmcli connection edit ethernet-enp0s8-1

一些帮助文本会打印到屏幕上,您会看到“nmcli>”命令提示符。
如果您键入 print
并点击“Enter”,nmcli
会列出与该连接关联的所有属性。有很多。您可以滚动浏览它们以查看它们。
print

让我们将连接改回使用 DHCP。我们将使用“ipv4”设置。为此,我们需要“转到”IPv4 设置。
goto ipv4

我们要更改的属性是 method
。我们想将其设置为自动。
set method auto

您会看到以下提示:
Do you also want to clear 'ipv4.addresses'? [yes]:
如果您不清除 IP 地址,下次您将此连接设置为使用静态 IP 地址时,它将使用之前设置的 IP 地址。如果你清除它,如果你将此连接改回使用静态 IP 地址,则需要设置一个新的 IP 地址。输入“yes”或直接点击“Enter”清除它。输入“no”并点击“Enter”保留它。
我们需要保存我们的更改:
save

输入“quit”退出交互式编辑器。如果您不想退出,请输入“返回”返回主关卡,并继续使用编辑器。
人还有更多
nmcli
命令可以做更多的事情。它有很多命令行参数和选项。事实上,它的手册页有 1200 多行。查看它们以了解 nmcli
还能为您做些什么。
当然,如果您正在远程管理网络连接,请不要禁用您已连接的连接。那一点都不好玩。