カスタムLinuxネットワーク名前空間からデフォルトの名前空間に切り替えるにはどうすればよいですか?


14

execのIP netnsだけでなく、デフォルトの名前空間でコマンドを実行する方法があります-あなたはカスタムネットワーク名前空間でコマンドを実行することができますか?

たとえば、次の2つのコマンドを実行した後:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

新しく作成されたbashは、デフォルトのネットワーク名前空間でどのようにプログラムを実行できますか?私が見つけた限り、ip netns exec defaultなどはありません。

私のシナリオは次のとおりです。

別のネットワーク名前空間でSSHサーバーを実行したい(システムがネットワークテストに使用されているため、システムの残りがネットワーク接続に気付かないようにする)が、デフォルトのネットワーク名前空間でプログラムを実行できるようにしたいSSH接続。

これまでにわかったこと:

回答:


13

新しいディストリビューション/カーネルはnsenterコマンドをサポートしています。このコマンドは、必要なことを実行する必要があります。

次に例を示します(Fedora 20)。

[root@home ~]# unshare -n /bin/bash
[root@home ~]# ip a l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[root@home ~]# ping google.com
ping: unknown host google.com
[root@home ~]# nsenter -t 1 -n -- ping -c 2 google.com
PING google.com (74.125.230.65) 56(84) bytes of data.
64 bytes from lhr14s23-in-f1.1e100.net (74.125.230.65): icmp_seq=1 ttl=56 time=14.2 ms
64 bytes from lhr14s23-in-f1.1e100.net (74.125.230.65): icmp_seq=2 ttl=56 time=15.0 ms

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 14.239/14.621/15.003/0.382 ms
[root@home ~]# nsenter -t 1 -n -- ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: p4p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 10:bf:48:88:50:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global p4p1
       valid_lft forever preferred_lft forever
    inet6 fe80::12bf:48ff:fe88:50ee/64 scope link 
       valid_lft forever preferred_lft forever
[root@home ~]# 

これはsetnsシステムコールに依存しています。これを機能させるには、少なくとも3.0カーネルとglibc-2.14が必要です。

RHEL 6.5は永続的な名前空間をサポートしますが、既存のプロセスを新しい名前空間に移動することサポートしません


Ubuntuはnsenterなしで古いutil-linuxパッケージを提供しているという事実のために、これはうまく機能します。ここで詳細なビルド手順を見つけましたが、askubuntu.com
マーティン

私は試しましたnsenter -t 1 -nip netns exec、現在のプロセスの名前空間を変更せずに新しいプロセスを作成しました。
パベルシメルダ

15

2つの簡単なコマンドでデフォルトのネットワーク名前空間に戻ることができることがわかりました。

ln -s /proc/1/ns/net /var/run/netns/default
ip netns exec default ifconfig -a

この方法は、明らかに、procファイルシステムを介して自分の名前空間外のプロセスを表示できることを前提としています。別のPID名前空間にもいる場合、デフォルトの名前空間に戻るのは簡単ではありません。

上記のコマンドはUbuntu 14.04でテストされました。アプローチに固有の分布があるかどうかはわかりません。


1
これはかなり斬新です!コマンドでも管理できることを意味するため、実際にはのmount --bind代わりに行うことをお勧めします(ipは基本的にこれらの名前空間ファイルに対してmount --bindを実行し、永続的な名前空間をセットアップします)。ln -sip
マシューイフェ14

@kasperdは、別のPID名前空間ではそれほど単純ではないと言います。しかし、実際にはまだ可能ですか?どのように言及できますか?
コパンプキン

@copumpkin私はそれをテストしていません。
カスペルド

0

「ln -s / proc / 1 / ns / net / var / run / netns / default」<-----推奨されていません。

「ip netns show」を出力するコードのカウンター

bashシェルを実行している場合は、bashから単純に存在する場合は終了します。

netnsへのsshがある場合は、デフォルトのnsのインターフェースへのsshを実行し、そこで必要なことを行います。

最後の手段として、上記のようにlnを使用しますが、実行後すぐに、nsに変更が発生する前に削除することをお勧めします。そうしないと、カウンターが破損し、問題が発生します。


2
それは別の答えに対するコメントのようです。
-RalfFriedl

残念ながら、サインアップしたばかりでコメントできませんでした。コメントを投稿できるようになりました。@RalfFriedl
ルークA

0
nsenter -n -t <pid of a process running in the default ns>

必要に応じて、「ps aux」またはtopを実行するpidフォームを取得できます。

個人的には常にメインの名前空間にsshします。その後、exitと入力し、必要に応じて名前空間を再入力することで、いつでもデフォルトに戻すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.