我想在没有任何互联网访问的情况下运行程序,例如
unshare -n ping 127.0.0.1
。
作为非特权用户,它返回Operation not permitted
,作为特权用户,它返回所需的Network is unreachable
。
有没有办法让它也适用于非特权用户?
答案1
在 util-linux 的更高版本中,unshare
获得了该--map-root-user
选项。引用unshare(1)
2.26.2版本:
-r, --map-root-用户
仅当当前有效用户和组 ID 已映射到新创建的用户命名空间中的超级用户 UID 和 GID 后,才运行该程序。这使得即使在非特权运行时也可以方便地获得管理新创建的命名空间的各个方面所需的功能(例如在网络命名空间中配置接口或在挂载命名空间中安装文件系统)。作为一个纯粹的便利功能,它不支持更复杂的用例,例如映射多个 UID 和 GID 范围。此选项意味着 --setgroups=deny。
因此,在较新的系统上,您可以运行:
unshare -n -r ping 127.0.0.1
这将产生预期的Network is unreachable
.
在 Debian 系统上,您可能仍然会收到Operation not permitted
错误,然后您必须首先通过运行以下命令来启用非特权用户命名空间:
sudo sysctl -w kernel.unprivileged_userns_clone=1
注意:对于更广泛的用例,bwrap --unshare-net
可以考虑更复杂的,如简要描述的在不同的答案中。
答案2
除了 之外,进入新网络命名空间的另一种方法unshare -n
是使用更高级别的 Bubblewrap ( bwrap --unshare-net
):
bwrap --bind / / --dev /dev --unshare-net -- your-program args …
注意:如果your-program args …
是ping 127.0.0.1
,您会注意到 Bubblewrap 下不支持 ICMP,因此 OP 示例不会显示“ Network is unreachable
”。
另外值得注意的是,程序中--unshare-net
做获得一个环回接口,但它是一个网络命名空间隔离的接口。
答案3
您可以使用该setcap
实用程序来设置取消共享。
sudo setcap cap_sys_admin+ep /usr/bin/unshare
之后您可以使用unshare -n ping 127.0.0.1
我无法进一步解释它,我不知道这是否是一个好主意,但它有效并且whoami
不显示root
为用户名。