匿名ネットワーク名前空間

匿名ネットワーク名前空間

長すぎます。Linuxでは特に。フラグによって実行時に生成された名前空間が使用されたときに表示されないようnetwork namespacesです(ホストまたは生成された名前空間から)。実際にはLinuxネームスペースを処理または処理しません(私の考えは次のようになります:-nsystemd-nspwawnip netns listsystemd-nspawnip netnshttps://lwn.net/Articles/531114/#series_index)?

より長い話:
次のコマンドを使用して、Arch Linux内でArch Linuxの「軽量コンテナ」を実行します。

systemd-nspawn -nbUD /mntpointArchLinuxSysFs

データ/mntpointArchLinuxSysFsが起動し、正常に「実行/起動」されます。男性systemd-nspawn-nオプションフラグが何を意味するか教えてください。

-n--network-veth

vethホストとコンテナの間に仮想イーサネットリンク( "")を作成します。イーサネットリンクのホスト側は、プレフィックスが--machine=""であるコンテナ名(で指定)に沿って名前付きネットワークインターフェイスとして使用されます ve-。イーサネットリンクのコンテナ側名は " host0" で指定されます。この--network-vethオプションはを意味します --private-network

暗黙--private-networkの説明は次のとおりです。

--private-network

Disconnect networking of the container from the host. This makes all network interfaces unavailable in the container, with the

ループバックデバイスと --network-interface=指定および設定されたデバイスは例外です--network-veth。このオプションを指定すると、CAP_NET_ADMINコンテナが保持する機能セットにその機能が追加されます。後者はを使用して無効にできます--drop-capability=。このオプションが指定されていない場合(または下記のオプションのいずれかが暗示している場合)、コンテナにはホストネットワークへのフルアクセス権があります。

これは達成した成果のようです。Linuxネームスペース、特にLinuxネットワークネームスペースこれは、開始されたプロセス(つまり、initコンテナ内のプロセス/mntpointArchLinuxSysFs/bin/initとすべての子プロセス)が異なるネットワーク名前空間にあることを示します。つまり、名前空間/システムへの残りの接続には(仮想イーサネットペア)--private-networkしかありません。vethhost

使用LSNSsystemd-nspawn名前空間が実際に作成されたことを示します。

root@host$> lsns | grep net
4026531992 net       183     1 root     /sbin/init
4026532332 net         1   824 rtkit    /usr/lib/rtkit-daemon
4026532406 net         7  4697 vu-mnt-0 /usr/lib/systemd/systemd

しかし、ip netns list「協力」を拒否します。

root@host$> ip netns list
root@host$>

その後、理解するために、次のようにして仮想ip netns名前空間を作成しました。

root@host$> ip netns add dummy_netns
root@host$> ip netns list
dummy_netns
root@host$>

しかし皮肉なことに、ネットワークネームスペースはlsns

とにかく、「ネットワークネームスペース」という用語がでどのように使用されているのかは明らかではないようですsystemd-nspawnip netns私がテストした結果、2つの用語が実際には同じではない可能性があることがわかりました。たぶん言葉はあいまいですか?

修正する

マニュアルページのこの部分にはsystemd-nspawnIMHOが記載されていますが、実際には両方とも同じ内容をiproute表します。systemd-nspawnネットワークネームスペース

--network-namespace-path= コンテナーを実行する必要があるカーネルネットワークの名前空間を表すファイルへのパスを取得します。指定されたパスは、以下のカーネルによって公開されるように(おそらくバインドマウントされた)ネットワーク名前空間ファイルを参照する必要があります/proc/$PID/ns/net。これにより、コンテナは指定されたネットワーク名前空間に配置されます。一般的なユースケースの1つは、で作成したネットワーク名前空間を提供すること/run/netnsですip-netns(8)--network-namespace-path=/run/netns/fooこのオプションは、--private-networkや--network-interface =などの他のネットワーク関連オプションと一緒には使用できません。

そのオプションで再利用できないという最後の部分は、ある種の--private-network違いを示唆しているようです。ここで何が起こっているのでしょうか?

ベストアンサー1

名前空間、特にネットワーク名前空間の両方を使用systemd-nspawnします。ip-netns違いは、で説明したようにip-netns マニュアルip-netns処理中名前付きネットワークネームスペース。

通常、名前付きネットワーク名前空間は開くことができる/var/run/netns/NAMEオブジェクトです。ファイルを開いた後に生成されたファイル記述子は、指定された/var/run/netns/NAMEネットワーク名前空間を参照します。ファイル記述子を開いたままにすると、ネットワーク名前空間はアクティブのままです。

匿名ネットワーク名前空間

これネームスペース(7) マニュアル通常、名前空間は、その中のプロセスのライフサイクルに関連する抽象化であると説明します。

各プロセス/proc/[pid]/ns/には、サポートされている各名前空間のエントリを含むサブディレクトリがありますsetns(2)。このディレクトリにあるファイルの1つ(またはこれらのファイルの1つにバインドマウントされたファイル)を開くと、その名前空間が返されます。 pidで指定されたプロセスのファイルハンドル。名前空間内のすべてのプロセスが終了しても、このファイル記述子が開いている限り、名前空間はアクティブのままです。

私のシステムでは、最後に起動されたsystemdプロセス()がデフォルトのpgrep -f -n systemd\$テンプレート単位で起動されたコンテナのinitプロセスであるため、有効になっています[email protected]()。このコマンドは、コンテナの匿名ネットワーク名前空間がルートネットワーク名前空間とは異なり、コンテナのルートユーザーが所有していることを示します。--network-veth--private-network--private-users

# ls -l /proc/1/ns/net /proc/$(pgrep -f -n systemd\$)/ns/net
lrwxrwxrwx 0 root           /proc/1/ns/net -> net:[4026532008]
lrwxrwxrwx 0 vu-container-0 /proc/700/ns/net -> net:[4026532656]

コンテナがシャットダウンすると、この匿名ネットワーク名前空間は消えます。ただし、ip-netnsコンテナの存続期間中に管理できる名前付きネットワーク名前空間が必要な場合は、次の場所にバインドマウントできます/run/netns

# mount --bind /proc/$(pgrep -f -n systemd\$)/ns/net /run/netns/container
# ip netns list
container (id: 1)

systemdを使用して名前付きネットワーク名前空間を作成する

また、に記載されている設定と同じsystemd-nspawnオプションを指摘しました。--network-namespace-pathNetworkNamespacePath=システムユニット(5)。既存のネットワーク名前空間にはコンテナとユニットのみを割り当てることができます。プロセスは単一の名前空間にしか存在できないため、--network-namespace-path匿名ネットワーク名前空間を作成し、その中にコンテナを分離するなどのオプションと互換性がありません。--private-network

そうだNamespace=systemdは設定を取得しますv246以降、一部の将来のバージョンのsystemd(v245は2020年3月にリリース)。これにより、ユニットは既存の名前空間への割り当てを使用したり、NetworkNamespacePath=新しい匿名名前空間を作成したりする代わりに、独自の名前付きネットワーク名前空間を作成できますPrivateNetwork=。この機能を統合したら、コンテナのネットワーク名前空間名がデフォルトで指定されるようにテンプレートにNamespace=%i追加することをお勧めします。[email protected]

おすすめ記事