Una de las cosas que nos permite Docker es facilitar la administración y configuración de nuestros servicios, en este caso, podemos ver un ejemplo, para tener nuestro propio servicio de OpenVPN con unos pocos pasos mediante Docker.
Para ello, vamos a usar un contenedor desarrollado por Kyle Manna que nos va a facilitar todo el proceso de puesta en marcha y configuración de los servicios, en unos pocos comandos.

Preparando el entorno
En primer lugar vamos a descargar el contenido del repositorio https://github.com/kylemanna/docker-openvpn.git donde se encuentra este maravilloso contenedor.
git clone https://github.com/kylemanna/docker-openvpn.gitAccedemos a la carpeta que hemos descargado
cd docker-openvpnVamos a crear la imagen para desplegar los contenedores a paritr de esta
docker build -t mivpn .Lo siguiente es crear un directorio, donde vamos a conectar el volumen de trabajo de los contenedores, en este directorio vamos a guardar las llaves públicas, privadas y ficheros de configuración.
Asegurate de proteger bien este directorio.
cd ..
mkdir datos-vpnGenerando el fichero de configuración de OpenVPN
Ahora vamos a desplegar el primer contenedor efímero, puesto que solo lo vamos a usar para generar el primer fichero de configuración que será guardado en la carpeta datos-vpn. Evidentemente vamos a tener que añadir a la configuración la ip pública en donde se va alojar el servicio y el puerto que vamos a escuchar, en este ejemplo vamos a usar el 3000.
docker run -v $PWD/datos-vpn:/etc/openvpn --rm mivpn ovpn_genconfig -u udp://tu.dirección.ip.publica:3000Generando los PKI y el CA
El siguiente paso es generar las llaves y el certificado ya que OpenVPN requiere de una llave privada, otra pública y un certificado.
Por lo que vamos a ejecutar otro contenedor efímero que nos va ayudar a realizar estos ficheros, en la carpeta creada datos-vpn.
docker run -v $PWD/datos-vpn:/etc/openvpn --rm -it mivpn ovpn_initpkiArrancamos el contenedor OpenVPN
Ahora si, vamos a poner en marcha el contenedor que nos va hacer de servidor OpenVPN, que va a recoger la configuración que tenemos en la carpeta datos-vpn.
docker run --name mivpn -v $PWD/datos-vpn:/etc/openvpn -d --restart always -p 3000:1194/udp --cap-add=NET_ADMIN mivpnAñadiendo usuarios
Ahora podemos añadir los usuarios (clientes), generando el fichero .ovpn para cada usuario, vemos que no se va a establecer ninguna contraseña para el usuario, puesto que en este ejemplo vamos a realizar la conexión mediante llave, certificado y usuario.
Para crear el usuario cliente, una vez más vamos a usar un contenedor efímero, tan solo debemos cambiar USUARIO por el nombre de usuario que deseamos.
docker run -v $PWD/datos-vpn:/etc/openvpn --rm -it mivpn easyrsa build-client-full USUARIO nopassPor último vamos a generar en la carpeta datos-vpn un fichero USUARIO.ovpn con la configuración para este usuario, para ello también usaremos un contenedor efímero.
docker run -v $PWD/datos-vpn:/etc/openvpn --rm mivpn ovpn_getclient USUARIO > $PWD/datos-vpn/USUARIO.ovpnAhora nos podemos llevar este fichero USUARIO.ovpn al cliente de OpenVPN para establecer la conexión
Conectando a nuestro servidor OpenVPN
Ahora ya podemos, mediante el cliente OpenVPN establecer una conexión
openvpn --config USUARIO.ovpn
Tue Feb 12 11:55:36 2019 OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep 5 2018
Tue Feb 12 11:55:36 2019 library versions: OpenSSL 1.1.0g 2 Nov 2017, LZO 2.08
Tue Feb 12 11:55:36 2019 TCP/UDP: Preserving recently used remote address: [AF_INET]12.34.56.78:3000
Tue Feb 12 11:55:36 2019 UDP link local: (not bound)
Tue Feb 12 11:55:36 2019 UDP link remote: [AF_INET]12.34.56.78:3000
Tue Feb 12 11:55:36 2019 WARNING: 'link-mtu' is used inconsistently, local='link-mtu 1541', remote='link-mtu 1542'
Tue Feb 12 11:55:36 2019 WARNING: 'comp-lzo' is present in remote config but missing in local config, remote='comp-lzo'
Tue Feb 12 11:55:36 2019 [51.68.78.181] Peer Connection Initiated with [AF_INET]12.34.56.78:3000
Tue Feb 12 11:55:37 2019 Options error: Unrecognized option or missing or extra parameter(s) in [PUSH-OPTIONS]:1: block-outside-dns (2.4.4)
Tue Feb 12 11:55:37 2019 TUN/TAP device tun0 opened
Tue Feb 12 11:55:37 2019 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Tue Feb 12 11:55:37 2019 /sbin/ip link set dev tun0 up mtu 1500
Tue Feb 12 11:55:37 2019 /sbin/ip addr add dev tun0 local 192.168.255.6 peer 192.168.255.5
Tue Feb 12 11:55:37 2019 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Tue Feb 12 11:55:37 2019 Initialization Sequence Completed