和ip netns 执行您可以在自定义网络命名空间中执行命令 - 但是是否也可以在默认命名空间中执行命令?
例如,执行这两个命令后:
sudo ip netns add test_ns
sudo ip netns exec test_ns bash
新创建的 bash 如何在默认网络命名空间中执行程序?没有ip netns exec 默认或据我所知任何类似的东西。
我的情况是:
我想在单独的网络命名空间中运行 SSH 服务器(以使系统的其余部分不知道网络连接,因为该系统用于网络测试),但希望能够通过 SSH 连接在默认网络命名空间中执行程序。
我目前发现的情况是:
创建的网络命名空间被列为 /var/run/netns 下的文件(但没有默认命名空间的文件)
这ip netns 执行代码可以在这里找到:http://git.kernel.org/cgit/linux/kernel/git/shemminger/iproute2.git/tree/ip/ipnetns.c#n132- 我还没有掌握它所做的一切,但它看起来不太有希望。
ip netns 识别 $$按照建议如何在 Linux 上查询和更改网络命名空间?在默认网络命名空间中时不返回任何内容
答案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
。