Linux IPv6:为从路由器通告中获知的默认网关指定策略路由表?

Linux IPv6:为从路由器通告中获知的默认网关指定策略路由表?

有没有办法告诉内核哪个策略路由表应该接收从 IPv6 路由器通告中获知的默认路由?

我的家庭网络拥有 Spectrum 的原生 IPv6 服务和 Hurricane Electric 的隧道,出于其他原因我仍然需要这些服务。他们不会进行路由器重定向,因此我使用策略路由来为每组源地址维护单独的路由表。

我的策略规则列表首先搜索“主”路由表,该路由表仅限于可以使用任意一组源地址到达的本地目标前缀。我告诉 dhcpcd 告诉内核不要将默认路由放入该表中,因此如果没有匹配路由,则将进入下一个规则。

下一个规则仅针对 HE 源地址调用 HE 特定表。该表仅包含指向 HE 的默认路由。

最后一条规则仅针对 Spectrum 源地址调用特定于 Spectrum 的表。它仅包含指向 Spectrum 的默认路由。

对于静态脚本来说,这一切都运行得很好,但在我的脚本中硬连线地址似乎不太优雅。如果 Spectrum 更改其 IPv6 路由器地址怎么办?

我想自动维护到 Spectrum 的默认路由,但 Linux 内核只给了我两个选择:选择 Spectrum 的路由器通告并将其放入“主”表中的默认路由中,或者(如果您设置“accept_ra_def_rtr=0”),则不执行任何操作。 dhcpcd 不会告诉您 IPv6 网关地址,因为 DHCP6 与 DHCP4 不同,不会分配 IPv6 网关;该功能由内核在收到路由器通告消息时完成。

可以让内核在“主”表中安装 Spectrum 的默认路由,仅当源地址属于 Spectrum 时才调用该表,然后转到 HE 表。但随后我必须在 HE 表中复制所有本地路由,这又会变得混乱。

我想到了一个简单而明显的答案:让告诉内核哪个用于从 IPv6 路由器通告获知的到网关的默认路由的路由表。甚至还有一个名为“default”的特殊表,它会自动放在策略规则列表的末尾。但我找不到任何方法告诉内核这样做。它要么是“主”表,要么什么都不是。同样,我宁愿将“主”表限制为由 dhcpcd(部分)管理的本地条目(例如我从 Spectrum 委托的前缀)。

还有其他人遇到过这个问题吗?有什么解决方法吗?

答案1

使用这个抑制器ip rule:

抑制前缀长度 NUMBER
         拒绝前缀长度为 NUMBER 或更小的路由决策。

您可以在第一个(较低优先级值)规则中使用未修改的主表,同时通过使用以下内容来忽略其默认路由:

ip -6 rule add priority 32000 from all lookup main suppress_prefixlength 0

该规则将忽略主路由表中的任何 /0 前缀,即“default”默认路由。

如果之前没有其他匹配(即:如果 HE 源的规则在中间规则中不匹配),则主表仍可以稍后通过其默认路由重用(在优先级为 32766 的通常规则中)。

相关内容