systemd-networkd和直接路由

我有通过systemd-networkd添加直接路由的问题。 我试图达到的是类似于:

ip aa 192.168.0.2/32 dev enp0s3 ip ra 192.168.0.1/32 dev enp0s3 ip ra default via 192.168.0.1 

这是奇怪的设置,我知道,但我不能使用通常的ip aa 192.168.0.2/24到达网关。 出于某种原因,整个/ 24子网可通过此子网中的网关到达。 所以这个默认路由不仅适用于通用路由,而且也适用于子网。 所以,我创build了/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块从不执行。 我做了一些debugging,这是什么ipsystemd-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 rc 192.168.0.1/32 dev enp0s3 # automatically adds `scope link` ip ra default via 192.168.0.1 # added successfully 

所以我的问题是:如果这样的行为被认为是systemd-networkd错误,或者我用错了吗? 我无法find有关networkd中直接路由的任何文档。 现在我已经禁用了systemd-networkd并创build了服务来直接运行ip命令。 但我想使用标准的方法,因为这是我试图configuration的CoreOS。

所以这里的解决scheme有点棘手:你需要添加网关作为pointopoint参数/ 32掩码。 这工作:

 [Match] Name=enp0s3 [Address] Address=192.168.0.2 Peer=192.168.0.1/32 [Network] Gateway=192.168.0.1 

你想要的是指定如何通过本地作用域到达网关。 这实际上是在同一部分可以达到的。 你的例子只是缺lessScope=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 

我有一个类似的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 

它工作正常(至less在我的情况下),虽然我最近注意到systemd- enp1s0f0: Could not set NDisc route or address: Invalid argument输出enp1s0f0: Could not set NDisc route or address: Invalid argument 。 但不知道为什么和我的系统仍然有效。

编辑:这个错误似乎无关。 我发现我的提供者已经启用了RA,所以我甚至没有指定一个网关(只是一个地址,没有路由),仍然有这个错误。