如果我有两条具有相同目的地的路由,系统不应该选择与其源地址匹配的路由吗?我正在尝试使用from
关键字将源地址约束路由添加到路由表中。
例如,我有一个地址为2001:db9:1::2
in interface 的主机e1
。如果我添加一条正常路线,2001:db9:1::3
如下所示,ping6
效果很好:
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
as source,结果仍然成功,所以字典顺序并不重要)。因此,如果目的地存在源约束路由,则似乎非源约束路由将被忽略。
我已经检查了内核配置(版本 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.
将源受限路由放入单独的路由表中可以提供正确的行为。