ip route get 将地址识别为任播

ip route get 将地址识别为任播
# ip route get 1.2.3.4
anycast 1.2.3.4 dev eth0  src 5.6.7.8

问题是它如何知道该地址是任播?(显然这是真的)。

更新:

呈现为任播路由:

root@hv2 ~ # ip route get 1.2.3.4
anycast 1.2.3.4 dev eth0  src 5.6.7.8 
    cache 

但在列表中不可见:

root@hv2 ~ # ip route list|grep 1.2.3.4|wc -l
0

但可以删除它,然后恢复正常(不再如此anycast):

root@hv2 ~ # ip route del anycast 1.2.3.4 dev eth0
root@hv2 ~ # ip route get 1.2.3.4
1.2.3.4 via 5.6.7.8 dev eth0  src 9.10.11.12 
    cache 

答案1

如果你看看iproute2 gitweb,你会看到它显示了RTN_ANYCAST内核路由结构上设置的位的状态。如果你将其与内核源代码(rtnetlink.h)你会看到以下评论:

    RTN_ANYCAST,            /* Accept locally as broadcast,
                               but send as unicast */

如果您查看手册页,您会看到地址的任播状态由配置决定(特别是在anycast指定要添加的地址时添加关键字)。根据man 8 ip

   IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ]
           [ label STRING ] [ scope SCOPE-ID ]

   ...
           anycast   -   _not  implemented_  the  destinations are anycast
           addresses assigned to this host.  They are mainly equivalent to
           local with one difference: such addresses are invalid when used
           as the source address of any packet.

从手册的第一部分可以看出,当您指定地址时,您可以指示堆栈它是一个任播地址。无需检查内核源代码,我就可以想象,当您添加任播地址时,任播位会传播到添加地址时创建的相应路由表条目。

我不确定“未实现”部分是否完全正确,因为看起来 iproute2 确实将任播标志传递到了系统调用中。因此,如果内核支持任播,它似乎应该可以工作。但我还没有测试过,所以我不知道。

答案2

从手册页中的ip-route“ip route get”部分中:

请注意,此操作不等同于 ip route show。show 显示现有路由。get 解析它们并在必要时创建新的克隆。本质上,get 相当于沿着此路径发送数据包

您可以使用命令显示任播路由ip route show type anycast

相关内容