Pingは新しいCコンテナでは機能しません。

Pingは新しいCコンテナでは機能しません。

私は最初から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 は子ユーザーではなく初期ユーザーが所有します。これを行うには、pingnetnsを所有しているユーザーでcap_net_rawを使用する必要があります。私の考えでは。

参照文書へのリンクを提供する同様の答えは次のとおりです。Linuxとユーザーの名前空間の機能

(ICMPソケットにアクセスできれば、権限なしで動作できると思います。pingしかし、少なくとも私のFedora 29ではこれは行われていないようです。Unprivilegedはcp "$(which ping)" && ping localhost同じように見えますsocket: Operation not permitted。なぜ実行されないのかわかりません。)

おすすめ記事