NMState:Linux 的声明式网络配置工具
Linux 生态系统提供了多种配置网络的方法,包括流行的网络管理器守护程序和命令行工具,如nmcli和nmtui GUI 实用程序。本指南介绍了另一种称为NMState的网络配置工具
NMState是一个声明式网络管理器,用于在 Linux 主机上配置网络。它是一个库,提供用于管理主机网络设置的命令行工具。它通过北向声明式 API 管理主机网络。在撰写本指南时,NetworkManager守护程序是NMState支持的唯一提供程序。
在本指南中,我们将介绍NMState工具的一些示例用法。在本指南中,我们将使用Fedora Linux进行演示。
命令式与声明式方法
网络管理可以采用两种方法 -命令式和声明式。在命令式方法中,您可以通过在终端上运行命令来明确定义接口的网络状态。重点在于“如何”。
例如,要使用命令式方法关闭网络,请运行以下命令:
$ sudo ifconfig enp0s3 down
另一方面,声明式方法使用YAML文件将更改应用于配置。大多数 DevOps 编排工具(例如Kubernetes)都使用此方法通过YAML文件部署 pod 应用程序。
这种方法提供了 DevOps 圈子中通常所说的基础设施即代码 ( IaC )。这增强了主机上网络配置的自动化,并提供了一种快速、更可靠的方法,可以对网络接口进行多次更改,同时将错误降至最低。
现在,让我们换个角度看看如何使用NMState配置工具在 Linux 中配置网络接口。
步骤 1:安装 NMState 网络配置工具
我们将通过安装Nmstate来开始工作。首先,检查Fedora存储库中软件包的可用性,如下所示:
$ sudo dnf search nmstate
从输出中,我们可以看到网络管理器在官方存储库中可用。
接下来,按如下方式安装NMstate。这适用于Fedora 31及更高版本。
$ sudo dnf install nmstate
该命令将安装NMState网络管理器 API 以及其他 Python 依赖项。
安装完成后,请验证nmstate包是否已安装,如下所示。
$ rpm -qi nmstate
对于基于 RHEL 的 Linux,首先启用 copr 存储库。
$ sudo dnf copr enable nmstate/nmstate-stable
然后按如下方式安装NMstate。
$ sudo dnf install nmstate
查看有关如何从源安装 NMState 的更多说明。
安装后,您可以按如下方式检查安装的NMstate版本。
$ nmstatectl version 1.0.2
在 Linux 中使用 NMState 配置工具
安装NMstate后,让我们开始详细了解如何充分利用网络管理器 API。
要查看网络接口的当前网络配置,请运行以下命令。这是您的enp0s3接口的配置。
$ nmstatectl show enp0s3
输出分为 4 个不同的部分:
- dns-resolver:此部分包含特定接口的名称服务器配置。
- route-rules:规定了路由规则。
- 路线:包括动态路线和静态路线。
- 接口:此部分指定 ipv4 和 ipv6 设置。
在 Linux 中更改网络配置
您可以使用NMState配置工具以交互或基于文件的模式将主机配置为所需状态。
- 交互式:使用nmstatectl edit命令编辑网络接口。此命令打开由 EDITOR 环境变量定义的文本编辑器。保存更改后,NMState 会立即应用新配置,除非检测到语法错误。
- 基于文件:在基于文件的模式下,使用nmstatectl apply命令通过 YAML 或 JSON 文件应用接口配置。
现在让我们开始实际操作,看看如何使用NMState修改网络配置。
我们的Fedora系统有两个活动网络接口,配置如下:
$ ip -br -4 a
示例输出
lo UNKNOWN 127.0.0.1/8 enp0s3 UP 192.168.2.104/24 enp0s8 UP 192.168.2.103/24
交互配置模式示例
我们将使用交互模式来更改enp0s3网络接口的MTU(最大传输单元)。默认情况下,设置为1500,如图所示。
$ ifconfig
我们将它改为4000。我们将使用nmstatectl edit命令执行此操作,如下所示。
$ sudo nmstatectl edit enp0s3
这将在文本编辑器中打开配置。对于我们的情况,它将在vim编辑器中打开。接下来,一直向下滚动并找到mtu参数。我们将值更改为4000,就像我们在 vim 中编辑文件一样。然后我们将保存更改。
当您保存并退出文件时,您将在终端上看到一些乱码输出,因为NMstate保存了更改。无需干预,所以只需静静等待即可。
现在让我们确认更改已完成。
$ ifconfig
从终端输出中,我们可以看到我们已成功将 MTU从默认的1500值更改为4000。
基于文件的配置模式示例
现在让我们使用基于文件的模式修改配置。在此示例中,我们将禁用enp0s8网络接口的IPv6。第一步是创建一个 YAML 文件,该文件将指定enp0s8网络接口的所需状态。
$ sudo nmstatectl show enp0s8 > enp0s8.yml
接下来,我们将如下编辑YAML文件。
$ sudo vim enp0s8.yml
向下滚动到 ipv6 部分。要禁用 IPv6,请将 enabled 参数设置为 false,并删除已划掉的行。
保存配置并使用 YAML 文件应用新状态,如下所示。
$ sudo nmstatectl apply enp0s8.yml
现在运行显示的命令来验证 IPv6 是否已被禁用。显示的输出表明enp0s8网络接口的 IPv6 为空白,这意味着我们已成功禁用接口上的 IPv6。
$ ip -br a
临时应用网络更改
NMstate提供的另一个非常方便的功能是能够临时配置所需的网络状态。对配置满意后,您可以继续并使更改永久生效。否则,一旦超时,所做的更改将回滚到初始设置。默认超时为 60 秒。
为了演示这一点,我们将在enp0s3接口上临时设置一个静态 IP并禁用DHCP。再次使用文本编辑器访问该文件。
$ sudo vim enp0s3.yml
滚动到ipv4部分。指定静态 IP – 在本例中为192.168.2.150,并删除已删除的行。此外,请确保将dhcp参数设置为false。
保存文件并暂时提交更改,如下所示。
$ sudo nmstatectl apply --no-commit --timeout 20 enp0s3.yml
该--no-commit
选项会暂时应用该选项定义的一段时间内的更改--timeout
,在此示例中为 20 秒。
为了验证更改的时间应用,我们将以 20 秒的时间间隔检查 IP 配置。
$ ip -br a
从输出中,您可以看到接口 IP 配置在 20 秒的时间间隔后恢复为 DHCP。IP 地址从之前的静态配置 IP(192.168.2.150)恢复为192.168.2.104。
不可否认,NMState工具是一种配置网络接口的便捷工具。它是一种声明式工具,可使用 NetworkManager API 应用主机接口所需的配置状态。
可以使用交互式方法或使用基于文件的方法(使用预配置的YAML文件)轻松定义状态。这增强了配置任务的自动化并减少了配置过程中的错误。