Netplan 计划

作者:Shawn Powers

Ubuntu 改变了网络配置。拥抱 YAML 吧。

如果我完全诚实地说,我仍然不喜欢从 eth0, eth1, eth2 切换到像 enp3s0, enp4s0, enp5s0 这样的名称。我已经学会接受它,并在输入不熟悉的接口名称时自言自语。然后我安装了新 LTS 版本的 Ubuntu,并输入了 vi /etc/network/interfaces。哎呀。在经历了技术生涯中在一个简单的文本文件中输入服务器 IP 信息之后,现在不再是这样做了。唉。好消息是,在为桌面和服务器环境弄清楚 Netplan 的过程中,我修复了一个困扰我多年的 DNS 问题(稍后会详细介绍)。

Netplan 基础知识

旧的基于 Debian 的网络接口配置方式是基于 ifupdown 软件包。新的默认方式叫做 Netplan,虽然它使用起来并不难,但却截然不同。Netplan 有点像是用来配置实际配置接口的后端守护进程的接口。目前,支持的后端是 NetworkManager 和 networkd

如果您告诉 Netplan 使用 NetworkManager,则所有接口配置控制都将移交给桌面上的 GUI 界面。NetworkManager 程序本身并没有改变;它仍然是您可能已经使用了多年的基于 GUI 的界面配置系统。

如果您告诉 Netplan 使用 networkd,则 systemd 本身会处理接口配置。配置仍然是通过 Netplan 文件完成的,但是一旦“应用”,Netplan 就会创建 systemd 所需的后端配置。Netplan 文件与旧的 /etc/network/interfaces 文件截然不同,但它使用 YAML 语法,并且很容易理解。

桌面和 DNS

如果您安装了 GUI 版本的 Ubuntu,Netplan 默认配置为使用 NetworkManager 作为后端。您的系统应该通过 DHCP 或您通过 GUI 添加的静态条目获取 IP 信息。这通常不是问题,但是我在我的 split-DNS 设置和 systemd-resolved 中遇到了糟糕的体验。我确信存在配置文件的神奇组合可以让事情正常工作,但是我花了很多时间,它总是表现得有点奇怪。由于我的内部 DNS 服务器解析域名的方式与外部 DNS 服务器(即 split-DNS)不同,我遇到了随机的查找失败。有时 ping 可以解析,但 dig 不行。有时内部 A 记录会解析,但 CNAME 不会。有时我甚至会从外部 DNS 服务器(来自互联网)获得解析,即使我从未配置过除内部 DNS 之外的任何东西!

我决定禁用 systemd-resolved。这有可能破坏 VPN 中的 DNS 查找,但我还没有遇到问题。在 resolved 处理 DNS 信息的情况下,/etc/resolv.conf 文件指向 127.0.0.53 作为名称服务器。禁用 systemd-resolved 将停止自动创建该文件。值得庆幸的是,NetworkManager 本身可以处理 /etc/resolv.conf 的创建和修改。一旦我做出更改,我就不再遇到 split-DNS 解析问题。这是一个三步过程

  1. 执行 sudo systemctl disable systemd-resolved.service
  2. 然后 sudo rm /etc/resolv.conf(删除符号链接)。
  3. 编辑 /etc/NetworkManager/NetworkManager.conf 文件,并在 [main] 部分中,添加一行内容为 DNS=default 的行。

完成这些步骤后,NetworkManager 本身将创建 /etc/resolv.conf 文件,并且将使用通过 DHCP 或静态条目提供的 DNS 服务器,而不是 127.0.0.53 条目。我不确定为什么 resolved 守护程序错误地为我解析内部地址,但是上述方法一直是万无一失的,即使在使用笔记本电脑在网络之间切换时也是如此。

Netplan CLI 配置

如果 Ubuntu 安装在服务器模式下,则几乎可以肯定配置为使用 networkd 作为后端。要检查,请查看 /etc/netplan/config.yaml 文件。renderer 应该设置为 networkd 以使用 systemd-networkd 后端。该文件应该看起来像这样


network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
      dhcp4: true

重要提示: 请记住,对于 YAML 文件,空格很重要,因此缩进很重要。同样非常重要的是要记住,在进行任何更改后,您需要运行 sudo netplan apply,以便填充后端配置文件。

默认渲染器是 networkd,因此您的配置文件中可能没有该行。您的配置文件也可能在 /etc/netplan 文件夹中被命名为其他名称。所有 .conf 文件都会被读取,因此只要以 .conf 结尾,它叫什么名字都无关紧要。静态配置设置起来相当简单


network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
      dhcp4: no
      addresses:
        - 192.168.1.10/24
        - 10.10.10.10/16
      gateway4: 192.168.1.1
      nameservers:
        addresses: [192.168.1.1, 8.8.8.8]

请注意,我已经为接口分配了多个 IP 地址。Netplan 不支持像 enp3s0:0 这样的虚拟接口,而是可以将多个 IP 地址分配给单个接口。

不幸的是,如果您禁用 resolved 守护程序,networkd 不会创建 /etc/resolv.conf 文件。如果您在无头计算机上遇到 split-DNS 问题,我想出的最佳解决方案是禁用 systemd-resolved,然后手动创建 /etc/resolv.conf 文件。由于无头计算机通常不像笔记本电脑那样经常移动,因此 /etc/resolv.conf 文件可能不需要更改。不过,我仍然希望 networkd 能够像 NetworkManager 那样管理 resolv.conf 文件。

高级网络配置

配置格式不同,但仍然可以使用 Netplan 进行更高级的网络配置

绑定


network:
  version: 2
  renderer: networkd
  bonds:
    bond0:
      dhcp4: yes
      interfaces:
        - enp2s0
        - enp3s0
      parameters:
        mode: active-backup
        primary: enp2s0

支持各种绑定模式(balance-rractive-backupbalance-xorbroadcast802.3adbalance-tlbbalance-alb)。

桥接


network:
  version: 2
  renderer: networkd
  bridges:
    br0:
      dhcp4: yes
      interfaces:
        - enp4s0
        - enp3s0

桥接的设置甚至更简单。此配置使用列出的两个接口创建一个桥接设备。该设备 (br0) 通过 DHCP 获取地址信息。

CLI 网络命令

如果您像我一样是一位老旧的系统管理员,您可能会毫不犹豫地输入 ifconfig 来查看 IP 信息。不幸的是,这些工具通常不是默认安装的。这实际上不是 Ubuntu 和 Netplan 的错;旧的 ifconfig 工具集已被弃用。如果您想使用旧的 ifconfig 工具,您可以安装软件包


sudo apt install net-tools

但是,如果您想以“正确”的方式进行操作,则新的“ip”工具是正确的方法。以下是一些我常用的 ifconfig 命令的等效命令

显示网络接口信息。

旧方法


ifconfig

新方法

ip address show

(或者您也可以直接执行 ip a,实际上比 ifconfig 输入的更少。)

启动接口。

旧方法

ifconfig enp3s0 up

新方法

ip link set enp3s0 up

分配 IP 地址。

旧方法

ifconfig enp3s0 192.168.1.22

新方法

ip address add 192.168.1.22 dev enp3s0

分配完整的 IP 信息。

旧方法


ifconfig enp3s0 192.168.1.22 net mask 255.255.255.0 broadcast
 ↪192.168.1.255

新方法


ip address add 192.168.1.22/24 broadcast 192.168.1.255
 ↪dev enp3s0

添加别名接口。

旧方法


ifconfig enp3s0:0 192.168.100.100/24

新方法


ip address add 192.168.100.100/24 dev enp3s0 label enp3s0:0

显示路由表。

旧方法


route

新方法


ip route show

添加路由。

旧方法


route add -net 192.168.55.0/24 dev enp4s0

新方法


ip route add 192.168.55.0/24 dev enp4s0

老狗学新招

当我第一次安装 Ubuntu 18.04 时,我讨厌 Netplan。事实上,在我安装的特定服务器上,我实际上重新开始安装了 16.04,因为它“更舒适”。过了一段时间,好奇心战胜了我,我研究了这些变化。我仍然更习惯旧的 /etc/network/interfaces 文件,但我不得不承认,Netplan 更有道理。有一个用于配置网络的单一“前端”,它使用不同的后端进行繁重的工作。目前,唯一的后端是 GUI NetworkManager 和 systemd-networkd 守护程序。然而,有了模块化系统,有一天可能会在不需要学习新的接口配置方式的情况下进行更改。只需更改 renderer 行,就可以将配置信息发送到新的后端。

关于新的命令行网络工具(ip vs. ifconfig),它的行为确实更像其他网络设备(路由器等),所以这可能也是一个不错的改变。作为技术人员,我们需要准备好并渴望学习新事物。如果我们不是一直在尝试下一个最好的东西,我们都会配置 Trumpet Winsock 来拨号连接到我们的 Windows 95 机器上的互联网。我很高兴我尝试了那个新的 Linux 系统,虽然它没有那么戏剧化,但我很高兴我也尝试了 Netplan!

Shawn 是 Linux Journal 的副编辑,并且从一开始就接触 Linux。他对开源充满热情,并且热爱教学。他还喝太多咖啡,这经常在他的写作中体现出来。

加载 Disqus 评论