私は自分のLinuxコンテナをCでゼロから作成することに取り組んできました。いくつかの場所からコードを借りて、namespaces&cgroupsの基本バージョンを作成しました。
基本的に、私はcloneすべてのCLONE_NEW *フラグを使用して、clone'edプロセスの新しい名前空間を作成する新しいプロセスです。
また、0 10をid_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
ガイダンスをお願いします。
より完全な仕様から作業したいと思います。ただし、スクリプトと説明を注意深く読んだことから、最初にネットワーク名前空間(スクリプトを使用)を入力し、その後にユーザー名前空間を入力していると結論付けます。
ネットは、子ユーザーではなく、最初のユーザーによって所有されます。 ping
を実行するには、netnsを所有するusernsにcap_net_rawが必要です。おもう。
ここにも同様の回答があり、リファレンスドキュメントへのリンクが提供されています。 ユーザー名前空間を使用したLinux機能
(ICMPソケットにアクセスできる場合、ping
も特権なしで機能すると思います。しかし、少なくとも私のFedora 29では、これは使用されていないようです。特権のないcp "$(which ping)" && ping localhost
は同じsocket: Operation not permitted
を示します。 。なぜ採用されなかったのかわからない)。