使用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 连接。
到目前为止我发现了什么:
创建的网络命名空间被列为 /var/run/netns 下的文件(但默认命名空间没有文件)
该IP netns EXEC代码可以在这里找到:http://git.kernel.org/cgit/linux/kernel/git/shemminger/iproute2.git/tree/ip/ipnetns.c#n132 -我还没有掌握一切它正在做,但看起来不太有希望。
ip netns按照Howto 在 linux 上查询和更改网络命名空间的建议识别 $$ ?在默认网络命名空间中时不返回任何内容
如果我将一个接口临时移动到一个 netns 中
ip link set eth10 netns myns
Run Code Online (Sandbox Code Playgroud)
然后它不再在根目录中可见,仅在名称空间 myns 中可见。
我如何将其移回,例如(这些显然不存在):
ip link unset eth10
Run Code Online (Sandbox Code Playgroud)
也许
ip link set eth10 netns root
Run Code Online (Sandbox Code Playgroud)
或类似?
我想指示 systemd 在指定的、预先存在的网络命名空间中“运行单元”,特别是在命名空间中启动单元的进程。
似乎无法从网络名称空间创建网络名称空间。它导致“错误:对等网络引用无效。”。
这是一个错误还是有某种我不知道的限制?
以下是我对错误的 cmd 跟踪。
# ip netns add foo1
# ip netns exec foo1 ip netns add foo2
# ip netns
Error: Peer netns reference is invalid.
Error: Peer netns reference is invalid.
foo2
foo1
# ip netns exec foo2 /bin/bash
setting the network namespace "foo2" failed: Invalid argument
Run Code Online (Sandbox Code Playgroud) 上下文 - 我正在尝试在 MacOSX 上运行 docker 集群。
运行 docker 的安装过程的一部分是安装pipework。
管道依赖 /var/run/netns
我的问题是:Mac OS X 是否有等效的 netns?
Windows 是否具有等效的 Linux 网络命名空间?
我想创建一个新界面,并且该界面只能由特定应用程序访问,该界面不会侦听标准 Windows 端口(139 445 等)。
理想情况下,应用程序也不能使用其他接口,但这对我的用例来说不太重要。
最重要的是,接口不会在操作系统级别相互通信,如果它们想相互通信,它们实际上需要将数据包发送到物理/虚拟网络。IP 范围甚至可以重叠(当然这样他们就不能直接互相交谈了)。
有一个进程在其自己的网络命名空间中运行。我想远程登录到机器并在此进程网络命名空间中运行命令,类似这样(17543 是具有自己的网络命名空间的进程的 pid):
# ip netns exec /proc/17543/ns/net ifconfig
Cannot open network namespace "/proc/17543/ns/net": No such file or directory
# ls /proc/17543/ns/net
/proc/17543/ns/net
Run Code Online (Sandbox Code Playgroud)
它抱怨网络名称空间不存在,但看起来该文件存在。如何在另一个进程网络命名空间中运行命令?
我刚刚开始探索网络命名空间。我尝试按照http://www.opencloudblog.com/?p=42中的文章实现以下简单设置
+--------+ +------------+ +--------+ | |------+ +------+ |------+ +------| | |nstest2 |veth-2++------++veth-b| 默认 |veth-a++-----++veth-1| nstest1| | |------+ +------+ 命名空间 |------+ +------| | +--------+ +------------+ +--------+
我执行以下命令:
#setup namespace nstest1
sudo ip netns add nstest1
sudo ip netns exec nstest1 ip link set dev lo up
sudo ip link add veth-a type veth peer name veth-1
sudo ip link set veth-1 netns nstest1
sudo ip netns exec nstest1 ip addr add 10.0.1.1/24 dev veth-1
sudo ip netns exec nstest1 …Run Code Online (Sandbox Code Playgroud) 我知道该ip netns add xxx命令可用于创建 Linux 网络命名空间,但它不是永久性的,这意味着服务器重新启动后创建的命名空间将消失。
那么我怎样才能创建一个可以在服务器重启后仍然存在的永久的呢?
我有一个由 openvpn 运行的 post-up 脚本:
#!/bin/bash
echo "I am: `whoami`"
echo "Moving interface into the netns"
ip link set dev "$1" up netns hydrogenvpn mtu "$2"
echo "Listing"
ip netns ls
echo "test"
ip netns exec hydrogenvpn cat /tmp/foobar
Run Code Online (Sandbox Code Playgroud)
如果我使用以下任何命令运行 openvpn:service openvpn start、/etc/init.d/openvpn start、systemctl start openvpn@hydrogen.service,我会在日志中看到以下内容:
Sun Oct 9 11:19:15 2016 us=851109 /sbin/ip link set dev tun-hyd2 up mtu 1500
Sun Oct 9 11:19:15 2016 us=858267 /sbin/ip addr add dev tun-hyd2 10.43.43.3/24 broadcast 10.43.43.255 …Run Code Online (Sandbox Code Playgroud) 我正在尝试查找 Kubernetes 集群上运行的哪个应用程序正在使用特定端口与 RabbitMQ 集群进行通信。在 RabbitMQ 上,我看到连接来自 192.168.1.10:34226。192.168.1.10是Kubernetes节点之一。登录到 192.168.1.10 后,我检查是否通过 tcpdump 命令从该节点建立了连接tcpdump -i eth0 port 34226。我看到两个方向的交通。现在我正在尝试查找哪个进程正在建立此连接。首先我尝试了 netstat:
netstat -tapn | grep 34226
结果什么也没发现。然后我尝试了 ss 但仍然一无所获。连接已建立,通过 tcpdump 我可以看到发送到 RabbitMQ 的心跳数据包以及来自 RabbitMQ 的响应。但 netstat 和 ss 不报告已建立的连接。
更新1
我发现这与网络命名空间有关。我的问题与this问题类似,但我需要找到从34226端口建立连接的进程的PID。
linux ×4
namespaces ×4
iproute2 ×2
networking ×2
systemd ×2
debian ×1
docker ×1
init.d ×1
ip ×1
kubernetes ×1
mac-osx ×1
netstat ×1
openvpn ×1
ping ×1
tcpdump ×1
ubuntu-12.10 ×1
windows ×1