ping ipv6在CentOS7.3上的問題

在linux中,ping ipv6的主機可以使用ping6或ping -6。可以從許多網路文章中得知,ping FE80::/64(link-local)位置必須加上網卡名稱,例如:

ping6 fe80::28e8:eeea:c9c2:4f04%eno1
ping6 fe80::28e8:eeea:c9c2:4f04 -I eno1
否則會出現錯誤訊息connect: invalid argument;然而在CentOS/RHEL7.3系統上,卻不需要加上網卡名稱就能夠執行指令。本篇文章主要分享我針對這問題的實驗結果。

首先我透過ping6 -V指令,查詢不同linux中ping的版本:

可以發現RHEL7.3使用了20160308的版本,這有可能是新版本支援自動偵測的功能。

後來用yum更新了Centos7.2中的iputils套件到20160308-10,卻一樣需要加上網卡名稱才能ping link-local;最後注意到如果使用RHEL/Centos7.3自帶的iputils rpm,就不需要加網卡名稱。我仔細看發現它的版本是20160308-8。假如是自動偵測的話,為什麼較新的版本卻沒有這樣的功能呢?

後來我在測試多網卡的情況時,發現了以下現象:

-I參數指定網卡名稱沒作用。以我的例子來說,我指定了eno1,但它卻使用eno2去ping目標位置;我改透過以下指令才真的有使用eno1去ping目標位置:

ping6 fe80::1c23:4c59:72c5:f929%eno1 -c 2


因此我推測在20160308那天,應該build了20160308-8與20160308-10兩個版本,而20160308-8是有問題的。這只是推測,對我們來說,我只需要一個可靠的方法就好;因此,對於ping ipv6比較安全的作法我會使用%而不使用-I:
ping6 [ipv6_addr]%[nic_name]
有些人可能會使用ping加上-6取代ping6,但必須注意在比較舊的系統可能不支援這種方式。