Linux 的网络命名空间 (netns) 是非常有用和好玩的功能,可以允许进程进入一个隔离的网络空间,在这里面可以安全地进行网络测试、iptables 策略测试等。
通常情况下,一般我们用 ip netns add 添加新的 netns,然后我们可以用 ip netns list 查看所有的 netns。但有的时候进程的 netns 却并没有显式导出,ip netns list 无法列出它,比如 docker 的 container 的网络空间。
也许我们还是需要进入到那个进程的 netns,怎么办呢?答案是做个符号链接就可以了。
ln -sf /proc/<pid>/ns/net /var/run/netns/$ns
简要说明一下这个命令:每个进程的网络命名空间都是通过 proc 文件系统导出来了的,位于 /proc/<pid>/ns/net (这个文件不可读,它只是相当于一个访问点);而 ip netns list 命令是从 /var/run/netns 这个路径读取 netns 列表的,因此直接将进程的命名空间链接到 /var/run/netns 目录下就可以了。
这之后,可以按照以往的 ip netns $ns exec /bin/bash 进去这个命名空间玩耍了。