如何从自定义 linux 网络命名空间切换回默认命名空间?

Mar*_*tin 17 linux-networking network-namespace

使用ip netns exec您可以在自定义网络命名空间中执行命令 - 但是否还有一种方法可以在默认命名空间中执行命令?

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

sudo ip netns add test_ns
sudo ip netns exec test_ns bash
Run Code Online (Sandbox Code Playgroud)

新创建的 bash 如何在默认网络命名空间中执行程序?据我所知,没有ip netns exec default或任何类似的东西。

我的场景是:

我想在单独的网络命名空间中运行 SSH 服务器(以使系统的其余部分不知道网络连接,因为系统用于网络测试),但希望能够通过以下方式在默认网络命名空间中执行程序SSH 连接。

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

kas*_*erd 19

我发现您可以使用两个简单的命令返回默认网络命名空间:

ln -s /proc/1/ns/net /var/run/netns/default
ip netns exec default ifconfig -a
Run Code Online (Sandbox Code Playgroud)

这种方法显然假设您可以通过proc文件系统看到您自己的命名空间之外的进程。如果您也在单独的 PID 命名空间中,返回默认命名空间就没有那么简单了。

以上命令在 Ubuntu 14.04 上测试过。我不知道该方法是否有任何特定的分布。


Mat*_*Ife 14

较新的发行版/内核支持该nsenter命令,该命令应该执行您想要的操作,前提是您在执行此操作时是 root。

这是一个示例(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 ~]# 
Run Code Online (Sandbox Code Playgroud)

这依赖于setns系统调用。你至少需要一个 3.0 内核和 glibc-2.14 才能工作。

RHEL 6.5 支持持久命名空间,但支持将现有进程移动到新命名空间。