如何在非特权 LXC 容器中创建 /dev/tun 设备?

Ada*_*ski 11 openvpn tun lxc

这个问题类似于Openvpn 的在 lxc 来宾中没有 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
Run Code Online (Sandbox Code Playgroud)

有没有人设法让/dev/tun设备在非特权 LXC 下运行?

daw*_*wud 3

您需要显式地将 CAP_MKNOD功能添加到您的容器中。

\n\n
\n
  lxc.cap.keep\n          Specify the capability to be kept in the container. All other\n          capabilities will be dropped. When a special value of "none"\n          is encountered, lxc will clear any keep capabilities specified\n          up to this point. A value of "none" alone can be used to drop\n          all capabilities.\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

您还可以尝试使用以下方法自动执行此操作(如果您碰巧systemd在容器内使用):

\n\n
\n
  lxc.hook.autodev\n          A hook to be run in the container\'s namespace after mounting\n          has been done and after any mount hooks have run, but before\n          the pivot_root, if lxc.autodev == 1.  The purpose of this hook\n          is to assist in populating the /dev directory of the container\n          when using the autodev option for systemd based containers.\n          The container\'s /dev directory is relative to the\n          ${LXC_ROOTFS_MOUNT} environment variable available when the\n          hook is run.\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

它可以指向正在运行的脚本mknod

\n\n

使用docker这个非常容易实现。默认情况下,容器是无特权的

\n\n

在此示例中,我trusty从注册表中提取一个容器:

\n\n
sudo -r sysadm_r docker pull corbinu/docker-trusty\nPulling repository corbinu/docker-trusty\n...\nStatus: Downloaded newer image for corbinu/docker-trusty:latest\n
Run Code Online (Sandbox Code Playgroud)\n\n

我以交互模式启动它,告知我需要的内部功能:

\n\n
sudo -r sysadm_r docker run --cap-drop ALL --cap-add MKNOD \\\n  -i -t corbinu/docker-trusty bash\nroot@46bbb43095ec:/# ls /dev/\nconsole  fd/      full     fuse     kcore    mqueue/  null     ptmx     pts/     random   shm/     stderr   stdin    stdout   tty      urandom  zero\nroot@46bbb43095ec:/# mkdir /dev/net\nroot@46bbb43095ec:/# mknod /dev/net/tun c 10 200\nroot@46bbb43095ec:/# ls -lrt /dev/net/tun\ncrw-r--r--. 1 root root 10, 200 Apr  6 16:52 /dev/net/tun\n
Run Code Online (Sandbox Code Playgroud)\n\n

相对于:

\n\n
sudo -r sysadm_r docker run --cap-drop ALL \\\n  -i -t corbinu/docker-trusty bash\nroot@9a4cdc75a5ec:/# mkdir /dev/net\nroot@9a4cdc75a5ec:/# mknod /dev/net/tun c 10 200\nmknod: \xe2\x80\x98/dev/net/tun\xe2\x80\x99: Operation not permitted\n
Run Code Online (Sandbox Code Playgroud)\n

  • 将“lxc.cap.keep = CAP_MKNOD”添加到配置中会导致错误“同时请求删除和保持大写”。我检查了所有递归添加的配置(`ubuntu.userns.conf`、`ubuntu.common.conf`和`common.conf`),发现只有一行带有`lxc.cap.drop`:`lxc.cap.drop = mac_admin mac_override sys_time sys_module`。但这无关紧要不是吗? (3认同)