既存の匿名ネットワーク名前空間に名前を割り当てる方法

既存の匿名ネットワーク名前空間に名前を割り当てる方法

ネットワークネームスペースを作成するが/run/netnsに登録しないLinuxプロセスがあります。プロセスには独自のPID名前空間もあります。ネットワークネームスペースには名前がなく、ネームスペースのIDのみを表示できます。

# ip netns list-id
nsid 0
nsid 1

便利なip-netnsコマンドを使用してネームスペースを表示および管理できるように、ネットワークネームスペースに名前を割り当てることはできますか?

記事を見つけました。名前のないネットワーク名前空間にアクセスする方法しかし、私のプロセスには独自のPIDネームスペースがあり、ルートネームスペースでプロセスを見ることができないため、機能しません。

ベストアンサー1

名前空間の下位レベルの処理には実際の名前はありません。これはすべて、各コマンドで実行される一般的なタスクまたは期待によって処理されます。IP ルート 2母音。

既存の匿名ネットワーク名前空間に名前を割り当てることは、実際には次のことを意味します。IP ルート 2ツールは、このネットワーク名前空間を作成するときに一般設定を指定したと信じています。

それでは、ip netns add foo実際に何をしているのでしょうか?新しいネットワーク名前空間の共有を解放し、それを使用するプロセスがなくても、名前空間を存在してマウントされたままにします。一般的な*nix哲学では、名前空間はインデックスノード擬似ファイルシステム内の擬似ファイルを表す数値国立科学財団。ファイルを使用して何もすることはほとんど不可能ですが(読み込むことはできません)、ファイルを開いて名前空間操作のためのトークンとして使用したり、setns(2)バインドマウントとしてマウントしたりできます。

残念ながら、nsidリンクは直接使用できません。他の名前空間を表すグローバル値ではありません地元の(ローカルには一意ですが、リサイクル可能でグローバルには一意ではありません)協会別の名前空間へ。複数の値は複数の異なる名前空間へのリンクを意味し、同じ値が2回意味するのは同じ異なる名前空間への2つのリンクです。

他の名前空間を見つけるためにここから始める必要がある場合は、確認してください。他のQ&Aに私が答えたものこれに対して私は答えました。また、次の便利な地図ツールもあります。plotnetcfgすべてのネットワーク名前空間をマッピングできます。知っているけどIP ルート 2メソッドを使用すると、プロセスIDだけを提供しないようですが、提供しない場合IP ルート 2。編集された例(必須jq)、次のように実行:

# unshare -n -- sleep 999 &
[1] 677451
#  plotnetcfg -f json | jq '.namespaces[].name'
""
[...]
"PID 268150 (systemd)"
"PID 345878 (systemd)"
[...]
"PID 677451 (sleep)"

これは""初期名前空間を表し、2つsystemdは2つのLXCインスタンスから来ており、sleep実行中のコマンドも見つけることができます。

2つの一般的な状況に役立ちます。

  • LXCの場合:

    lxc-info -H -p -n containername
    
  • ドッカーの場合:

    docker inspect --format '{{.State.Pid}}' containername
    

利用可能な方法で予想されるネットワーク名前空間でプロセスを見つけたら、偽装することができます。IP ルート 2ツール。正確に何をするかは、正確なバージョンによって異なります。私の観点では、strace次のようになります。

mkdir -p /run/netns

次に、共有伝播に設定されるようにそれ自体の上にマウントします。

mount --bind --make-shared /run/netns /run/netns

上記の作業は、まだ完了していない場合に限り一度だけ実行されます。ツールにこれを行うには(必要な場合のみ)、仮想名前空間を作成して削除します。

ip netns add dummy && ip netns delete dummy

次に、名前を選択し、たとえばfoo空のファイルを作成し、モードを000に変更します。 (必須ではありませんが、エミュレートされます。)IP ルート 2):

touch /run/netns/foo
chmod 0 /run/netns/foo

最後に、指定されたPIDに基づいてプロセスの名前空間をマウントします(たとえばsleep、古い677451)。

mount --bind /proc/677451/ns/net /run/netns/foo

それはすべてです。これでコマンドが終了しても、sleep名前空間は存在し続けます。みんなIP ルート 2ここでツールに名前を付けます。金持ち。たとえば、次のような場合ワイズリンクされたインターフェイスはip linkリンクnsid番号をで置き換えますfoo

このネットワーク名前空間を削除するには、ip netns del foo今すぐ削除してください(注:通常のように、このsleepコマンドなどのリソースが使用されなくなった場合は、実際のネットワーク名前空間は実際には消えます)。

追加文書IP ルート 2ネットワークネームスペースによる特定のアドイン私の他の答え

おすすめ記事