Al intentar levantar OpenVPN
dentro de un contenedor LXC
o OpenVZ
en Proxmox
, el servicio da error. Los logs como journalctl -u openvpn@server.conf
o /var/log/openvpn.log
no son de ayuda pues no indican el motivo del error. La única forma de ver el error es invocar directamente en la consola openvpn
.
El error para un contenedor LXC es similar a:
|
|
El error para un contenedor OpenVZ es similar a:
|
|
El problema reside en que el contenedor no puede acceder al dispositivo de caracteres
(sin buffer) /dev/net/tun
.
Solución para LXC
Configurar Proxmox
Es necesario permitir al contenedor el acceso al dispositivo de caracteres /dev/net/tun
. Esto se hace añadiendo al archivo de configuración del contenedor el parámetro lxc.cgroup.devices.allow
indicando:
- Tipo de dispositivo:
b
para unarchivo especial de bloques
(con búfer),c
para unarchivo especial de caracteres
(sin búfer),p
para un FIFO. Más información enman mknod
. - ID de dispositivo: Los ID de dispositivos están formados por dos partes, el
major ID
y elminor ID
. Tradicionalmente elmajor ID
identifica el driver asociado al dispositivo aunque en los kernels modernos varios drivers pueden compartirmajor ID
por lo que actualmente se podría decir que losmajor ID
identifican la clase del dispositivo; mientras que elminor ID
identifica el dispositivo exacto. Más información enman makedev
y en el capítuloChar Drivers
, página 43, de Linux Device Drivers. - Permisos
cgroup
para el dispositivo: pudiendo ser una composición der
para lectura,w
para escritura ym
para mknod.
Para obtener el major ID
y el minor ID
tan solo es necesario listar los dispositivos de caracteres o de red, y buscar el dispositivo tun
:
|
|
En el ejemplo anterior, el major ID
es 10 y el minor ID
200.
Una vez recopilada esta información, tan es necesario añadir lxc.cgroup.devices.allow = c 10:200 rwm
al archivo de configuración del contenedor /etc/pve/lxc/ID.conf
.
En el ejemplo de a continuación se hace para el contenedor con ID 100103:
|
|
Configurar el contenedor
Llegados a este punto el contedor tiene permisos para acceder al dispositivo especial de caracteres /dev/net/tun
, sin embargo este dispositivo no existe en el contenedor LXC
por ello es necesario crear un servicio systemd
para automatizar la creación del archivo /dev/net/tun
|
|
Por último solo queda apagar y encender el contenedor.
Solución para OpenVZ
Configurar Proxmox
Añadir CAPABILITY="NET_ADMIN:on"
y DEVNODES="net/tun:rw"
al archivo de configuración del contenedor OpenVZ. A continuación un ejemplo para el contenedor con ID 1103
|
|