Linuxネットワークネームスペース間のネットワークデバイスの移動

Linuxネットワークネームスペース間のネットワークデバイスの移動

Linuxでは、2つのネットワーク名前空間が設定されており、ns12つのネットワーク名前空間を表示できますns2ip netns list

ネットワークデバイスをLinuxルートネームスペースからに移動してns1から削除し、ns1ネットワークデバイスを再度移動したいと思います。ns2ns2ns1

実際の結果は、eth1Linuxルートネットワークの名前空間に戻ることです。期待どおりに動作するかどうかはわかりません。

詳細なテストシナリオは次のとおりです。

  1. ip netns add ns1
  2. ip netns add ns2
  3. ip link set eth1 netns ns1
  4. ip netns exec ns1 ip link set eth1 netns ns2
  5. ip netns del ns2

予想される結果: eth1なるだろうns1

実際の結果: eth1Linuxルートネームスペース1に戻る

質問:デバイスがLinuxルートネットワーク名前空間1の代わりにns1として返されるようにこれを実装する方法はありますか?

答え1

私が知る限り、「物理的」ネットワークインタフェースがいわゆる「初期」ネットワークネームスペース以外のネットワークネームスペースに戻るように強制する方法はありません。 Patrickのコメントとは異なり、Linuxカーネルはネットワークネームスペースを次のように見なします。平らなしたがって、階層はありません(参照:ioctl_ns - Linux 名前空間 ioctl() 操作、これは明示的にのみ言及しています。PIDそしてユーザー名前空間は階層的です。

定義されたネットワーク名前空間の階層がないため(IPスタック、アドレス、およびルーティングテーブルに適用するのが難しい)、Linuxには、ネットワークインタフェースをinit(1)が実行した初期ネットワーク名前空間に戻すマスターに戻るルールがあります。あります。 / PID1がネットワークネームスペースに参加しました。

ip netns add ...あなたがすべきことは、呼び出しを介して新しいネットワーク名前空間を作成し、それをunshare()バインドマウントして/run/netns/ns1浮動状態に保つことです。その後、ip nets add ...再起動して、他のネットワーク名前空間のマウントを/run/netns/ns2完全に関連付けられていない2つのネットワーク名前空間にバインドします。

関連情報