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


10

这个问题类似于openvpn的lxc guest虚拟机中的No 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容器内部。

我使用香草Ubuntu 14.04 64bit作为主机,并使用

lxc-create -t download -n mylxc  -- -d ubuntu -r trusty -a amd64

是否有人设法使/dev/tun设备在非特权LXC下运行?


有关信息,要使openvpn在无特权的LXC容器中工作,我必须将其添加lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file到容器配置文件中,如下所述:superuser.com/a/1205662/130915然后,我以root身份在容器内部使用sudo运行openvpn。
baptx

Answers:


3

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

  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

使用docker它非常容易完成。默认情况下,容器是无特权的

在此示例中,我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

1
我相信,docker所谓的“非特权”与LXC说法的含义完全不同:github.com/docker/docker/issues/7906。似乎Docker仍然不支持非特权容器。它不一定会使您的答案无效- CAP_MKNOD下班后我会检查。
亚当·里奇科夫斯基

1
您能否给我一点有关如何更改非特权容器功能的指导?至少对Google来说是正确的短语?
亚当·里奇科夫斯基

3
lxc.cap.keep = CAP_MKNODconfig 添加到配置会出错Simultaneously requested dropping and keeping caps。我检查了所有递归添加的configs( ubuntu.userns.confubuntu.common.confcommon.conf),发现只有一个符合lxc.cap.droplxc.cap.drop = mac_admin mac_override sys_time sys_module。但这是不相关的,不是吗?
亚当·里奇科夫斯基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.