使用 systemd-networkd 进行接口配置的顺序

使用 systemd-networkd 进行接口配置的顺序

我使用的是 Ubuntu 20.04,带有 systemd-networkd 和 Netplan。我有两个物理接口(ens3ens4),它们由 DHCP 配置(有预留,因此我总是获得相同的地址)。

此外,我有两个隧道设备。它们不受 Netplan/networkd 控制(它们由 Strongswan 创建,但实际上它们是通过运行类似 的程序手动创建的ip tunnel add...)。这些隧道设备添加了一个ip route用于向其发送流量的命令。最初创建时,它们工作正常,但 systemd-networkd 最终会删除路由。

为了解决这个问题,我已成功配置了 systemd-networkd 中的隧道设备,但由于在配置之前尝试了路由,因此无法创建路由(我在 syslog 中看到ens3)。我已通过打开确认了顺序ens4tunnel1: Could not set route: Invalid prefsrc address. Invalid argument调试日志

我可以手动添加路线:

ip route add 10.0.32.0/20 dev tunnel1 scope link src 10.0.16.170 metric 100

...它工作正常,但稍后会被 systemd-networkd 删除。

文档说“所有配置文件都按词汇顺序集体排序和处理,无论它们位于哪个目录中。”,所以我查看了其他配置文件,并在以下位置找到了这些文件/run/systemd/network

10-netplan-ens3.link
10-netplan-ens3.network
10-netplan-ens4.link
10-netplan-ens4.network

我尝试将我的netdevnetwork文件命名为99-tunnel1.netdevzzzz-tunnel1.netdev等,甚至尝试使用00-等。无论我做什么,似乎总是ens3ens4在隧道接口之后配置,因此路由总是添加失败。

我也尝试过在 Netplan 中配置我的设备。这会让一些事情变得棘手,但最终还是会出现同样的问题。即使它创建了类似的文件10-netplan-tunnel1.network(在词汇上位于 ens3/ens4 文件之后),它们仍然会被 networkd 以错误的顺序应用。

我肯定我遗漏了一些东西,但我看不出是什么。有什么想法吗?

我的tunnel1.netdev样子是这样的:

[NetDev]
Name=tunnel1
Kind=vti
MTUBytes=1419

[Tunnel]
Remote=1.2.3.4
Local=2.3.4.5
Key=100

...看起来.network像这样:

[Match]
Name=tunnel1

[Link]
RequiredForOnline=no
MTUBytes=1419

[Address]
Address=169.254.102.162/30
Peer=169.254.102.161/30

[Route]
Destination=10.0.32.0/20
PreferredSource=10.0.16.170
Metric=100
Scope=link

答案1

我认为我们这里有两个问题:

1/ 删除源路由可能是由于 ens3/4 接口上出现间歇性载波丢失。当接口关闭时(即使只是短暂关闭),它会刷新 IP 地址以及与此 IP 地址相关的源路由。然后它通过 DHCP 重新配置 IP,但丢失了您手动添加的源路由。尝试创建一个配置覆盖插件,例如/etc/systemd/network/10-netplan-ens3.network.d/override.conf

[Network]
ConfigureWithoutCarrier=true
IgnoreCarrierLoss=true

2/ systemd-networkd 按词汇顺序处理 .network 文件,但仅在收到 DHCP 租约后才异步接收 DHCP 提供的 IP 地址。networkd 不会阻止此 DHCP 响应上的其他接口(即您的隧道接口)的配置,因此无法添加路由,因为该源 IP 在当时尚不存在。

您说您有一个配置,它始终通过 DHCP 为您提供相同的 IP 地址。为什么不静态指定这个相同的 IP 地址(例如addresses: [10.0.16.170/30]在 netplan 中 - 或任何网络掩码)?这样 networkd 应该能够PreferredSource=毫无问题地添加您的地址,并在运营商丢失后重新配置它。

相关内容