web-dev-qa-db-ja.com

Ubuntuの「ip address」コマンドの出力のインターフェース名で「if1 @ if2」はどういう意味ですか

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
6
Bruno Rijsman

これは、リンクのピアインターフェイスインデックスを表します。このプロパティはどのインターフェースでも使用できるように見えますが、veth、macvlan、vlan(サブインターフェース)などのいくつかのインターフェースタイプに対してのみ意味があります。他のインターフェースとの関係があるためです。

特定のインターフェースには、たとえばそこに読み取ることができるインデックスがあります。

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

そのピアリンクインターフェイスはそこで読むことができます:

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

どうやら、それが意味をなさない場合でも、パラメーターは存在しますが、ifindexと同じです。これは通常の通常または単純なインターフェース(実際のハードウェアeth0、wlan0、dummy0など)の場合です。

ip linkコマンドは、iflink値を解釈するだけです。

  • iflinkが0の場合(どうやらipnameトンネルの場合、ネットネームスペースでも奇妙な動作をします)、@NONEが出力されます
  • iflinkに一致するifindexがない場合、@ifXXXXifindexです。一致するifindexがないことは、それが他のネット名前空間に関連していることを知るのに十分です。後で参照してください。
  • ififlink自体(iflink==ifindex@は表示されません。これは実際のインターフェース(eth0 ...)で発生するはずですが、バグである可能性もあります(後述)。
  • iflinkに一致するifindexがある場合、このインデックスの名前が表示されます。

一致するifindexはいつ見つかりませんか?そのインターフェースがその他のネットワーク名前空間にある場合。これは、結果の最後にlink-netnsidが追加されたために判明しています。この値はip link外では簡単に利用できません(このQ/Aを参照してください: vethピアのifindexのネットワーク名前空間を見つける方法は? )。これは、対応するピアネットワーク名前空間のローカルに割り当てられたnsidを表します。コンテナーの場合、最初の(そしておそらく唯一の)値0は、ほとんど常にホストのネット名前空間を表します。ホストの場合、おそらくコンテナごとに1つのlink-netnsid値があり、最初のコンテナのlink-netnsidは0です。この値は絶対名前ではなく、ネット名前空間に対してローカルであるため、直接比較することはできません。 2つのネット名前空間間( 前のリンク を参照)。

したがって、ifindexが見つからないことは、それが他の名前空間にあることを意味します。 link-netnsidプロパティの存在によって確認されます。

iflink、つまりpeerインターフェースのインデックス値、他のネット名前空間にあるとき、たまたまローカルインターフェースと同じ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:。おそらく、ピアのvethリンクであるインデックス44のインターフェイスが見つかります。 (中間の見えないネット名前空間がない限り)。

7
A.B