Linux

Ubuntu上“ip地址”命令輸出中的介面名稱中的“if1@if2”是什麼意思

  • May 20, 2018

符號 (@) 在 Ubuntu 上的“ip address”命令(或“ip link”命令)的輸出中的介面名稱中是什麼意思,例如以下輸出中的介面名稱“eth0@if44”:

root@aafa1fc24a0b:/# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
   link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
   link/tunnel6 :: brd ::
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
   link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
   inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
      valid_lft forever preferred_lft forever

其他相關資訊:

  • 這是在 Ubuntu 16.04 上
  • 在 docker 容器內執行
  • 容器附加到使用者定義的網橋
  • 有問題的介面 (eth0@if44) 不是 VLAN

設置創建如下:

docker network create my-bridge
docker run --name my-container-1 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity
docker run --name my-container-2 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity

這表示鏈路的對等介面索引。儘管此屬性似乎可用於任何介面,但僅對少數介面類型有意義:veth、macvlan、vlan(子介面)……因為它們與其他介面有關係。

任何給定的介面都有一個可以讀取的索引,例如:

/sys/class/net/<interface>/ifindex

它的對等鏈路介面可以在那裡讀取:

/sys/class/net/<interface>/iflink

顯然,如果它沒有意義,該參數仍然存在,但與ifindex相同。對於通常的普通或簡單介面(真正的硬體 eth0、wlan0、dummy0,…),情況就是如此

這些ip link命令只解釋iflink值:

  • 如果iflink為 0(顯然對於 ipip 隧道,它在網路名稱空間中的行為也很奇怪),它將列印@NONE
  • 如果iflink沒有匹配的 ifindex,它將顯示@ifXXXXifindex 。沒有匹配的ifindex就足以知道它與其他網路命名空間相關,請參見下文。
  • 如果iflink是它本身 ( iflink == ifindex ) 它不會顯示任何東西@。這就是真實介面(eth0 …)應該發生的事情,但也可能是一個錯誤(見下文)。
  • 如果iflink有一個匹配的ifindex,它將顯示這個索引的名稱。

什麼時候找不到匹配的ifindex?當該介面位於其他網路命名空間中時。這是已知的,因為link-netnsid附加在結果的末尾。該值在外部不容易獲得ip link(請參閱此 Q/A:如何找到 veth 對等點 ifindex 的網路命名空間?)。它表示本地分配的對應對等網路命名空間的 nsid。對於容器,第一個(也可能是唯一的)值 0 幾乎總是代表主機的網路命名空間。對於主機,每個容器可能會有一個 link-netnsid 值,第一個容器的 link-netnsid 為 0。注意這個值是 net 命名空間的本地值,不是絕對 id,所以不能直接比較在兩個網路命名空間之間(參見上一個連結)。

所以找不到ifindex肯定意味著它在另一個命名空間中。link-netnsid財產的存在證實了這一點。

有時iflink,即對介面的索引值,在另一個網路命名空間中時,恰好與本地介面(在目前網路命名空間中)具有相同的 id。ip link在這種情況下不會顯示任何@內容,其邏輯是它是一個通用介面,但這是錯誤的,如本例所示:

# ip -o link show dev veth1
3: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000\    link/ether 7e:d9:ca:77:87:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# cat /sys/class/net/veth1/{ifindex,iflink}
3
3

(請注意link-netnsid 0連結位於其他網路名稱空間中的含義。)

在其他情況下(我沒有設法重現,因此可能已更正)它甚至可能使用其他網路名稱空間索引顯示本地介面名稱。

對於您的範例,如果您在主機上執行(而不是在容器中):ip -o link |grep ^44:. 您肯定會找到索引為 44 的介面,這是對等點的 veth 連結。(除非有一個中間不可見的網路命名空間)。

引用自:https://unix.stackexchange.com/questions/444892