👉 Ubuntu VPN Server. Como instalarlo y usarlo

Permanece protegido en tus conexiones a tu oficina o servidores, haz tus conexiones cifradas con Ubuntu VPN Server.

El tema del articulo de hoy es como instalar, configurar y usar un servidor Ubuntu VPN en este tutorial en español paso a paso.

Requerimientos Ubuntu VPN Server

Porque usar una VPN? 🤔

Para nadie debe ser un misterio que todo el tiempo hay ataques y perdida de información valiosa en internet.

Es claro que no hay una solución 100% efectiva, pero lo peor que podemos hacer es no tomar medidas para protegernos.

Una de ellas es hacer nuestras conexiones por medio de una VPN, cifraremos nuestro trafico hacia nuestra oficina, casa o país desde donde queramos “salir” a internet, por ejemplo, para ver ese contenido bloqueado al sitio donde estamos actualmente

👉 Ubuntu VPN Server tutorial. Como instalarlo y usarlo

En este tutorial en español te mostrare lo siguiente:

  1. Instalación de OpenVPN en Ubuntu Server
  2. Instalación y configuracion de easy-rsa
  3. Creación de llaves y certificados de clientes
  4. Configuración de OpenVPN
  5. Ajustes de networking y firewall en Ubuntu Server
  6. Inicio de OpenVPN
  7. Creación de ficheros ovpn para los clientes
  8. Instalación, configuracion y conexión de cliente Microsoft Windows
  9. Instalación, configuracion y conexión de cliente Ubuntu Desktop

Instalación Ubuntu VPN Server

-Utilizare los siguientes datos para el servidor Ubuntu

  • hostname.domain: ubuvpn.drivemeca.com
  • ip: 192.168.0.7

-Primero confirmamos que nuestro Linux Ubuntu Server este actualizado

sudo apt update
sudo apt dist-upgrade

-Instalamos OpenVPN y easy-rsa

sudo apt install openvpn easy-rsa

Configuración de easy-rsa

-Haremos un directorio en nuestro directorio de usuario y a partir de el configuraremos las llaves y certificados con el comando make-cadir

make-cadir openvpn-ca
cd openvpn-ca/

-Verificamos el path de el directorio creado

pwd
/home/drivemeca/openvpn-ca

-Editamos y modificamos el archivo vars para las variables de ambiente necesarias.

Haz los cambios según tus necesidades personales o corporativas

vi vars
export KEY_COUNTRY="CO"
export KEY_PROVINCE="DC"
export KEY_CITY="Bogota"
export KEY_ORG="DriveMeca"
export KEY_EMAIL="pepe@drivemeca.com"
export KEY_OU="Sistemas"

-Creamos un enlace simbólico

sudo ln -s openssl-1.0.0.cnf openssl.cnf

-Activamos las variables

source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/drivemeca/openvpn-ca/keys

-Eliminamos llaves y certificados anteriores

./clean-all

Creamos CA y demás llaves en Ubuntu VPN Server

-Nuestros certificados y llaves deben ser emitidos o respaldados por un CA.

Esta entidad la creamos para nuestro servidor opensource con el siguiente comando y el tomara la mayoría de los datos de las variables que ya llenamos y activamos en el fichero vars

./build-ca
Generating a 2048 bit RSA private key
.................................+++
.........+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CO]:
State or Province Name (full name) [DC]:
Locality Name (eg, city) [Bogota]:
Organization Name (eg, company) [DriveMeca]:
Organizational Unit Name (eg, section) [Sistemas]:
Common Name (eg, your name or your server's hostname) [DriveMeca CA]:
Name [EasyRSA]:
Email Address [pepe@drivemeca.com]:

-Creamos una llave para nuestro Ubuntu Server, por lo general se usa el hostname para esto.

Tomara la mayoría de datos de las variables declaradas en vars por lo que usaremos los defaults presionando Enter en cada campo.

Prestar atención en responder y es las dos ultimas preguntas para que se genere la llave

./build-key-server ubuvpn
Generating a 2048 bit RSA private key
...............................................................................................................+++
.................................+++
writing new private key to 'ubuvpn.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CO]:
State or Province Name (full name) [DC]:
Locality Name (eg, city) [Bogota]:
Organization Name (eg, company) [DriveMeca]:
Organizational Unit Name (eg, section) [Sistemas]:
Common Name (eg, your name or your server's hostname) [ubuvpn]:
Name [EasyRSA]:
Email Address [pepe@drivemeca.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/drivemeca/openvpn-ca/openssl.cnf
Can't open /home/drivemeca/openvpn-ca/keys/index.txt.attr for reading, No such file or directory
140182395367872:error:02001002:system library:fopen:No such file or directory:../crypto/bio/bss_file.c:74:fopen('/home/drivemeca/openvpn-ca/keys/index.txt.attr','r')
140182395367872:error:2006D080:BIO routines:BIO_new_file:no such file:../crypto/bio/bss_file.c:81:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CO'
stateOrProvinceName :PRINTABLE:'DC'
localityName :PRINTABLE:'Bogota'
organizationName :PRINTABLE:'DriveMeca'
organizationalUnitName:PRINTABLE:'Sistemas'
commonName :PRINTABLE:'ubuvpn'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'pepe@drivemeca.com'
Certificate is to be certified until Sep 13 21:48:26 2028 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

-Creamos la llave Diffie-Hellman.

Esto demorara unos cuantos minutos, tiempo de ir por un café 😉

./build-dh

-Creamos una firma HMAC

openvpn --genkey --secret keys/ta.key

Como generar llaves y certificados clientes openvpn

Hay dos formas de crearlos, con contraseña y sin ella.

Cual de las dos formas usar, depende de ti, obviamente con contraseña sera mas seguro pero hay clientes u ocasiones que debemos usarlos sin contraseña

Crear llaves y certificados openvpn con contraseña

-Para crear una llave y certificado de cliente con contraseña ejecutamos los siguientes comandos.

Primero entramos al directorio y activamos variables de entorno

cd openvpn-ca
source vars

-Crearemos una llave y certificado con contraseña para el usuario usuario1 (haz el cambio para el nombre de usuario que vas a usar).

Recuerda responder y las dos ultimas preguntas

./build-key-pass usuario1
Generating a 2048 bit RSA private key
...........................................+++
.............................+++
writing new private key to 'usuario1.key'
Enter PEM pass phrase: Escribimos contraseña, no se vera en pantalla
Verifying - Enter PEM pass phrase: Volvemos a escribir contraseña
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CO]:
State or Province Name (full name) [DC]:
Locality Name (eg, city) [Bogota]:
Organization Name (eg, company) [DriveMeca]:
Organizational Unit Name (eg, section) [Sistemas]:
Common Name (eg, your name or your server's hostname) [usuario1]:
Name [EasyRSA]:
Email Address [pepe@drivemeca.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/drivemeca/openvpn-ca/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CO'
stateOrProvinceName :PRINTABLE:'DC'
localityName :PRINTABLE:'Bogota'
organizationName :PRINTABLE:'DriveMeca'
organizationalUnitName:PRINTABLE:'Sistemas'
commonName :PRINTABLE:'usuario1'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'pepe@drivemeca.com'
Certificate is to be certified until Sep 13 22:00:04 2028 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Crear llaves y certificados openvpn sin contraseña

-Suponiendo que necesitamos crear llave y certificado para un usuario usuario1 (haz el cambio para tu usuario) sin contraseña ejecutaremos el siguiente comando.

Recuerda responder con y las dos ultimas preguntas

./build-key usuario1

Configuración OpenVPN en Ubuntu VPN Server

-Copiamos las llaves y certificados necesitados por OpenVPN a su directorio de producción

cd openvpn-ca/keys/
sudo cp ca.crt ubuvpn.crt ubuvpn.key ta.key dh2048.pem /etc/openvpn/

-Descomprimimos un fichero de ejemplo para la configuracion

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

-Modificamos el archivo server.conf con los siguientes valores.

Los demás campos quedaran con su valor default

sudo vi /etc/openvpn/server.conf
tls-auth ta.key 0
key-direction 0
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
cert ubuvpn.crt
key ubuvpn.key

Ajustes de networking Ubuntu VPN Server

-Para que nuestro VPN funcione correctamente, Ubuntu Server debe tener habilitado el poder hacer NAT.

Para esto modificamos el siguiente fichero

sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1

-Activamos el cambio

sudo sysctl -p
net.ipv4.ip_forward = 1

Ajustes de firewall Ubuntu VPN Server

-Verificamos cual es la interfaz de red default del trafico

ip route | grep default
default via 192.168.0.1 dev enp0s3 proto dhcp src 192.168.0.7 metric 100

-Miramos mas info sobre las interfaces en nuestro servidor opensource

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:d6:47:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.7/24 brd 192.168.0.255 scope global dynamic enp0s3
valid_lft 81411sec preferred_lft 81411sec
inet6 fe80::a00:27ff:fed6:4734/64 scope link
valid_lft forever preferred_lft forever

-Agregamos el bloque de reglas de NAT después del bloque de reglas requeridas default

sudo vi /etc/ufw/before.rules
# OpenVPN
*nat
:POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.8.0.0/8 -o enp0s3 -j MASQUERADE
COMMIT

-Descomentamos y habilitamos la linea de FORWARD

sudo vi /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

-Abrimos en el firewall los puertos 1194/udp (openvpn) y 22 (SSH, seguramente ya estará abierto, pero por si acaso)

sudo ufw allow 1194/udp
Rules updated
Rules updated (v6)
sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)

-Deshabilitamos y volvemos a activar el firewall para que tome los cambios de puertos abiertos

sudo ufw disable
Firewall stopped and disabled on system startup
sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Ejecutamos servicio OpenVPN en Ubuntu VPN Server

-Activamos el servicio para que se ejecute automáticamente cada vez que nuestro Ubuntu Linux haga boot (OJO openvpn@server toma el server del fichero server.conf, si tu conf se llama diferente, cambia el nombre en este comando)

sudo systemctl enable openvpn@server
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn@server.service → /lib/systemd/system/openvpn@.service.

-Iniciamos el servicio OpenVPN

sudo systemctl start openvpn@server
sudo systemctl status openvpn@server
● openvpn@server.service - OpenVPN connection to server
Loaded: loaded (/lib/systemd/system/openvpn@.service; indirect; vendor preset: enabled)
Active: active (running) since Sun 2018-09-16 22:45:22 UTC; 15s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 3184 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 1110)
CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
└─3184 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd

sep 16 22:45:22 ubuvpn ovpn-server[3184]: Could not determine IPv4/IPv6 protocol. Using AF_INET
sep 16 22:45:22 ubuvpn ovpn-server[3184]: Socket Buffers: R=[212992->212992] S=[212992->212992] sep 16 22:45:22 ubuvpn ovpn-server[3184]: UDPv4 link local (bound): [AF_INET][undef]:1194
sep 16 22:45:22 ubuvpn ovpn-server[3184]: UDPv4 link remote: [AF_UNSPEC] sep 16 22:45:22 ubuvpn ovpn-server[3184]: GID set to nogroup
sep 16 22:45:22 ubuvpn ovpn-server[3184]: UID set to nobody
sep 16 22:45:22 ubuvpn ovpn-server[3184]: MULTI: multi_init called, r=256 v=256
sep 16 22:45:22 ubuvpn ovpn-server[3184]: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
sep 16 22:45:22 ubuvpn ovpn-server[3184]: IFCONFIG POOL LIST
sep 16 22:45:22 ubuvpn ovpn-server[3184]: Initialization Sequence Completed

-Verificamos la nueva interfaz de red creada

ip a show tun0
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::75a8:52aa:cbd8:bca7/64 scope link stable-privacy
valid_lft forever preferred_lft forever

Creamos ficheros ovpn clientes

Ya tenemos nuestro servidor VPN configurado y ejecutando, el siguiente paso es crear los ficheros de configuracion ovpn para los clientes que se vayan a conectar

-Creamos un nuevo directorio y restringimos sus atributos por seguridad

cd
mkdir -p clientes-conf/files
chmod 700 clientes-conf/files/

-Copiamos un fichero base de ejemplo para los conf que generaremos

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/clientes-conf/base.conf

-Modificamos el fichero base prestando atención en colocar la ip de conexión (generalmente es la ip publica del servidor) de nuestro Ubuntu VPN Server.

Las tres ultimas lineas las comentamos porque solo las usaremos para clientes Linux (si solo se conectaran clientes linux a tu VPN, déjalas activas)

vi clientes-conf/base.conf
remote 192.168.0.7 1194
proto udp
#ca ca.crt
#cert client.crt
#key client.key
cipher AES-256-CBC
auth SHA256
key-direction 1
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

-Creamos el siguiente script para crear los ficheros ovpn tomando los valores de las variables de ambiente y base.conf ademas de las llaves almacenadas en el directorio keys

vi clientes-conf/make_config.sh
#!/bin/bash

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/clientes-conf/files
BASE_CONFIG=~/clientes-conf/base.conf

cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn

-Le damos permisos de ejecución

chmod +x clientes-conf/make_config.sh

-Para crear un fichero de conexión ovpn antes debes haber creado la llave y certificado del cliente o usuario.

Entramos al directorio y ejecutamos el script para crear el fichero usuario1.ovpn (haz el cambio a tu nombre de usuario)

cd clientes-conf/
./make_config.sh usuario1

-Ya tenemos creado el fichero de conexión usuario1.ovpn.

Este fichero debes copiarlo en el equipo cliente que se va a conectar a tu Ubuntu VPN Server

ls -la files/
total 24
drwx------ 2 drivemeca drivemeca 4096 sep 16 23:09 .
drwxrwxr-x 3 drivemeca drivemeca 4096 sep 16 23:06 ..
-rw-rw-r-- 1 drivemeca drivemeca 13436 sep 16 23:09 usuario1.ovpn

Instalación cliente OpenVPN Microsoft Windows

La instalación de un cliente VPN en Windows no debe ser traumatico.

Para este articulo usaremos de ejemplo un Windows 10 y debemos tener la cuenta administrador o permisos

-Abrimos un browser y navegamos al URL oficial de descarga OpenVPN.

En este caso necesitamos descargar el exe de instalación para Windows 7 y posteriores

-Ejecutamos el instalador y respondemos Si cuando se nos pregunte si queremos permitir los cambios

-Se nos da la bienvenida.

Damos click al botón Next

-Leemos y aceptamos la licencia de uso.

Damos click al botón I Agree para continuar

-Como no es un servidor lo que estamos instalando, los defaults son suficientes.

Damos click al botón Next

-El asistente nos muestra donde instalar el cliente openvpn.

Damos click al botón Next

-Windows nos alerta de la creación de un nuevo dispositivo, en este caso la interfaz de red TAP.

Damos click al botón Instalar

-Termina la instalación del cliente Windows OpenVPN.

Damos click al botón Next

-Para finalizar damos click al botón Finish

Configuración y ejecución de Windows OpenVPN Client

-Apenas termina la instalación, automáticamente se ejecutara el cliente y lo podemos ver en la barra inferior de Microsoft Windows.

Damos click a su icono y seguidamente click a Import file

-Buscamos y abrimos el fichero ovpn ya generado en nuestro Ubuntu VPN Server y copiado a un directorio local de Windows

-Apenas importado el ovpn las opciones del icono de openvpn cambiaran.

Damos click a Connect

-Se abre una ventana donde veremos toda la secuencia de conexión con Ubuntu VPN Server.

Se nos pide la contraseña del usuario (en caso de haber generado la llave y certificado con contraseña, de lo contrario no se pedirá).

La escribimos y damos click al botón Ok

-El estado del icono en la barra cambia de color y ahora nos confirma que estamos conectados ademas de la ip que se nos asigno en la subred VPN

Verificamos conexión VPN en Windows

-Abrimos una consola MSDOS y ejecutamos el comando ipconfig.

Su salida nos mostrara la nueva interfaz de red activa con su ip de la subred vpn

-Ejecutamos un ping a la ip de la interfaz tun0 de Ubuntu VPN Server.

Si la conexión esta activa correctamente, debe respondernos

Como desconectar el OpenVPN Windows Client

-Terminaste de trabajar y quieres desconectarte?

Sencillo, das click botón izquierdo del mouse al icono openvpn y allí veras la opción Disconnect.

Dándole click quedaríamos desconectados

Instalación y configuración cliente VPN Linux Ubuntu

Podemos hacerlo de dos formas, por consola en modo texto con comandos o de forma gráfica con escritorio Gnome

-Instalamos openvpn Linux Ubuntu

sudo apt install openvpn

-Antes de conectarnos, debemos copiar el fichero ovpn de nuestro Ubuntu VPN Server, suponiendo que tengamos acceso via ssh, el siguiente seria el posible comando a usar para hacer la copia con scp (haz el cambio a tu ip y usuario)

scp drivemeca@192.168.0.7:/home/drivemeca/clientes-conf/files/usuario2.ovpn

Conectar VPN en Ubuntu Linux desde consola

-Abrimos una consola y ejecutamos el siguiente comando.

En este caso el ovpn junto con la llave y certificado fue creado para que pidiera contraseña, de lo contrario

sudo openvpn --config '/home/drivemeca/usuario2.ovpn'

-Veremos en pantalla el proceso de conexión y si todo marcha correctamente al final nos debe decir Initialization Sequence Completed

-Verificamos en otra consola la nueva interfaz tun0 creada ejecutando

ip a

-Ejecutamos un ping a la interfaz de red del Ubuntu VPN Server

Como conectar OpenVPN en Ubuntu Linux Gnome

-Para conectarnos desde nuestro network manager en Gnome (cuenta vpn creada sin contraseña), debemos instalar las siguientes dependencias

sudo apt install network-manager-openvpn-gnome openvpn-systemd-resolved

-Abrimos la sección de Red en la ventana de configuracion de Gnome (ya debes haber instalado openvpn como muestro mas arriba) y damos click al botón + al costado derecho de VPN

-En la ventana que nos aparece damos click a Importar desde un archivo

-Se nos pedirá abrir el fichero ovpn que ya debemos tener copiado en nuestro directorio de usuario.

Se abre una nueva ventana mostrándonos algunos datos importados del fichero ovpn, NO CAMBIAMOS NADA y damos click al botón Añadir

-De regreso ya veremos listada la conexión VPN con el nombre de usuario

-Damos click a su botón y ya estamos conectados

Verificamos conexión VPN en Gnome Ubuntu Linux

-En la barra Gnome superior en pantalla debes tener un nuevo icono de estado con el nombre de la cuenta VPN (solo se mostrara si estas conectado)

-Ademas de esa verificación, en consola ejecutamos los siguientes comandos incluyendo el ping a la interfaz VPN de Ubuntu VPN Server

ip a show tun0

Como eliminar cuenta VPN

-Es una buena practica cuando dejes de usar una cuenta VPN eliminarla y no dejarla ahí sin uso.

Activamos variables de ambiente

cd openvpn-ca
source vars

-Eliminamos la cuenta VPN que ya no usaremos (es normal que te muestre un error 23)

./revoke-full usuario2

-Copiamos crl.pem al directorio de producción de OpenVPN.

Con este archivo nuestro servidor sabrá cuando una cuenta ha sido eliminada

sudo cp keys/crl.pem /etc/openvpn/

-Lo activamos en el conf de OpenVPN (solo es necesario la primera vez)

sudo vi /etc/openvpn/server.conf
crl-verify crl.pem

-Reiniciamos el servicio para que tome el cambio

sudo systemctl restart openvpn@server

Nunca estarás 100% seguro en internet, pero usando una VPN no se la pondrás fácil a cualquiera que te quiera hackear.

Ya usas un VPN, es OpenVPN acaso, como te ha ido.

Te espero aquí debajo en los comentarios.

Satisfech@ con el articulo, hazme una donación, no importa la cantidad, la intención es lo que vale, dale click a este botón

Comparte este articulo opensource en tus redes sociales (compartir es sexy) por medio de los botones de redes sociales para que otros lo conozcan y apoyes mi blog.

Ademas, no olvides escribirme en los comentarios aquí debajo y pasa la voz compartiendo el tweet.