我如何从一个自定义的linuxnetworking命名空间切换回默认的?

使用ip netns exec,你可以在一个自定义的networking命名空间中执行一个命令 – 但是也有一种方法可以在默认命名空间中执行一个命令吗?

例如,在执行这两个命令之后:

sudo ip netns add test_ns sudo ip netns exec test_ns bash 

新创build的bash如何在默认networking命名空间中执行程序? 根据我的发现,没有ip netns exec default或类似的东西。

我的情况是:

我想在一个单独的networking命名空间中运行一个SSH服务器(为了让系统的其他部分不知道networking连接,因为系统用于networkingtesting),但是希望能够通过默认networking命名空间执行程序SSH连接。

到目前为止,我发现了什么:

  • 创build的networking名称空间被列为/ var / run / netns下的文件(但是没有用于默认名称空间的文件)

  • ip netns执行代码可以在这里find: http : //git.kernel.org/cgit/linux/kernel/git/shemminger/iproute2.git/tree/ip/ipnetns.c#n132 – 我还没有掌握一切它还在做,但看起来不是很有希望。

  • 如何查询和更改linux上的networking名称空间, ip netns识别$$ ? 在默认networking名称空间中时不返回任何内容

较新的发行版/内核支持nsenter命令,它应该做你想做的,当你这样做的时候提供你的根。

这里是一个例子(Fedora 20)。

 [root@home ~]# unshare -n /bin/bash [root@home ~]# ip al 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 al 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系统调用。 你至less需要一个3.0内核和glibc-2.14才能工作。

RHEL 6.5提供对持久化命名空间的支持,但支持将现有进程移动到新的命名空间中。

我发现你可以用两个简单的命令返回到默认的networking命名空间:

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

这个方法显然假设你可以通过proc文件系统在自己的命名空间之外看到进程。 如果你在一个单独的PID命名空间中,返回到默认的命名空间并不那么简单。

以上命令在Ubuntu 14.04上进行了testing。 我不知道是否有任何具体的分配方法。