web-dev-qa-db-ja.com

新しいCコンテナでpingが機能しない

私は自分のLinuxコンテナをCでゼロから作成することに取り組んできました。いくつかの場所からコードを借りて、namespacescgroupsの基本バージョンを作成しました。

基本的に、私はcloneすべてのCLONE_NEW *フラグを使用して、clone'edプロセスの新しい名前空間を作成する新しいプロセスです。

また、0 10id_mapファイルとgid_mapファイルに挿入してUIDマッピングを設定しました。コンテナ内のrootが外部のrootにマップされていることを確認したいと思います。

ファイルシステムには、debootstrapで作成されたstretchのベースイメージを使用しています。

現在、コンテナ内からネットワーク接続を設定しようとしています。 this スクリプトを使用して、コンテナー内のインターフェースをセットアップしました。このスクリプトは、独自の新しいネットワーク名前空間を作成します。スクリプトを介して、作成したプロセスのネット名前空間を新しく作成したネット名前空間にマウントするように少し編集しました。

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

ガイダンスをお願いします。

3
Shabirmean

より完全な仕様から作業したいと思います。ただし、スクリプトと説明を注意深く読んだことから、最初にネットワーク名前空間(スクリプトを使用)を入力し、その後にユーザー名前空間を入力していると結論付けます。

ネットは、子ユーザーではなく、最初のユーザーによって所有されます。 pingを実行するには、netnsを所有するusernsにcap_net_rawが必要です。おもう。

ここにも同様の回答があり、リファレンスドキュメントへのリンクが提供されています。 ユーザー名前空間を使用したLinux機能

(ICMPソケットにアクセスできる場合、pingも特権なしで機能すると思います。しかし、少なくとも私のFedora 29では、これは使用されていないようです。特権のないcp "$(which ping)" && ping localhostは同じsocket: Operation not permittedを示します。 。なぜ採用されなかったのかわからない)。

1
sourcejedi