権限のないユーザーとしてインターフェイスを非標準ネットワーク名前空間に移動する方法

権限のないユーザーとしてインターフェイスを非標準ネットワーク名前空間に移動する方法

~/mynamespace次の場所にLinuxネットワークネームスペースバインディングがインストールされています。

unshare -mrn;
touch ~/mynamespace; # executed in the console opened by the first command
unshare --net=~/mynamespace true; # executed in the console opened by the first command

コマンド#1で生成された匿名ネットワークネームスペースのインタフェースをマウントされたネームスペースバインディングに移動するにはどうすればよいですか~/mynamespace

私の場合、内部ネームスペースまたはそのコピーをバインドマウントすることはまだ/var/run/netnsオプションではありません。関連コマンドは、ip ... netnsより標準的なディレクトリにバインドマウントされた/var/run/netns/ネットワーク名前空間のみを許可すると思います。だからip、この場合、コマンドは機能しないようです。

また、上記のすべてのコマンドは、rootなしで権限のないユーザーとして実行されることに注意してください。

ベストアンサー1

unshare -mrn # which implies -U

特に明記しない限り、以下のすべての項目は上記の名前空間で実行されます。


使用しないでくださいip netns

touch $HOME/mynamespace
unshare --net=$HOME/mynamespace true

このtrue時点ですべてのPID参照は失われますが、マウント参照は維持されるため、名前空間は存在し続けることができます。

これip link set ... netnsこのコマンドはマウントポイントを取得できますまたは参照用のプロセスID:

ネットワークネットワーク名|PID

NETNSNAME名に関連付けられているネットワーク名前空間にデバイスを移動します。またはプロセスPID

ip link add veth0 type veth peer name veth1

使用しない場合は、一時コマンドを使用してip netnsPIDを生成し、sleepPID参照を取得してip link使用できます。

nsenter --net=$HOME/mynamespace sleep 99 & pid=$!

ip link set veth1 netns $pid

得る:

# ip -br link
lo               DOWN           00:00:00:00:00:00 <LOOPBACK> 
veth0@if2        DOWN           86:c2:bc:ba:1a:01 <BROADCAST,MULTICAST> 
# nsenter --net=$HOME/mynamespace ip -br link
lo               DOWN           00:00:00:00:00:00 <LOOPBACK> 
veth1@if3        DOWN           86:e3:a1:ce:48:4e <BROADCAST,MULTICAST> 

使用ip netns

ip netns機能するには共有インストールが必要ですが/run/netns、まだインストールされていない場合(最初の使用時に)共有インストールが作成され、インストールされます。すでにインストールされていると検出された場合は、それを作成せずに後で失敗します(Cannot create namespace file "/run/netns/foo": Permission denied)。これは、実際の初期ユーザーの名前空間のルートに属しているため、書き込めないためです。作成しないと、/run実際の初期ユーザーネームスペースルートに属するコンテンツを書き込めないため、生成できません。など、さまざまな場合にip netns権限なしでユーザーの名前空間で実行すると失敗します。

以前のバージョンの代わりに手動でインストールするとip netns満足です。

  • 存在し、何らかの理由で/run/netns現在の状態を維持したい場合:/run

    mount -t tmpfs --make-rshared tmpfs /run/netns
    
  • ifが/run/netns存在しないか存在していても、全体をオーバーライドします/run

    ディレクトリは現在のディレクトリに作成できないため、/runマウントする必要があります。これにより、他の有用な情報へのアクセス権が失われますが、失敗した他のツール(iptables-legacy -w他のツールと同様Fatal: can't open lock file /run/xtables.lock: Permission denied)へのアクセス権が得られます。

    mount -t tmpfs tmpfs /run
    

これで、すべての標準ip netnsまたはip linkコマンドがip -n foo ...ユーザーの名前空間で通常どおりに機能します。

ip netns add mynamespace
ip link add name veth0 type veth peer netns mynamespace name veth1

得る:

# ip -br link
lo               DOWN           00:00:00:00:00:00 <LOOPBACK> 
veth0@if2        DOWN           2a:98:7f:83:bf:9e <BROADCAST,MULTICAST> 
# ip -n mynamespace -br link
lo               DOWN           00:00:00:00:00:00 <LOOPBACK> 
veth1@if2        DOWN           96:3c:5e:a6:a4:4a <BROADCAST,MULTICAST> 

おすすめ記事