ip route get 2607:f8b0:4005:804::200e
将向我显示到达 的最佳(最长前缀)路线google.com
,但它不显示全部可以带我去那里的路线。
现在我正在使用ip -6 route show | grep 2607:f8b0:
.这会打印正确的路线,但也会打印 /32 中的所有其他路线。
必须有更好的方法。
答案1
有一种简单的方法可以列出 linux 上匹配前缀的所有路由:
ip -6 route list match 2607:f8b0:4005:804::200e table all
这将列出所有表中到指定目标的所有可能路由(包括默认路由,如果没有找到更具体的路由)。显然,这也适用于 IPv4。
PS:我知道我的回答有点太晚了,很可能你已经自己想到了这一点,但是尽管如此 - 无论谁提出这个问题都可能会发现它很有帮助:)
答案2
如果我的解释是正确的,您想查明特定的 ipv6 地址(google.com 的)是否包含在路由表条目(网络/网络掩码)中,如果包含则打印路由。
如果是这样,那么:
获取 google.com 的 ipv6 地址,例如
host -t aaaa
获取所有 ipv6 路由的列表。例如与
ip -6 route show
.或者查询您的路由守护程序以获取列表。对于每个 ipv6 路由,检查 google.com 的 ipv6 地址是否包含在该网络和网络掩码中。
perlNet::CIDR
模块具有cidrlookup()
检查 IP 地址是否在网络块(或网络块数组)中的功能 - 它适用于 ipv4 和 ipv6 地址。 perl
还有一个Net::DNS
用于进行 DNS 查找的模块,并且可能具有用于从各种路由器/路由守护程序获取路由表的模块 - perl 有一个模块(或两个,或十几个)可以执行几乎任何您能想到的事情。不管怎样,从输出中提取你需要的东西是很容易的ip -6 route show
。
注意:这只会找到包含目标 IP 的网络/掩码的路由表中存在特定路由的匹配项。当然,“默认”路由包含每个 IP。
如果您不想使用perl
,还有libcidr。自己编写应该不会太难(或者可能有人已经完成了)。