非 root 用户执行 ip netns add 必须使用 sudo 或 root 权限,因需 cap_net_admin 能力;容器中需 --cap-add=net_admin;selinux 可能阻止,临时可 setenforce 0。

ip netns 创建命名空间失败:Permission denied 怎么办
非 root 用户执行 ip netns add 一定会报错 Operation not permitted,这不是权限配置问题,而是内核强制要求——创建网络命名空间需要 CAP_NET_ADMIN 能力,普通用户默认没有。
- 必须用
sudo或切换到 root 执行,例如:sudo ip netns add ns1 - 如果在容器里操作,需确保容器启动时加了
--cap-add=NET_ADMIN,否则即使有 sudo 也无效 - 某些发行版(如 CentOS 7)的 SELinux 默认阻止该操作,临时关闭验证可用:
sudo setenforce 0,但不建议长期禁用
ip netns exec 进不去:command not found 或直接退出
ip netns exec 本质是把当前进程挂入目标命名空间,并在其中执行命令。它不会自动加载 shell 环境,也不会继承宿主机的 PATH 或别名。
- 必须显式指定完整路径或带 shell 解释器,例如:
sudo ip netns exec ns1 /bin/bash,不能只写bash - 如果提示
/bin/bash: No such file or directory,说明该命名空间里根本没挂载根文件系统——ip netns默认只创建空命名空间,不自带任何二进制,需手动挂载或用unshare+chroot配合 - 执行后立即退出?检查是否用了后台模式(&)或命令本身无交互、执行完就结束,比如
ip netns exec ns1 ls正常就是列完就退
为什么 ping 不通:veth pair 没配通的典型表现
单纯 ip netns add 和 ip netns exec 不会产生任何网络连通性。要让命名空间和宿主机通信,99% 的场景需要配一对 veth 设备,并正确设置 IP、路由和转发。
- 先创建 veth 对:
sudo ip link add veth0 type veth peer name veth1 - 把
veth1移进命名空间:sudo ip link set veth1 netns ns1 - 给宿主机端配 IP:
sudo ip addr add 192.168.100.1/24 dev veth0 && sudo ip link set veth0 up - 进命名空间配另一端:
sudo ip netns exec ns1 ip addr add 192.168.100.2/24 dev veth1 && sudo ip netns exec ns1 ip link set veth1 up - 宿主机必须开启 IP 转发:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward,否则跨 namespace 的包会被丢弃
ip netns list 显示空,但 ps 看得到进程在 namespace 里
ip netns list 只显示通过 ip netns add 创建、且在 /var/run/netns/ 下有对应 bind-mount 的命名空间。手动用 unshare --net 启动的进程,或者容器 runtime 创建的 namespace,不会出现在这个列表里。
- 确认是否存在:
sudo ls -l /var/run/netns/,没文件就说明不是ip netns管理的 - 查任意进程的实际 netns:
readlink /proc/<pid>/ns/net</pid>,返回类似net:[4026532525]的 inode 号 - 对比不同进程的 inode 号,相同即属于同一 network namespace,跟
ip netns list是否显示无关 - bind-mount 是
ip netns工具链的“注册”动作,没它就不能用ip netns exec,只能靠nsenter -t <pid> -n</pid>
ping 就静默失败,连错误提示都不给你。










