这个问题类似于openvpn 的 lxc guest 中没有 tun 设备。LXC 已经发展起来,最近引入了非特权 LXC 容器,为防止越狱提供了另一层安全保障。
我需要在一个非特权容器内创建一个 OpenVPN 服务器。我不知道如何让容器创建一个私有的 tun 网络设备。
我确实附加lxc.cgroup.devices.allow = c 10:200 rwm
到了~/.local/share/lxc/mylxc/config
。
启动容器后,mknod /dev/net/tun c 10 200
返回mknod: '/dev/net/tun': Operation not permitted
容器内部。
我使用 vanilla Ubuntu 14.04 64bit 作为主机,并使用以下命令创建容器
lxc-create -t download -n mylxc -- -d ubuntu -r trusty -a amd64
有人设法让/dev/tun
设备在非特权 LXC 下运行吗?
答案1
lxc.cap.keep Specify the capability to be kept in the container. All other capabilities will be dropped. When a special value of "none" is encountered, lxc will clear any keep capabilities specified up to this point. A value of "none" alone can be used to drop all capabilities.
您还可以尝试使用以下命令自动执行此操作(如果您碰巧systemd
在容器内使用):
lxc.hook.autodev A hook to be run in the container's namespace after mounting has been done and after any mount hooks have run, but before the pivot_root, if lxc.autodev == 1. The purpose of this hook is to assist in populating the /dev directory of the container when using the autodev option for systemd based containers. The container's /dev directory is relative to the ${LXC_ROOTFS_MOUNT} environment variable available when the hook is run.
它可以指向正在运行的脚本mknod
。
trusty
在此示例中,我从注册表中提取一个容器:
sudo -r sysadm_r docker pull corbinu/docker-trusty
Pulling repository corbinu/docker-trusty
...
Status: Downloaded newer image for corbinu/docker-trusty:latest
我以交互模式启动它,并告知我需要的内部功能:
sudo -r sysadm_r docker run --cap-drop ALL --cap-add MKNOD \
-i -t corbinu/docker-trusty bash
root@46bbb43095ec:/# ls /dev/
console fd/ full fuse kcore mqueue/ null ptmx pts/ random shm/ stderr stdin stdout tty urandom zero
root@46bbb43095ec:/# mkdir /dev/net
root@46bbb43095ec:/# mknod /dev/net/tun c 10 200
root@46bbb43095ec:/# ls -lrt /dev/net/tun
crw-r--r--. 1 root root 10, 200 Apr 6 16:52 /dev/net/tun
相反的是:
sudo -r sysadm_r docker run --cap-drop ALL \
-i -t corbinu/docker-trusty bash
root@9a4cdc75a5ec:/# mkdir /dev/net
root@9a4cdc75a5ec:/# mknod /dev/net/tun c 10 200
mknod: ‘/dev/net/tun’: Operation not permitted