Wie kann ich openvpn in einem LXC-Container in einem Debian-Host ausführen?

2844
omega

Ich verwende debian stretch auf meinem Host und versuche, openvpn in einem Ubuntu xenial LXC-Gast zu konfigurieren.

Da openvpn ein Tun-Gerät benötigt, folgte ich Anleitungen wie http://heider.io/blog/2013/10/26/openvpn-in-a-lxc-container/, um die Erstellung von Tun-Geräten im Container zu ermöglichen.

Leider führt die Einstellung lxc.cgroup.devices.allow = c 10:200 rwmin der Konfigurationsdatei des Containers zu diesem Fehler:

 lxc-start ERROR lxc_cgfsng - cgroups/cgfsng.c:cgfsng_setup_limits:1949 - No such file or directory - Error setting devices.allow to c 10:200 rwm for ubuntu lxc-start ERROR lxc_start - start.c:lxc_spawn:1236 - Failed to setup the devices cgroup for container "ubuntu". lxc-start ERROR lxc_start - start.c:__lxc_start:1346 - Failed to spawn container "ubuntu". 

Bearbeiten

Ich versuche, dies in einem nicht privilegierten LXC-Container zu erreichen. Hier ist die vollständige Konfiguration dieses Containers:

# Distribution configuration lxc.include = /usr/share/lxc/config/ubuntu.common.conf lxc.include = /usr/share/lxc/config/ubuntu.userns.conf lxc.arch = x86_64  # Container specific configuration lxc.id_map = u 0 100000 65536 lxc.id_map = g 0 100000 65536 lxc.rootfs = /home/myuser/.local/share/lxc/ubuntu/rootfs lxc.rootfs.backend = dir lxc.utsname = ubuntu  # Network configuration lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.hwaddr = 00:11:22:aa:bb:cc lxc.network.ipv4 = 192.168.1.101/24 lxc.network.ipv4.gateway = 192.168.1.1  # trying to get /dev/net/tun inside container lxc.cgroup.devices.allow = c 10:200 rwm 

Wenn ich die devices.allow -Option nicht setze, um den Container starten zu können, sehe ich Prozesse innerhalb des Containers in der cgroup /sys/fs/cgroup/devices/user.slice(deren PID von außerhalb des Containers betrachtet tatsächlich in der cgroup.procsDatei dieses Unterverzeichnisses liegt). und von hier:

$ cat devices.list  a *:* rwm 

aber aus dem Behälter

# mknod /dev/net/tun c 10 200 mknod: /dev/net/tun: Operation not permitted 
2
Wahrscheinlich fehlt Ihnen die Kernel-Unterstützung für Kontrollgruppen für "Geräte". Daniel B vor 7 Jahren 0
Warum wollen Sie das genau in einem Container? Dies kann einfacher durch das Einrichten eines zweiten Netzwerk-Namespace durchgeführt werden. Dies ist derselbe Vorgang wie der Container, es sei denn, es liegt kein Container-Overhead vor. MariusMatutiae vor 7 Jahren 0
@MariusMatutiae: Zu Testzwecken möchte ich einen voll funktionsfähigen Linux-Container, ohne eine virtuelle Maschine ausführen zu müssen. omega vor 7 Jahren 0
@DanielB: Wie kann ich das überprüfen? Was könnte ich tun? omega vor 7 Jahren 0
Also habe ich das aktuelle Debian von Grund auf installiert und die Option funktioniert einwandfrei. Vergewissern Sie sich, dass alle cgroup-Dateisysteme (cpuset, cpu / cpuacct, Geräte, Gefrierschrank, net_cls / net_prio, blkio und perf_event) ordnungsgemäß unter `/ sys / fs / cgroup` eingehängt sind. Wenn nicht, liegt möglicherweise ein Fehler in Ihrer Boot-Konfiguration vor. Laufen Sie systemd? Ist Ihre Debian-Installation alt und verbessert? Daniel B vor 7 Jahren 0
@DanielB: Danke für deine Zeit, alle diese Cgroups sind zwar korrekt gemountet. Dies ist eine saubere Debian-Installation mit systemd (4.9.0-2-amd64 # 1 SMP Debian 4.9.18-1 (2017-03-30) x86_64 GNU / Linux). omega vor 7 Jahren 0
Hm. Versuchen Sie möglicherweise, den Container zu starten, während Sie bei einem Nicht-Root-Konto angemeldet sind? Wenn ich einen Container (mit oder ohne besagte config-Option) starte, ist seine cgroup unter `/ sys / fs / cgroup / devices / lxc / verfügbar.`. `devices.allow` ist da. Daniel B vor 7 Jahren 0
@DanielB Ich merke, dass ich es nicht erwähnt habe, aber ich verwende einen nicht privilegierten Container. Daher starte ich den Container, während er als Nicht-Root-Konto angemeldet ist. Ich habe keine Geräte-Cgroup dafür, aber ich bekomme einen `Freezer`,` Memory` und `Systemd`-Cgroup unter` / sys / fs / cgroup / freezer / user / ghost / 0 / lxc / ubuntu`, ` / sys / fs / cgroup / memory / benutzer / ghost / 0 / lxc / ubuntu`, `/ sys / fs / cgroup / systemd / user.slice / user-1000.slice / session-1.scope / lxc / ubuntu` omega vor 7 Jahren 0

1 Antwort auf die Frage

1
omega

Hinzufügen

lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file 

In der Konfigurationsdatei des Containers bind-mount das tun char-Gerät im Container, wodurch das Problem gelöst wird.