systemd-networkd 和直接路由

systemd-networkd 和直接路由

我在通过 systemd-networkd 添加直接路由时遇到问题。我试图实现的功能类似于:

ip a a 192.168.0.2/32 dev enp0s3
ip r a 192.168.0.1/32 dev enp0s3
ip r a default via 192.168.0.1

我知道这是一个奇怪的设置,但我无法使用常规方式ip a a 192.168.0.2/24访问网关。出于某种原因,整个 /24 子网都可以通过此子网中的网关访问。因此,此默认路由不仅适用于捕获所有路由,还可用于访问子网。因此,我创建了 /etc/systemd/network/enp0s3.network:

[Match]
Name=enp0s3

[Address]
Address=192.168.0.2/32

[Route]
Destination=192.168.0.1/32

[Route]
Gateway=192.168.0.1

这种设置的问题是第二个块从未执行过。我进行了一些调试,以下是第一个块执行的操作与执行的操作Route之间的区别。ipsystemd-networkdRoute

# ip
192.168.0.1 dev enp0s3 scope link
# networkd
192.168.0.1 dev enp0s3 proto static

因此systemd-networkd不会添加scope link到路线中。这就是为什么尝试通过添加默认路线192.168.0.1会失败并出现Network is unreachable错误的原因。这可以通过

ip r c 192.168.0.1/32 dev enp0s3 # automatically adds `scope link`
ip r a default via 192.168.0.1   # added successfully

所以我的问题是:这种行为应该被视为systemd-networkd错误还是我使用错误?我找不到有关 networkd 中直接路由的任何文档。目前,我已禁用systemd-networkd并创建了直接运行ip命令的服务。但我想使用标准方法,因为这是我正在尝试配置的 CoreOS。

答案1

因此,这里的解决方案有点棘手:您需要添加网关作为 pointopoint 参数,并使用 /32 掩码。这有效:

[Match]
Name=enp0s3

[Address]
Address=192.168.0.2
Peer=192.168.0.1/32

[Network]
Gateway=192.168.0.1

答案2

您想要的是指定如何通过本地范围访问网关。也就是说,它实际上可以在同一个网段上访问。您的示例只是缺少了一行Scope=link

[Match]
Name=enp0s3

[Address]
Address=192.168.0.2/32

[Route]
Destination=192.168.0.1/32
Scope=link

[Route]
Gateway=192.168.0.1

答案3

GatewayOnlink=true由于缺少systemd 237,所以提出的所有解决方案均不适用。

我已经能够使用具有 /32 接口地址的链路本地 IPv4 网关,其配置如下:

[Match]
Name=eth0

[Network]
Address=192.0.2.42/32

[Route]
Destination=169.254.1.1
Scope=link

[Route]
Gateway=169.254.1.1
GatewayOnlink=true

答案4

我对 IPv6 有一个类似的设置(有人在这里描述了这种情况:https://phyks.me/2014/11/getting-ipv6-to-work-with-a-kimsufi-server.html)。

对于你的情况,可以翻译如下:

[Math]
Name=enp0s3

[Network]
Address=192.168.0.2/32
Gateway=192.168.0.1

[Route]
Destination=192.168.0.1

它运行正常(至少在我的情况下),尽管我最近注意到 systemd-networkd 输出enp1s0f0: Could not set NDisc route or address: Invalid argument。但不确定为什么,我的系统仍然有效。

编辑:这个错误似乎无关紧要。我发现我的提供商已启用 RA,因此我甚至不再指定网关(仅指定地址,没有路由),但仍然出现此错误。

相关内容