Linux 路由匹配不正确 - 网络不可达

Linux 路由匹配不正确 - 网络不可达

如果我有两条目的地相同的路由,系统不应该选择与其源地址匹配的路由吗?我正在尝试使用关键字from将源地址约束路由添加到路由表中。

例如,我有一个主机,其2001:db9:1::2接口地址为。如果我添加如下所示的e1正常路由,则可以正常工作:2001:db9:1::3ping6

root@pc:/# ip -6 route add 2001:db9:1::3 dev e1
root@pc:/# ip -6 route
2001:db9:1::3 dev e1  metric 1024

接下来我使用关键字添加源约束路由from,使用未分配给任何接口的一些源地址:

root@pc:/# ip -6 route add 2001:db9:1::3 from 2001:db9:a::2 dev e1
root@pc:/# ip -6 route
2001:db9:1::3 from 2001:db9:a::2 dev e1  metric 1024
2001:db9:1::3 dev e1  metric 1024

如果我现在尝试 ping,则会收到网络不可达消息。当系统发现第一个源约束条目不起作用时,它不应该尝试第二个条目并成功吗?

有趣的是,如果我添加一条带有from说明符但源地址正确的路由,则会选择正确的路由,并且 ping 成功。

root@pc:/# ip -6 route add 2001:db9:1::3 from 2001:db9:1::2 dev e1
root@pc:/# ip -6 route
2001:db9:1::3 from 2001:db9:1::2 dev e1  metric 1024
2001:db9:1::3 from 2001:db9:a::2 dev e1  metric 1024
2001:db9:1::3 dev e1  metric 1024

(我也尝试过用作2001:db9:1::1源,结果仍然成功,所以字典顺序并不重要)。因此,如果目的地存在源约束路由,则非源约束路由似乎会被忽略。

我已经检查了内核配置(版本 4.9.13)并IPV6_SUBTREES已启用。有什么想法吗?

答案1

似乎在同一个路由表中混合使用普通路由和源特定路由会导致意想不到的行为。Linux 内核源代码中的 net/ipv6/Kconfig 中提到了这一点:

config IPV6_SUBTREES
    bool "IPv6: source address based routing"
    depends on IPV6_MULTIPLE_TABLES
    ---help---
      Enable routing by source address or prefix.

      The destination address is still the primary routing key, so mixing
      normal and source prefix specific routes in the same routing table
      may sometimes lead to unintended routing behavior.  This can be
      avoided by defining different routing tables for the normal and
      source prefix specific routes.

      If unsure, say N.

将源约束路由放入单独的路由表中可产生正确的行为。

相关内容