Logo

Servidor OpenVPN con Docker

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.

Notion Image

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

← Volver al inicio