ip netns list 查不到刚创建的 namespace,因其仅识别 /var/run/netns/ 下有效挂载的绑定文件;需检查路径存在性、权限及 selinux 上下文,并用 sudo lsns -t net | grep foo 验证实际运行状态。

ip netns list 查不到刚创建的 namespace?
Linux 的 ip netns 默认只认 /var/run/netns/ 下的绑定文件,不是“创建就自动可见”。你用 ip netns add foo 确实会在这个目录下建一个 bind-mount 文件,但前提是 iproute2 版本 ≥ 3.12 且内核支持。老系统(比如 CentOS 7 早期镜像)可能缺 unshare 或 mount namespace 权限,导致文件空有名字、实际没挂载。
- 检查路径是否存在:
ls -l /var/run/netns/,如果foo是空链接或权限为 000,说明绑定失败 - 手动补绑试试:
sudo mkdir -p /var/run/netns && sudo mount -t proc proc /proc && sudo ip netns add foo(某些容器环境需先挂 proc) - 别依赖
ip netns list判断 namespace 是否“活”,更可靠的是sudo lsns -t net | grep foo
ip netns exec 进不去,报 “Network namespace not found”
错误信息 Network namespace not found 表明 ip netns exec 找不到对应路径下的 namespace 文件,或者该文件没被正确挂载为 network namespace。常见于:namespace 被删了但文件残留、文件被 mv 过、或用了 unshare --net 手动创建但没绑定到 /var/run/netns/。
-
ip netns exec只认/var/run/netns/下的文件,不认 PID 或其他路径,哪怕你用nsenter -n -t $PID能进,ip netns exec也不认 - 确认文件是否可读:
sudo ls -lZ /var/run/netns/foo,SELinux 环境下 context 错误也会拒访(如unconfined_u:object_r:admin_home_t:s0就不行) - 调试时加
-d参数看底层调用:strace -e trace=mount,openat ip netns exec foo true 2>&1 | grep -E "(mount|netns|foo)"
ip netns exec 启动的服务无法访问宿主机网络?
默认情况下,新 namespace 没有路由、没网卡、没 IP,就像刚格式化的网卡——它干净,但也啥都不能干。你执行 ip netns exec foo ping 8.8.8.8 必然失败,不是命令问题,是网络栈根本没配。
- 必须手动配 veth pair:一边塞进 namespace,一边留在宿主机并配 IP 和转发,例如:
ip link add veth0 type veth peer name veth1 && ip link set veth1 netns foo && ip addr add 192.168.100.1/24 dev veth0 && ip link set veth0 up - 进 namespace 后还要配另一端:
ip netns exec foo ip addr add 192.168.100.2/24 dev veth1 && ip netns exec foo ip link set veth1 up && ip netns exec foo ip route add default via 192.168.100.1 - 宿主机要开
net.ipv4.ip_forward=1,否则流量过不来;iptables 若开了 DROP 链,也得加规则放行veth0
多个 ip netns exec 命令串起来为什么管道失效?
写成 ip netns exec foo cat /etc/hosts | grep localhost 时,管道左边的 cat 在 namespace 里跑,右边 grep 在宿主机 shell 里跑——它们不在同一个网络、甚至不共享文件描述符。shell 的 | 是在父进程(宿主机)解析的,ip netns exec 只负责启动第一个命令。
- 想完整链式执行,得把整条命令用引号包住:
ip netns exec foo sh -c 'cat /etc/hosts | grep localhost' - 别用
$(ip netns exec foo ...)做变量替换,除非确定输出不含换行或空格;否则建议重定向到临时文件再读:ip netns exec foo cat /etc/hosts > /tmp/hosts.foo && grep localhost /tmp/hosts.foo - 复杂逻辑直接写脚本,用
ip netns exec foo /path/to/script.sh,避免 shell 解析歧义
namespace 不是黑盒,它是挂载点 + 进程上下文的组合;ip netns 工具只是个便利封装,一旦涉及 mount、SELinux、cgroup 或容器运行时,边界就容易模糊。最常卡住的地方,其实是忘了它底层就是个文件——而那个文件,得能被 mount、能被 read、还得是 netns 类型。










