除了周围网络环境的复杂性之外,由于使用的技术堆栈和工具范围很广,Linux 网络可能会令人困惑。网桥、绑定、VRF 或路由的配置可以通过编程、声明、手动或自动化方式使用 ifupdown、ifupdown2、ifupdown-ng、iproute2、NetworkManager、systemd-networkd 等工具完成。这些工具中的每一个都使用不同的格式和位置来存储其配置文件。Netplan 是一种用于在 Linux 系统上轻松配置网络的实用程序,旨在统一和标准化管理员与这些底层技术的交互方式。从所需网络接口的 YAML 描述以及每个接口应配置的功能开始,Netplan 将为您选择的工具生成所有必要的配置。
在本文中,我们将概述 Ubuntu 如何使用 Netplan 以统一的方式管理 Linux 网络。通过跨两个不同的技术堆栈创建通用界面,IT 管理员可以从跨桌面和服务器的统一体验中受益,同时保留底层技术的独特优势。
但首先,让我们从一些历史开始,然后详细介绍我们今天所处的位置。
从 Ubuntu 16.10 开始,由于需要以通用方式跨云元数据和其他安装程序系统表达网络配置,我们有机会切换到与基于依赖项的引导模型更好地集成的网络堆栈。我们在服务器安装上选择了systemd-networkd,因为它的上游社区活跃,因为它已经是Systemd的一部分,因此包含在任何Ubuntu基本安装中。与我们之前使用的ifupdown工具相比,它使用现代开发技术,良好的测试覆盖率和CI集成,对未来有更好的前景。在桌面安装中,我们继续使用NetworkManager,因为它与用户界面的集成非常好。
根据所使用的 Ubuntu 变体,必须管理和配置两个单独的网络堆栈可能会令人困惑,我们希望在任何版本的 Ubuntu 中提供简化的用户体验。因此,我们引入了 Netplan.io 作为 systemd-networkd 和 NetworkManager 之上的控制层。Netplan 将 /etc/netplan/ 中的声明式 YAML 文件作为输入,并根据系统配置在 /run/systemd/network/ 或 /run/NetworkManager/ 中为相关网络堆栈后端生成相应的网络配置。同时保持充分的灵活性,在需要时以本机方式控制底层网络堆栈。
最新版本的Netplan已经可用并准备好安装在许多发行版上,例如Ubuntu,Fedora,Red Hat Enterprise Linux,Debian和Arch Linux。
如上所述,Netplan 自 2016 年以来默认安装在 Ubuntu 系统上,因此每天在 Ubuntu 的多个长期支持版本(18.04、20.04、22.04)中被数百万用户使用。这主要涵盖了 Ubuntu 服务器场景,例如网桥、绑定、VLAN、VXLAN、VRF、IP 隧道或 WireGuard 隧道,使用 systemd-networkd 作为后端渲染器。
在 Ubuntu 桌面系统上,Netplan 可以通过其声明性 YAML 配置文件手动使用,它将处理这些文件以配置 NetworkManager 堆栈。继续阅读以了解将来如何通过自动化和与桌面堆栈的集成来改进这一点。
这可能不那么明显,但是许多人在通过cloud-init在AWS,Google Cloud或其他地方配置公共云实例时一直在使用Netplan而不知情。这是因为 cloud-init 的“网络配置版本 2”是 Netplan 的直通配置,然后 Netplan 将在给定的云实例上设置底层网络堆栈。这就是为什么Netplan也是Debian发行版上的一个关键软件包,因为它也默认用于Debian云映像。
我们知道 Linux 网络可能是一头野兽,我们希望让简单的事情变得简单。但也允许任何复杂的自定义设置。使用 Netplan,日常网络需求通过易于理解且文档很好的 YAML 文件来满足,这些文件描述了本地网络接口的所需状态,这些文件将被渲染到相关网络堆栈的相应配置文件中,并在(重新)启动或运行时使用“netplan apply”CLI 应用。例如 /etc/netplan/lan.yaml:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
拥有网络配置的单一事实来源对于管理员来说也很重要,因此他们不需要了解多个网络堆栈,而是可以依靠 /etc/netplan/ 中给出的声明性数据来配置系统,独立于底层网络配置后端。这对于为新的Linux安装提供初始网络配置也非常有帮助,例如通过安装系统,如Subiquity,Ubuntu的桌面安装程序或跨公共云和私有云的cloud-init。
除了描述和应用网络配置外,“netplan status”CLI 还可用于从底层网络堆栈(例如 systemd-networkd、NetworkManager 或 iproute2)查询相关数据,并以统一的方式呈现它们。
在Netplan项目中,我们努力实现非常高的测试自动化和覆盖率,在多个Linux发行版中进行大量的单元测试,集成测试和linting步骤,这为支持更高级的网络用例提供了很高的信心,例如Open vSwitch或SR-IOV网络虚拟化,以及正常的有线(静态IP,DHCP,路由), 无线(例如 WWAN 调制解调器、WPA2/3 连接、WiFi 热点、控制监管域等)和常见服务器场景。
如果存在Netplan本机未涵盖的场景,除了通过Netplan控制的接口并行进行手动配置外,它还允许完全灵活地直接通过systemd覆盖配置或NetworkManager直通设置控制底层网络堆栈。
在工作站上,最常见的情况是最终用户通过其用户界面工具配置 NetworkManager,而不是通过 Netplan 的声明性 YAML 文件(使用 NetworkManager 的本机配置文件)对其进行驱动。为了避免Netplan只是将控制权移交给此类系统上的NetworkManager,我们正在研究NetworkManager和Netplan之间的双向集成,以进一步改进Ubuntu桌面安装上的“单一事实来源”用例。
Netplan 正在发布一个“libnetplan”库,该库提供了一个 API 来访问 Netplan 的解析器和验证内部,NetworkManager 可以使用该库来写回网络接口配置。例如,通过NetworkManager的UI工具或D-Bus API给出的配置可以导出为Netplan的本机YAML格式,位于/etc/netplan/的公共位置。这样,管理员在管理桌面安装队列时只需要关心Netplan。该解决方案目前用于更受限的环境,如 Ubuntu Core,当使用 NetworkManager snap 时,我们将以 24.04 LTS 将其交付给通用 Ubuntu 桌面系统。
除了 NetworkManager 之外,libnetplan 还可用于与网络空间中的其他工具集成,例如 cloud-init,用于在播种新 Linux 映像时改进用户数据或安装系统的验证。
总体而言,Netplan 可以被认为是网络环境中的良好公民,它与其他网络工具携手合作,可以轻松地以通用、简化和声明的方式控制现代网络堆栈,例如 systemd-networkd 或 NetworkManager。它为网络管理员提供了有关网络状态的“单一事实来源”,同时保持简单的事情简单,但允许任意复杂的自定义设置。
https://ubuntu.com/blog/a-declarative-approach-to-linux-networking-with-netplan