我在通过 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
在于永远不会执行第二个块。我做了一些调试,这是第一个块的功能ip
和systemd-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 …
Run Code Online (Sandbox Code Playgroud)