Instalación y configuración de cliente OpenVPN en contenedor de Proxmox

Por cuestiones de seguridad, puede ser necesaria la conexión de contenedores de Proxmox con ciertas aplicaciones o servicios a un servidor VPN, en nuestro caso, tras la puesta en marcha de un contenedor, era recomendable que ese contenedor se conectara a internet a través de un tunel VPN para añadir una capa de privacidad a las conexiones del contenedor.

Como servicio de VPN, se ha utilizado el ofrecido por la compañía SurfShark que ofrece diferentes tipos de conexiones a una amplia variedad de países y en principio no recopila la información de la conexión. Con este servicio existe la posibilidad de utilizar diferentes protocolos de conexión, tanto OpenVPN como WireGuard y IKEV2, en nuestro caso, hemos elegido la conexión a través de VPN dada su facilidad de instalación en cualquier contenedor Proxmox y a su vez por su facilidad para ejecutarlo automatizado como un servicio del sistema.

A continuación detallamos las diferentes fases que es necesario llevar a cabo para el correcto funcionamiento de la aplicación, la conexión y posteriormente su instalación como servicio del sistema, de forma que al arrancar el contenedor se conecte automáticamente al servicio VPN.

Paso 1: Configuración del contenedor.

El primer paso tras la creación del contenedor es la adecuada configuración del mismo para poder ejecutar OpenVPN sin problemas, para comenzar, el contenedor debe tener privilegios, algo que debe configurarse durante su instalación, ya que por defecto, la creación de cualquier contenedor se realiza sin privilegios, de forma que es necesario durante su creación, asegurarnos de que el contenedor tiene privilegios.

Contenedor con privilegios

Los contenedores tienen la consideración de con privilegios o privilegiados cuando son creados y ejecutados solo por el usuario raíz. Todos los contenedores creados a través de la GUI de Proxmox o las herramientas PCT son contenedores no privilegiados, salvo que se indique lo contrario. En caso de no disponer de privilegios, no es posible utilizar el usuario root por lo que, tienen sentido cuando se ejecuta algún tipo de servicio que no necesite privilegios de root en la máquina, generalmente cuando en lugar de crearlos a través de Proxmox se utiliza algún tipo de script para la instalación.

Los contenedores sin privilegios no necesitan ser propiedad del usuario, ya que se ejecutan en espacios de nombres de usuario. Esta es una función del kernel que permite la asignación del UID de un host físico en un espacio de nombres dentro del cual puede existir un usuario con UID 0. Los contenedores sin privilegios también se pueden ejecutar como root. Al asignar un UID y un GID específicos a root, podemos crear contenedores sin privilegios en todo el sistema y ejecutarlos como raíz.

Cambiar contenedor sin privilegios a contenedor con privilegios

Es posible modificar el tipo de contenedor accediendo a la configuración del mismo, como se explica en el siguiente punto y modificando la opción:

unprivileged: 0

Una vez creado el contenedor, es necesario incorporar unas modificaciones en su configuración para permitir la ejecución de OpenVPN en la configuración del contenedor.

Configuración de los contenedores Proxmox

En Proxmox, cada contenedor LXC tiene dos archivos de configuración. Uno define la asignación de recursos sin procesar, mientras que el otro, utilizado por Proxmox, se usa para definir un contenedor. El archivo de configuración del contenedor Proxmox se puede encontrar en la siguiente ubicación:

/etc/pve/local/lxc/[contenedor_id].conf

De forma que podemos editar este archivo desde la consola de nuestro servidor Proxmox para añadir las líneas necesarias para conseguir el correcto funcionamiento de OpenVPN.

A través de la consola de nuestro servidor, no la del propio contenedor sino la general de nuestro servidor, accederemos al archivo de configuración del contenedor que queremos utilizar con OpenVPN utilizando el siguiente comando:

nano /etc/pve/local/lxc/[contenedor_id].conf

Se mostrará algo similar a lo siguiente:

arch: amd64
cores: 4
features: nesting=1
hostname: nombre_del_host
memory: 4096
net0: name=eth0,bridge=vmbr0,gw=192.168.1.1,hwaddr=BC:24:11:F5:C4:5B,ip=192.168.1.244/24,ip6=dhcp,type>
onboot: 1
ostype: debian
rootfs: local-lvm:vm-126-disk-0,size=8G
swap: 1024
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 188:* rwm
lxc.cgroup2.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/serial/by-id  dev/serial/by-id  none bind,optional,create=dir
lxc.mount.entry: /dev/ttyUSB0       dev/ttyUSB0       none bind,optional,create=file
lxc.mount.entry: /dev/ttyUSB1       dev/ttyUSB1       none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM0       dev/ttyACM0       none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM1       dev/ttyACM1       none bind,optional,create=file

Añadiremos las siguientes líneas de código en el archivo de configuración:

lxc.cgroup2.devices.allow: c 10:200 rwm

lxc.mount.entry: /dev/net dev/net none bind,create=dir

De forma que, nuestro archivo de configuración quedará de una forma similar a la siguiente:

arch: amd64
cores: 4
features: nesting=1
hostname: nombre_del_host
memory: 4096
net0: name=eth0,bridge=vmbr0,gw=192.168.1.1,hwaddr=BC:24:11:F5:C4:5B,ip=192.168.1.244/24,ip6=dhcp,type>
onboot: 1
ostype: debian
rootfs: local-lvm:vm-126-disk-0,size=8G
swap: 1024
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 188:* rwm
lxc.cgroup2.devices.allow: c 189:* rwm
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/serial/by-id  dev/serial/by-id  none bind,optional,create=dir
lxc.mount.entry: /dev/ttyUSB0       dev/ttyUSB0       none bind,optional,create=file
lxc.mount.entry: /dev/ttyUSB1       dev/ttyUSB1       none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM0       dev/ttyACM0       none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM1       dev/ttyACM1       none bind,optional,create=file
lxc.mount.entry: /dev/net           dev/net           none bind,create=dir

Una vez añadidas las líneas, utilizaremos la combinación de teclas Ctrl+X para salir y confirmaremos las modificaciones pulsando Y, de forma que nuestro archivo de configuración quede modificado.

Como se ha indicado, no es recomendable utilizar un contenedor sin privilegios, pero si por algún motivo fuera necesaria la instalación en un contenedor de estas características, cabe la posibilidad, una vez realizadas las modificaciones anteriores, de otorgar permisos a la ruta indicada anteriormente para poder ejecutar OpenVPN, de forma que si esta es la situación en la que nos encontramos, una vez guardado el archivo de configuración del contenedor, se debe ejecutar el siguiente comando:

chown 100000:100000 /dev/net/tun

Una vez ejecutado el comando, podemos verificar los permisos utilizando el siguiente comando:

ls -l /dev/net/tun

Paso 2: Instalación del cliente OpenVPN

Para proceder a la instalación del cliente, realizaremos los siguientes pasos:

Actualizar los paquetes del sistema:

sudo apt update

Instalar el cliente:

sudo apt-get install openvpn unzip

Paso 3: Prueba/Ejecución del cliente OpenVPN y conexión a servidor remoto

Este paso no es necesario, pero permite comprobar que el cliente funciona correctamente antes de llevar a cabo la instalación como servicio del sistema del mismo.

La conexión de OpenVPN resulta extremadamente sencilla, una vez instalado el cliente, solo es necesario indicarle a la aplicación que se ejecute utilizando un fichero de configuración con extensión .ovpn donde se encuentra toda la información de la conexión, por lo que solo necesitamos disponer de este fichero y proceder a su ejecución, indicando posteriormente el nombre de usuario y contraseña.

Obtención de las credenciales y archivo de configuración de SurfShark

En nuestro caso, al utilizar la VPN de SurfShark, en primer lugar debemos seleccionar el servidor al que nos queremos conectar y obtener el usuario y la contraseña junto con el archivo de configuración. En caso de utilizar otro proveedor de VPN, simplemente continuaremos al siguiente paso.

En la pestaña credenciales obtenemos el usuario y la contraseña y en la pestaña ubicaciones seleccionamos el servidor y descargamos el fichero de configuración, en nuestro caso UDP.

Si utilizamos SurfShark, también es posible descargar todos los archivos de configuración de todos los servidores a través del siguiente comando: sudo wget https://my.surfshark.com/vpn/api/v1/server/configurations y extraer los ficheros de configuración mediante el siguiente comando: sudo unzip configurations

De esta forma, dispondremos de todos los archivos de configuración para seleccionar el correcto.

Conexión al servidor VPN

Para conectar nuestro contenedor con el servidor, simplemente ejecutaremos el siguiente comando seguido de la ruta del archivo de configuración (.ovpn):

sudo openvpn us-slc.prod.surfshark.com_udp.ovpn

Nos solicitará el usuario y la contraseña:

Y procederá a la conexión

La consola quedará ocupada con la ejecución de la conexión, por lo que si necesitamos realizar tareas será necesario abrir un nuevo terminal. Para finalizar la conexión utilizaremos la combinación Ctrl+C.

Paso 4: Configurar OpenVPN como servicio del sistema (Conexión automática)

El primer paso para configurar OpenVPN como servicio es configurar la aplicación de forma que no sea necesario indicar el fichero de configuración, usuario y contraseña a utilizar, de forma que al ejecutar la aplicación, automáticamente se conecte al servidor con las credenciales guardadas.

Configurando el cliente OpenVPN para que se conecte automáticamente

Para realizar esta configuración, accederemos al fichero en el que se almacenan todos los parámetros de ejecución de OpenVPN a través del siguiente comando:

sudo nano /etc/default/openvpn

Y eliminaremos el signo # de la línea:

AUTOSTART="all"

Quedando el fichero de configuración como el siguiente:

# This is the configuration file for /etc/init.d/openvpn

#
# Start only these VPNs automatically via init script.
# Allowed values are "all", "none" or space separated list of
# names of the VPNs. If empty, "all" is assumed.
# The VPN name refers to the VPN configutation file name.
# i.e. "home" would be /etc/openvpn/home.conf
#
# If you're running systemd, changing this variable will
# require running "systemctl daemon-reload" followed by
# a restart of the openvpn service (if you removed entries
# you may have to stop those manually)
#
AUTOSTART="all"
#AUTOSTART="client"
#AUTOSTART="home office"
#
# WARNING: If you're running systemd the rest of the
# options in this file are ignored.
#
# Refresh interval (in seconds) of default status files
# located in /var/run/openvpn.$NAME.status
# Defaults to 10, 0 disables status file generation
#
#STATUSREFRESH=10
#STATUSREFRESH=0
# Optional arguments to openvpn's command line
OPTARGS=""
#
# If you need openvpn running after sendsigs, i.e.
# to let umountnfs work over the vpn, set OMIT_SENDSIGS
# to 1 and include umountnfs as Required-Stop: in openvpn's
# init.d script (remember to run insserv after that)
#
OMIT_SENDSIGS=0

Utilizaremos la combinación de teclas Ctrl+X para salir y confirmaremos los cambios pulsando Y.

De esta forma, al ejecutar la aplicación, se conectará con cualquier cliente que se encuentre correctamente configurado.

Modificar el fichero de parámetros de la conexión

El siguiente paso es colocar el fichero de configuración que usamos en el paso anterior (.ovpn), en la ruta /etc/openvpn/

Editaremos el fichero de configuración que acabamos de ubicar en la carpeta /etc/openvpn/ reemplazando la línea:

auth-user-pass

Cambiandola por:

auth-user-pass pass

De esta forma, cuando intente conectar utilizando este fichero de configuración, en lugar de solicitar el usuario y la contraseña, lo buscará en un fichero denominado «pass», que se debe encontrar en la misma ruta que el fichero de configuración.

Para finalizar este paso, renombraremos el fichero que .ovpn a la extensión .conf

sudo cp /etc/openvpn/[nombre_del_archivo].ovpn /etc/openvpn/client.conf

Creación del fichero con las credenciales: usuario y contraseña

Para crear el fichero con las credenciales, utilizaremos el siguiente comando:

sudo nano /etc/openvpn/pass

En este fichero colocaremos en la primera línea el nombre de usuario y en la segunda línea la contraseña de conexión, si esta es necesaria.

Utilizaremos la combinación de teclas Ctrl+X para salir y confirmaremos los cambios pulsando Y.

De forma opcional, podemos modificar los permisos del archivo que acabamos de crear para proteger las credenciales, para ello utilizaremos el siguiente comando:

sudo chmod 400 /etc/openvpn/pass

Configuración de OpenVPN como servicio

En algunas distribuciones de Linux, como por ejemplo en Ubuntu 16.04 LTS, OpenVPN se instala como servicio, de forma que con los pasos que hemos realizado, es suficiente para que se ejecute automáticamente, aún así y para asegurar que se encuentra instalado como servicio, utilizaremos los siguientes comandos.

Configurar la aplicación como servicio:

sudo systemctl enable openvpn@client.service

Recargar los demonios de Linux para que reactive los servicios:

sudo systemctl daemon-reload

Iniciar el servicio de OpenVPN:

sudo service openvpn@client start

Y por último, reiniciaremos el sistema para confirmar que está funcionando correctamente:

sudo reboot

Verificar el funcionamiento del cliente OpenVPN

Para verificar que se encuentra funcionando correctamente, basta con comprobar la IP Wan desde la que nos estamos conectando, de forma que si se trata de nuestra IP algo no funciona correctamente.

Para verificar la dirección desde la que nos estamos conectando utilizaremos el siguiente comando:

curl ifconfig.me

En caso de que curl no se encuentre instalado, este comando no funcionará, para instalar curl, en caso de que sea necesario, utilizaremos el siguiente comando:

sudo apt install curl

Si el resultado de este comando devuelve una IP distinta de la IP WAN de nuestro router, todo está funcionando correctamente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *