Linux - 查找路由器 IPv6 全局地址

fil*_*ter 1 linux bash ipv6

我正在尝试找到一种方法来可靠地找到本地路由器的全局 IPv6 地址。命令“ip -6 neigh show”不会显示它。只要路由器使用 EUI-64 生成主机地址,我发现以下工作:

NET=$(ip -6 route|egrep "^[23]"|cut -d':' -f1-4)
EUI=$(ip -6 route|egrep "^default.*metric 1 "|cut -d':' -f3-6|cut -d' ' -f1)

ping6 $NET:$EUI -B -c 1 > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

然而,当不使用 EUI-64 时,这显然不起作用。我还有其他方法可以找到吗?

Jer*_*ser 5

没有可靠的方法来确定这一点,因为您的本地路由器根本不需要具有全局 IPv6 地址。最佳实践表明应该这样做,而且绝大多数路由器都会这样做,但从技术上讲,您的路由器可能只能在两个接口上都有链路本地地址,但仍然路由全局前缀。(是的,我以前这样做过。是的,它\xe2\x80\x99s 是邪恶的。)

\n\n

除非您手动添加指向全局地址的默认路由,否则您可能通过路由器通告获悉默认路由,这意味着路由表和邻居表(正如您上面指出的)将仅包含链路本地地址。

\n\n

但是,如果您执行跟踪路由,第一跳可能是(关键字:可能 \xe2\x80\x94 it\xe2\x80\x99s 可能会欺骗这个东西)您的本地路由器。

\n\n
traceroute to 2600:: (2600::), 30 hops max, 80 byte packets\n 1  2001:db8:1::1        0.534 ms   0.510 ms   0.749 ms\n 2  2001:db8:2::1       32.494 ms  33.944 ms  35.406 ms\n 3  2600::              36.935 ms  38.102 ms  39.860 ms\n
Run Code Online (Sandbox Code Playgroud)\n\n

TL;DR \xe2\x80\x99s 不可能可靠地确定这一点,所以简短的答案是 \xe2\x80\x9cno\xe2\x80\x9d。

\n