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

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

ip netns 执行您可以在自定义网络命名空间中执行命令 - 但是是否也可以在默认命名空间中执行命令?

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

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

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

我的情况是:

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

我目前发现的情况是:

答案1

较新的发行版/内核支持该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 ~]# 

这依赖于setns系统调用。要实现此功能,您至少需要 3.0 内核和 glibc-2.14。

RHEL 6.5 提供了对持久命名空间的支持,但是不是支持将现有流程移动到新的命名空间。

答案2

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

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

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

上述命令在 Ubuntu 14.04 上进行了测试。我不知道该方法是否有任何特定于发行版的内容。

答案3

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

如果您愿意,您可以通过执行“ps aux”或甚至 top 来获取 pid 形式。

就我个人而言,我总是通过 ssh 连接到主命名空间,然后我可以随时通过键入 exit 然后在需要时重新进入命名空间来恢复默认设置。

答案4

如上所述,可以通过 进入根网络命名空间nsenter --net --target=1。但如果您计划使用不了解网络命名空间的应用程序,则还需要切换到根挂载命名空间,因此最好使用nsenter --net --mount --target=1

相关内容