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


14

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

例如,执行以下两个命令后:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

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

我的情况是:

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

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

Answers:


13

较新的发行版/内核支持该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提供对持久名称空间的支持,但支持将现有进程移至新名称空间。


对于Ubuntu提供不带nsenter的过时util-linux软件包的事实,这可以很好地执行。不过,我在这里找到了详细的构建说明:askubuntu.com/questions/439056/…–
Martin

我尝试过,nsenter -t 1 -n但是它创建了一个新进程,ip netns exec并且没有更改当前进程的名称空间。
PavelŠimerda'16

15

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

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

显然,此方法假定您可以通过proc文件系统查看自己命名空间之外的进程。如果您也位于单独的PID名称空间中,则返回默认名称空间并不那么简单。

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


1
这很新奇!我建议实际使用mount --bind代替ln -s,因为这意味着该ip命令也可以对其进行管理(ip基本上会对这些名称空间文件进行安装--bind来设置持久性名称空间)。
马修·伊夫

@kasperd您说使用单独的PID名称空间并不是那么简单。但是,实际上仍然有可能吗?你能提到如何吗?
copumpkin

@copumpkin我还没有测试过。
卡巴斯德(Kasperd)

0

“ ln -s / proc / 1 / ns / net / var / run / netns / default” <-----完全不建议。

输出“ ip netns show”的代码的计数器

如果您执行了bash shell,那么bash中就存在简单的退出。

如果您有ssh到netns,则ssh到默认ns的接口,然后在那做您需要做的事情。

作为最后的选择,如上所述的ln,但是我建议尽快将其删除,并且在ns发生任何更改之前将其删除。否则,计数器将被损坏并引起问题。


2
那似乎是对另一个答案的评论。
RalfFriedl

不幸的是,我刚刚注册,无法发表评论。现在很高兴搬家,我可以发表评论。@RalfFriedl
路加福音

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

您可以根据需要获得“ ps aux”或“ top”的pid形式。

就我个人而言,我总是使用ssh切换到主命名空间,然后我总是可以通过键入exit返回到默认名称,然后根据需要重新输入命名空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.