私は最初からCで独自のLinuxコンテナを作成してきました。いくつかの場所でコードを借りて基本バージョンを提供しました。名前空間&cgroup。
基本的に私クローンみんなが一緒にする新しいプロセスclone_new*新しい名前空間を作成するためのフラグ複製プロセス。
また、以下を挿入してUIDマッピングを設定しました。0 0 1000入力するuid_mapそしてgid_map文書。確かにしたい根コンテナの内部は次のようにマップされます。根外部。
ファイルシステムの場合は、基本イメージを使用しました。緊張組み込みブート防止プログラム。
これで、コンテナ内でネットワーク接続を確立しようとしています。使ったこれコンテナ内部のインタフェースを設定するためのスクリプトです。このスクリプトは、独自の新しいネットワーク名前空間を作成します。新しく作成されたネットワークネームスペースに作成されたプロセスのネットワークネームスペースをスクリプトでインストールするように軽く編集しました。
mount --bind /proc/$PID/ns/net /var/run/netns/demo
次のように新しいネットワーク名前空間を入力できます。
ip netns exec ${NS} /bin/bash --rcfile <(echo "PS1=\"${NS}> \"")
外部からうまくpingを送信しました。
ただし、デフォルトでレプリケーションプロセスを開始すると、bashシェルでpingを実行できません。エラーが発生します。
ping: socket: Operation not permitted
機能を設定しようとしました。cap_net_rawそしてcap_net_admin
案内を少し受けたいです。
ベストアンサー1
私はより完全な仕様で作業することを好みます。しかし、スクリプトと説明を注意深く読んだ結果、スクリプトを使用してネットワークネームスペースを最初に入力し、次にユーザーネームスペースを入力するという結論を下しました。
netns は子ユーザーではなく初期ユーザーが所有します。これを行うには、ping
netnsを所有しているユーザーでcap_net_rawを使用する必要があります。私の考えでは。
参照文書へのリンクを提供する同様の答えは次のとおりです。Linuxとユーザーの名前空間の機能
(ICMPソケットにアクセスできれば、権限なしで動作できると思います。ping
しかし、少なくとも私のFedora 29ではこれは行われていないようです。Unprivilegedはcp "$(which ping)" && ping localhost
同じように見えますsocket: Operation not permitted
。なぜ実行されないのかわかりません。)