![ip route get 将地址识别为任播](https://linux22.com/image/636900/ip%20route%20get%20%E5%B0%86%E5%9C%B0%E5%9D%80%E8%AF%86%E5%88%AB%E4%B8%BA%E4%BB%BB%E6%92%AD.png)
# 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
。