列出 Linux 路由表中到目的地的*所有* IP 路由

列出 Linux 路由表中到目的地的*所有* IP 路由

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 的)是否包含在路由表条目(网络/网络掩码)中,如果包含则打印路由。

如果是这样,那么:

  1. 获取 google.com 的 ipv6 地址,例如host -t aaaa

  2. 获取所有 ipv6 路由的列表。例如与ip -6 route show.或者查询您的路由守护程序以获取列表。

  3. 对于每个 ipv6 路由,检查 google.com 的 ipv6 地址是否包含在该网络和网络掩码中。

perlNet::CIDR模块具有cidrlookup()检查 IP 地址是否在网络块(或网络块数组)中的功能 - 它适用于 ipv4 和 ipv6 地址。 perl还有一个Net::DNS用于进行 DNS 查找的模块,并且可能具有用于从各种路由器/路由守护程序获取路由表的模块 - perl 有一个模块(或两个,或十几个)可以执行几乎任何您能想到的事情。不管怎样,从输出中提取你需要的东西是很容易的ip -6 route show

注意:这只会找到包含目标 IP 的网络/掩码的路由表中存在特定路由的匹配项。当然,“默认”路由包含每个 IP。

如果您不想使用perl,还有libcidr。自己编写应该不会太难(或者可能有人已经完成了)。

相关内容