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.git
Accedemos a la carpeta que hemos descargado
cd docker-openvpn
Vamos 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-vpn
Generando 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:3000
Generando 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_initpki
Arrancamos 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 mivpn
Añ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 nopass
Por ú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.ovpn
Ahora 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
Javi dice
Hola!
He seguido el tutorial paso a paso, pero no consigo encontrar los certificados en .ovpn
Todos los certificados que me aparecen en la carpeta datos-vpn tienen extensiones que no las soporta openvpn (.key, .crt)
¿Algún consejo?
Joan dice
El fichero ovpn se genera luego de crear el usuario, es un fichero para cada usuario. ¿No te lo genera con docker run -v $PWD/datos-vpn:/etc/openvpn –rm mivpn ovpn_getclient USUARIO > $PWD/datos-vpn/USUARIO.ovpn?
Victor dice
Hola,
esta instrucción da un error:
«docker run -v $PWD/datos-vpn:/etc/openvpn –rm -it mivpn ovpn_initpki»
Easy-RSA error:
The file ‘/etc/openvpn/vars’ was not found.
Phco dice
Muchísimas gracias!
Después de dar vueltas y probar con varios tutoriales, he conseguido hacerlo a la primera!