我在通过 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 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。
所以这里的解决方案有点棘手:您需要添加网关作为带有 /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)
归档时间: |
|
查看次数: |
17887 次 |
最近记录: |