systemd-networkd 和直接路由

Ine*_*neu 8 routing systemd

我在通过 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
Run Code Online (Sandbox Code Playgroud)

这是奇怪的设置,我知道,但我不能使用通常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
Run Code Online (Sandbox Code Playgroud)

此设置的问题Route在于永远不会执行第二个块。我做了一些调试,这是第一个块的功能ipsystemd-networkd功能之间的区别Route

# ip
192.168.0.1 dev enp0s3 scope link
# networkd
192.168.0.1 dev enp0s3 proto static
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

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

Ine*_*neu 9

所以这里的解决方案有点棘手:您需要添加网关作为带有 /32 掩码的点点参数。这有效:

[Match]
Name=enp0s3

[Address]
Address=192.168.0.2
Peer=192.168.0.1/32

[Network]
Gateway=192.168.0.1
Run Code Online (Sandbox Code Playgroud)


小智 9

您想要的是指定如何通过本地范围访问网关。也就是说,它实际上可以在同一段上访问。你的例子只是缺少行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
Run Code Online (Sandbox Code Playgroud)