How to ping a IPv6 address on Linux?

假如我想透過ping6檢查一個ipv6的主機是否還活著,我可能需要注意些什麼?

從許多網路文章都可以知道,ping FE80::/64(link-local)位置必須加上網卡名稱:

ping6 fe80::28e8:eeea:c9c2:4f04%eno1
ping6 fe80::28e8:eeea:c9c2:4f04 -I eno1
而ping非link-local如Global或Unique的位置不需要加網卡名稱:
ping6 2a00:1450:8003::69
對programmer來說,使用相同方式會比較好維護,因此指令都加上網卡名稱可能是個方法。然而,為了方便使用者使用,有沒有可能不需讓使用者提供網卡名稱呢? 是否程式可以自己嘗試所有網卡名稱,來告訴使用者目標機器是否還活著呢? 我的意思是指,假設有網卡eno1與eno2,是否可能透過以下指令,來告訴使用者 fe80::28e8:eeea:c9c2:4f04這台機器活著呢?
ping6 fe80::28e8:eeea:c9c2:4f04%eno1
ping6 fe80::28e8:eeea:c9c2:4f04%eno2
這方法最大的問題在於,如果兩個網段都存在著相同的IPv6位置,就會誤判。我有兩台主機,網路設定如下:
Linux:

Windows:

其中Windows eth5與Linux eno1的Link-Local位置重複。接著在另外一台主機執行ping指令:

可以得知,如果使用每張網卡都ping的方式,的確有可能會發生誤判的情形。因此,有幾個做法:

  • 忽略這種會重複的情況。畢竟位置這麼多,重複機率極低。PRTG和opManager應該都是使用這種模式。
  • 根據網卡去管理。就我所知,華為eSight在使用之前,會先選擇管理的網卡。

在比較舊版本的Linux中,是無法使用ping -6,因此建議直接使用ping6。此外,我在CentOS7.3曾發生過-I參數無效的情形(link),因此建議使用%去傳遞管理網卡名稱。

ping6 [位置]%[網卡名稱]