使用ip netns exec,您可以在自定义网络命名空间中执行命令 – 但是还有一种方法可以在默认命名空间中执行命令吗?
例如,执行这两个命令后:
sudo ip netns add test_ns sudo ip netns exec test_ns bash
新创建的bash如何在默认网络命名空间中执行程序?据我所知,没有ip netns exec默认或任何类似的东西.
我的情景是:
我想在一个单独的网络命名空间中运行SSH服务器(以保持系统的其余部分不知道网络连接,因为系统用于网络测试),但希望能够通过默认网络命名空间执行程序SSH连接.
到目前为止我发现了什么:
>创建的网络命名空间在/ var / run / netns下列为文件(但默认命名空间没有文件)
> ip netns exec代码可以在这里找到:http://git.kernel.org/cgit/linux/kernel/git/shemminger/iproute2.git/tree/ip/ipnetns.c#n132 – 我还没有掌握它正在做的所有事情,但看起来并不是很有希望.
>在默认网络命名空间中,Howto query and change network namespace on linux?建议的ip netns标识$$不返回任何内容
解决方法
较新的发行版/内核支持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,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才能工作.