我在通过 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
之间的区别。ip
systemd-networkd
Route
# 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,因此我甚至不再指定网关(仅指定地址,没有路由),但仍然出现此错误。