Cómo instalar y configurar un servidor OpenVPN en Ubuntu 22.04
Una Red Privada Virtual (VPN) te permite acceder a Internet enmascarando tu ubicación, lo que te permite acceder a Internet de forma segura en redes que no son de confianza y eludir las restricciones geográficas y la censura. OpenVPN es una solución VPN de código abierto de Seguridad de la Capa de Transporte (TLS) para lograr este objetivo.
En nuestro tutorial, instalaremos OpenVPN en un servidor Ubuntu 22.04, lo configuraremos para que sea accesible desde una máquina cliente, y crearemos una conexión VPN entre ambos para redirigir todo el tráfico del cliente a través del servidor OpenVPN.
Requisitos previos
- Un servidor con Ubuntu 22.04 que admita conexiones IPv4 e IPv6. Nos referiremos a él como el servidor OpenVPN. El Cortafuegos sin complicaciones (UFW) está activado y ejecutándose en él.
- Un servidor con Ubuntu 22.04 que admite conexiones IPv4 e IPv6. Lo configuraremos como una Autoridad de Certificación (CA) privada, a la que nos referiremos como servidor CA.
- Un usuario no root con privilegios sudo tanto en OpenVPN como en el servidor CA.
- Una máquina cliente para conectarse al servidor OpenVPN. Puedes utilizar tu dispositivo local como máquina cliente. OpenVPN tiene clientes para Windows, Linux, macOS, Android e iOS. Puedes utilizar cualquiera de ellos para conectarte. Utilizaremos un PC cliente Ubuntu 22.04 para el tutorial.
- Todo está actualizado en OpenVPN y el servidor CA.
$ sudo apt update && sudo apt upgrade
Paso 1 – Configurar el servidor CA
Una Autoridad de Certificación (CA) es una entidad responsable de emitir certificados digitales para verificar identidades en Internet. En este tutorial, utilizaremos un servidor independiente como servidor CA privado que validará los certificados del servidor y del cliente OpenVPN. Tu servidor CA no debe ejecutar ningún otro servicio que no sea importar, firmar y validar certificados.
Paso 1.1 – Instalar Easy-RSA
El primer paso es instalar el conjunto de scripts easy-rsa
. easy-rsa
es una herramienta de gestión de Autoridades de Certificación que se utiliza para generar una clave privada y un certificado raíz público.
$ sudo apt install easy-rsa
Paso 1.2 – Crear un Directorio de Infraestructura de Clave Pública
El siguiente paso es crear un esqueleto de Infraestructura de Clave Pública (PKI) en el servidor de la CA.
$ mkdir ~/easy-rsa
Crea enlaces simbólicos que apunten a los archivos del paquete easy-rsa
instalado.
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
Restringe el acceso al directorio de la PKI.
$ chmod 700 /home/<username>/easy-rsa
Inicializa la PKI.
$ cd ~/easy-rsa $ ./easyrsa init-pki
Obtendrás el siguiente resultado.
init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/<username>/easy-rsa/pki
Paso 1.3 – Crear una Autoridad de Certificación
Antes de crear la clave privada y el certificado de tu CA, tienes que configurar la información de la organización para ella. Crea un archivo vars
para almacenar la información dentro del directorio easy-rsa
y ábrelo para editarlo.
$ cd ~/easy-rsa $ nano vars
Pega en él el siguiente código.
set_var EASYRSA_REQ_COUNTRY "US" set_var EASYRSA_REQ_PROVINCE "NewYork" set_var EASYRSA_REQ_CITY "New York City" set_var EASYRSA_REQ_ORG "Howtoforge" set_var EASYRSA_REQ_EMAIL "[email protected]" set_var EASYRSA_REQ_OU "Community" set_var EASYRSA_ALGO "ec" set_var EASYRSA_DIGEST "sha512"
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Ejecuta el siguiente comando para crear el par de claves raíz pública y privada para tu Autoridad de Certificación.
$ ./easyrsa build-ca
Se te pedirá que introduzcas una frase de contraseña para tu par de claves. Elige una frase de contraseña segura y anótala para más tarde. También se te pedirá el Nombre Común (CN) de tu CA. Puedes introducir cualquier cadena, pero por simplicidad, pulsa INTRO para aceptar el nombre por defecto.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) Enter New CA Key Passphrase: Re-Enter New CA Key Passphrase: 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. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]: CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /home/<username>/easy-rsa/pki/ca.crt
Si no quieres que se te pida una contraseña cada vez que interactúes con tu CA, puedes utilizar en su lugar el siguiente comando.
$ ./easyrsa build-ca nopass
Esto creará dos archivos:
~/easy-rsa/pki/ca.crt
es el archivo del certificado público de la CA. Cada usuario y el servidor OpenVPN necesitarán una copia de este archivo.~/easy-rsa/pki/ca.key
es la clave privada utilizada por la CA para firmar certificados para el servidor y el cliente OpenVPN. Si un atacante consigue acceder a tu CA y, a su vez, a tu archivoca.key
, tendrás que destruir tu CA. Por eso, tu archivoca.key
sólo debe estar en tu máquina CA y lo ideal es que tu máquina CA se mantenga desconectada cuando no esté firmando solicitudes de certificados, como medida de seguridad adicional.
Paso 2 – Instalación de OpenVPN y Easy-RSA en el servidor OpenVPN
Accede a tu servidor OpenVPN e instala los paquetes OpenVPN y Easy-RSA.
$ sudo apt install openvpn easy-rsa
Crea el directorio ~/easy-rsa
.
$ mkdir ~/easy-rsa
Crea un enlace simbólico desde el script easy-rsa
que instalamos igual que en el servidor CA.
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
Restringe el acceso al directorio.
$ chmod 700 ~/easy-rsa
Paso 3 – Crear una PKI para el servidor OpenVPN
Crea un archivo vars
dentro del directorio ~/easy-rsa
para almacenar la información necesaria para crear la PKI y ábrelo para editarlo.
$ cd ~/easy-rsa $ nano vars
Pega en él las siguientes líneas.
set_var EASYRSA_ALGO "ec" set_var EASYRSA_DIGEST "sha512"
Como no vamos a utilizar este servidor como CA, estos son los únicos valores que necesitamos. Esto configura tus servidores OpenVPN y CA para que utilicen ECC, lo que significa que cuando un cliente y un servidor intentan establecer una clave simétrica compartida, utilizan algoritmos de Curva Elíptica para realizar su intercambio. Es significativamente más rápido que utilizar Diffie-Hellman simple con el algoritmo RSA clásico, ya que los números son mucho más pequeños y los cálculos son más rápidos.
El siguiente paso es crear el directorio PKI utilizando la opción init-pki
. Aunque ya ejecutaste este comando en el servidor CA como parte de los requisitos previos, es necesario ejecutarlo aquí porque tu servidor OpenVPN y el servidor CA tienen directorios PKI separados.
$ ./easyrsa init-pki
La PKI del servidor OpenVPN se utiliza como lugar centralizado para almacenar las solicitudes de certificados y los certificados públicos.
Paso 4 – Crear la solicitud de certificado y la clave privada del servidor OpenVPN
Ve al directorio ~/easy-rsa
del servidor OpenVPN.
$ cd ~/easy-rsa
El siguiente paso es generar una clave privada y una Solicitud de Firma de Certificado (CSR) en tu servidor OpenVPN. Ejecuta el comando easy-rsa
con la opción gen-req
seguida de un Nombre Común (CN) para el servidor. Para nuestro tutorial, utilizaremos server
como CN para el servidor OpenVPN. También utilizaremos la opción nopass
para evitar problemas de permisos.
$ ./easyrsa gen-req server nopass
Obtendrás el siguiente resultado.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) ..........+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....................+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+..+......+.......+...+..+.+.....+....+..+...+............+.+...+.....+....+...........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+......+.....+....+...........+...+..........+..+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*............+.+..+....+..............+.....................+....+......+..............+.+.....+....+............+..+............+....+..+...+.......+.....+....+...+..+.........+.+.........+..+...+.+..............+.+.........+...........+.+.....+.........+...+......+.+......+.....+..........+...+..............+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----- 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. ----- Common Name (eg: your user, host, or server name) [server]: Keypair and certificate request completed. Your files are: req: /home/<username>/easy-rsa/pki/reqs/server.req key: /home/<username>/easy-rsa/pki/private/server.key
Esto crea una clave privada para el servidor y un archivo de solicitud de certificado llamado server.req
. Copia la clave del servidor en el directorio /etc/openvpn/server
.
$ sudo cp /home/<username>/easy-rsa/pki/private/server.key /etc/openvpn/server/
La Solicitud de Firma de Certificado (CSR) ya está lista para ser firmada por la CA.
Paso 5 – Firmar la CSR del servidor OpenVPN
El siguiente paso es copiar el archivo CSR al servidor de la CA para que lo firme. Si tus servidores tienen activada la autenticación por contraseña, puedes utilizar simplemente el siguiente comando para copiar el archivo.
$ scp /home/username/easy-rsa/pki/reqs/server.req username@your_ca_server_ip:/tmp
Si no quieres utilizar la autenticación por contraseña, tendrás que generar un par de claves SSH para cada servidor, y luego añadir la clave SSH pública del servidor OpenVPN al archivo authorized_keys
de la máquina CA y viceversa.
Si no quieres pasar por todo esto, puedes simplemente copiar los archivos. Abre el archivo en el servidor OpenVPN, copia su contenido y, a continuación, crea el archivo en el servidor CA y pega el contenido.
Vuelve a entrar en el servidor CA, y cambia al directorio ~/easy-rsa
e importa el archivo CSR.
$ cd ~/easy-rsa $ ./easyrsa import-req /tmp/server.req server
Obtendrás la siguiente salida.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) The request has been successfully imported with a short name of: server You may now use this name to perform signing operations on this request.
Firma la solicitud utilizando el siguiente comando. Como estamos firmando la CSR del servidor OpenVPN, utilizaremos su Nombre Común (CN).
$ ./easyrsa sign-req server server
Se te pedirá que verifiques si la solicitud procede de una fuente de confianza. Escribe yes
y pulsa la tecla ENTER
para confirmar.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 825 days: subject= commonName = server Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes
A continuación, se te pedirá la frase de contraseña de la clave privada de la CA que configuraste anteriormente.
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-13476.9IC4QC/tmp.lPVwQo Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key: 40975B6A677F0000:error:0700006C:configuration file routines:NCONF_get_string:no value:../crypto/conf/conf_lib.c:315:group=<NULL> name=unique_subject Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'server' Certificate is to be certified until May 8 12:41:46 2025 GMT (825 days) Write out database with 1 new entries Data Base Updated Certificate created at: /home/<username>/easy-rsa/pki/issued/server.crt
El certificado resultante contiene la clave pública de cifrado del servidor OpenVPN, así como la firma del servidor CA. Copia los certificados en el servidor OpenVPN.
$ scp pki/issued/server.crt username@your_vpn_server_ip:/tmp $ scp pki/ca.crt username@your_vpn_server_ip:/tmp
En tu servidor OpenVPN, copia los archivos en el directorio /etc/openvpn/server
.
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Paso 6 – Configurar el material criptográfico de OpenVPN
Añadiremos una clave secreta compartida adicional que el servidor y todos los clientes utilizarán con la directiva tls-crypt
de OpenVPN. Esto garantiza que el servidor OpenVPN pueda hacer frente al tráfico no autenticado, a los escaneos de puertos y a los ataques de denegación de servicio. También dificulta la identificación del tráfico de red OpenVPN.
Cambia al directorio ~/easy-rsa
.
$ cd ~/easy-rsa
Genera la clave precompartida tls-crypt
. Esto creará un archivo llamado ta.key
$ openvpn --genkey secret ta.key
Copia el ta.key
al directorio /etc/openvpn/server
.
$ sudo cp ta.key /etc/openvpn/server
Paso 7 – Generar un certificado de cliente y un par de claves
Crea un directorio para almacenar los archivos del certificado y la clave del cliente.
$ mkdir -p ~/client-configs/keys
Restringe los permisos del directorio para protegerlo.
$ chmod -R 700 ~/client-configs
A continuación, pasa al directorio ~/easy-rsa
.
$ cd ~/easy-rsa
Genera una clave de cliente con client1
como Nombre Común del cliente. Puedes utilizar cualquier CN para el cliente.
$ ./easyrsa gen-req client1 nopass
Pulsa ENTER
para confirmar el nombre común. Obtendrás el siguiente resultado.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) .......+.+.....+.+........+.+...+...+........+....+..+....+.........+....................+......+.......+...+.....+.+.........+...............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*............+......+.........+......+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+........+...+...................+...........+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ..........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...........+......+.......+..+..........+.....+.......+.....+....+.....+....+...+.....+...+....+...........+....+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----- 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. ----- Common Name (eg: your user, host, or server name) [client1]: Keypair and certificate request completed. Your files are: req: /home/username/easy-rsa/pki/reqs/client1.req key: /home/username/easy-rsa/pki/private/client1.key
A continuación, copia el archivo client1.key
en el directorio ~/client-configs/keys
.
$ cp pki/private/client1.key ~/client-configs/keys/
Transfiere el archivo client1.req
al servidor CA.
$ scp pki/reqs/client1.req username@your_ca_server_ip:/tmp
Vuelve a entrar en el servidor CA e importa la solicitud del servidor.
$ cd ~/easy-rsa $ ./easyrsa import-req /tmp/client1.req client1
Obtendrás el siguiente resultado.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) The request has been successfully imported with a short name of: client1 You may now use this name to perform signing operations on this request.
Firma la solicitud utilizando el siguiente comando. Estamos utilizando client
como tipo de solicitud.
$ ./easyrsa sign-req client client1
Cuando se te solicite, introduce yes
para confirmar que vas a firmar la solicitud y que procede de una fuente de confianza.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a client certificate for 825 days: subject= commonName = client1 Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes
Se te pedirá la frase de contraseña de la CA.
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-13573.uI2Vi8/tmp.q1RnLo Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'client1' Certificate is to be certified until May 8 12:50:23 2025 GMT (825 days) Write out database with 1 new entries Data Base Updated Certificate created at: /home/username/easy-rsa/pki/issued/client1.crt
Transfiere el certificado creado al servidor OpenVPN.
$ scp pki/issued/client1.crt username@your_server_ip:/tmp
En el servidor OpenVPN, copia el certificado del cliente en el directorio ~/client-configs/keys
.
$ cp /tmp/client1.crt ~/client-configs/keys/
Copia los archivos ca.crt
y ta.key
en el directorio ~/client-configs/keys
, y establece los permisos apropiados para tu servidor actualmente conectado.
$ cp ~/easy-rsa/ta.key ~/client-configs/keys/ $ sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/ $ sudo chown username.username ~/client-configs/keys/*
Paso 8 – Configurar OpenVPN
Copia el archivo de ejemplo server.conf
como punto de partida para configurar OpenVPN.
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
Abre el archivo para editarlo.
$ sudo nano /etc/openvpn/server/server.conf
Encuentra la sección HMAC
del archivo buscando la directiva tls-auth
. Comenta la línea añadiendo un punto y coma (;) al principio de la línea. Añade una nueva línea debajo, como se muestra.
;tls-auth ta.key 0 # This file is secret tls-crypt ta.key
A continuación, cambia el valor del cifrado criptográfico buscando las líneas cipher
. El valor por defecto es AES-256-CBC
. Comenta el valor por defecto y añade otra línea con el cifrado AES-256-GCM
que ofrece un mejor nivel de cifrado, y rendimiento como se muestra.
;cipher AES-256-CBC cipher AES-256-GCM
Justo debajo, añade la directiva auth
para seleccionar el algoritmo de resumen de mensajes HMAC.
auth SHA256
Como estamos utilizando Criptografía de Curva Elíptica, tenemos que desactivar el cifrado Diffie-Hellman. Comenta la línea dh dh2048.pem
y añade dh none
debajo.
;dh dh2048.pem dh none
OpenVPN debe ejecutarse sin privilegios una vez iniciado. Para activarlo, busca y descomenta las líneas user nobody
y group nobody
y cámbialas como se muestra.
user nobody group nogroup
Ubuntu tiene el grupo nogroup
y no nobody
que está disponible en la distribución CentOS.
Redirige todo el tráfico a través de la VPN
La configuración anterior crea la conexión VPN entre el cliente y el servidor, pero no obliga a ninguna conexión a utilizar el túnel. Para ello, empieza por buscar la línea push "redirect-gateway def1 bypass-dhcp"
. Esta línea indica al cliente que redirija todo su tráfico a través del servidor OpenVPN. Descomenta la línea para activar la funcionalidad.
push "redirect-gateway def1 bypass-dhcp"
Busca la sección dhcp-option
debajo de esta línea. Elimina el punto y coma del principio de ambas líneas. Esto le indica al cliente que utilice los resolvedores OpenDNS.
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
Cambiar el puerto y el protocolo
OpenVPN utiliza por defecto el puerto 1194 y el protocolo UDP para aceptar las conexiones de los clientes. Puedes cambiar el puerto en función de tus necesidades. Si no alojas contenido web en tu servidor OpenVPN, puedes utilizar el puerto 443.
Busca la línea port 1194
y cambia su valor.
# Optional! port 443
Busca la línea proto udp
y coméntala añadiendo un punto y coma delante. Y, descomenta la línea proto tcp
eliminando el punto y coma como se muestra.
proto tcp ;proto udp
Como estamos utilizando el protocolo TCP, tenemos que cambiar el valor de la directiva explicit-exit-notify
de 1
a 0
, ya que esta directiva sólo la utiliza UDP.
explicit-exit-notify 0
Apuntar a credenciales no predeterminadas
Si antes seleccionaste un nombre diferente durante el comando ./easy-rsa gen-req server
, tienes que modificar las líneas cert
y key
para que apunten a los archivos .crt
y .key
adecuados. Como estamos utilizando el nombre server
por defecto, el valor por defecto es correcto.
cert server.crt key server.key
Una vez hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Paso 9 – Ajustar la configuración de red del servidor OpenVPN
El siguiente paso es configurar la configuración de red del servidor para permitir que OpenVPN enrute el tráfico correctamente. Lo primero que tenemos que configurar es el Reenvío de Puertos.
Abre el archivo /etc/sysctl.conf
para editarlo.
$ sudo nano /etc/sysctl.conf
Añade la siguiente línea al final del archivo.
net.ipv4.ip_forward = 1
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Para leer el archivo y cargar los nuevos valores para la sesión actual, utiliza el siguiente comando.
$ sudo sysctl -p net.ipv4.ip_forward = 1
Esta configuración dirigirá todo el tráfico web de tu cliente a través de la dirección IP de tu servidor, y la dirección IP pública de tu cliente quedará oculta.
Paso 10 – Configurar el Cortafuegos
Para permitir OpenVPN a través del cortafuegos, tienes que activar el enmascaramiento, un concepto de iptables que proporciona traducción dinámica de direcciones de red (NAT) sobre la marcha para enrutar correctamente las conexiones de los clientes.
Antes de abrir el archivo de configuración del cortafuegos para añadir las reglas de enmascaramiento, busca primero la interfaz de red pública de tu máquina utilizando el siguiente comando.
$ ip route list default
Recibirás una salida similar.
default via 64.225.64.1 dev eth0 proto static
Esto nos indica que el nombre de la interfaz es eth0
. Abre el archivo /etc/ufw/before.rules
para editarlo.
$ sudo nano /etc/ufw/before.rules
Estas reglas se leen y se colocan antes de que se carguen las reglas UFW convencionales. Añade las siguientes líneas al principio del archivo, como se muestra.
# # rules.before # # Rules that should be run before the ufw command line added rules. Custom # rules should be added to one of these chains: # ufw-before-input # ufw-before-output # ufw-before-forward # # START OPENVPN RULES # NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!) -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES # Don't delete these required lines, otherwise there will be errors *filter . . .
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
A continuación, tenemos que configurar UFW para que permita paquetes reenviados por defecto. Abre el archivo /etc/default/ufw
para editarlo.
$ sudo nano /etc/default/ufw
Busca la directiva DEFAULT_FORWARD_POLICY
y cambia su valor de DROP
a ACCEPT
.
DEFAULT_FORWARD_POLICY="ACCEPT"
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Y por último, abre el puerto 443 que configuraste anteriormente para el servidor OpenVPN.
$ sudo ufw allow 443/tcp
Desactiva y activa el cortafuegos para aplicar la nueva configuración.
$ sudo ufw disable $ sudo ufw enable
Paso 11 – Iniciar OpenVPN
Habilita el servicio OpenVPN para que se inicie en el arranque.
$ sudo systemctl -f enable [email protected]
Inicia el servicio OpenVPN.
$ sudo systemctl start [email protected]
Comprueba el estado del servicio.
$ sudo systemctl status [email protected]
Recibirás una salida similar.
? [email protected] - OpenVPN service for server Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled) Active: active (running) since Fri 2023-02-03 13:40:28 UTC; 32s ago Docs: man:openvpn(8) https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage https://community.openvpn.net/openvpn/wiki/HOWTO Main PID: 15492 (openvpn) Status: "Initialization Sequence Completed" Tasks: 1 (limit: 1116) Memory: 1.8M CPU: 29ms CGroup: /system.slice/system-openvpn\x2dserver.slice/[email protected] ??15492 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf Feb 03 13:40:28 vpnserver openvpn[15492]: Listening for incoming TCP connection on [AF_INET][undef]:443 Feb 03 13:40:28 vpnserver openvpn[15492]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443 Feb 03 13:40:28 vpnserver openvpn[15492]: TCPv4_SERVER link remote: [AF_UNSPEC] Feb 03 13:40:28 vpnserver openvpn[15492]: GID set to nogroup Feb 03 13:40:28 vpnserver openvpn[15492]: UID set to nobody Feb 03 13:40:28 vpnserver openvpn[15492]: MULTI: multi_init called, r=256 v=256 Feb 03 13:40:28 vpnserver openvpn[15492]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62 Feb 03 13:40:28 vpnserver openvpn[15492]: IFCONFIG POOL LIST Feb 03 13:40:28 vpnserver openvpn[15492]: MULTI: TCP INIT maxclients=1024 maxevents=1028 Feb 03 13:40:28 vpnserver openvpn[15492]: Initialization Sequence Completed
Paso 12 – Crear la configuración del cliente
Antes de probar un cliente, necesitamos crear archivos de configuración para el cliente que vamos a utilizar. Crea un directorio para almacenar los archivos de configuración del cliente.
$ mkdir -p ~/client-configs/files
Copia el archivo de configuración del cliente de ejemplo en el directorio.
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
Abre el archivo de configuración para editarlo.
$ nano ~/client-configs/base.conf
Busca la directiva remote
y configúrala para que apunte a la dirección IP pública de tu servidor OpenVPN. Cambia también el puerto para que coincida con el que elegiste antes.
. . . # The hostname/IP and port of the server. # You can have multiple remote entries # to load balance between the servers. remote your_server_ip 443 . . .
Establece el protocolo que elegiste antes.
proto tcp
Descomenta las directivas user
y group
eliminando el punto y coma que las precede. Cambia también el valor de la directiva group
por nogroup
.
# Downgrade privileges after initialization (non-Windows only) user nobody group nogroup
Busca las directivas ca
, cert
, y key
y coméntalas poniendo un punto y coma delante de ellas. Esto se debe a que añadiremos los certificados y las claves en el archivo de configuración del cliente.
# SSL/TLS parms. # See the server config file for more # description. It's best to use # a separate .crt/.key file pair # for each client. A single ca # file can be used for all clients. ;ca ca.crt ;cert client.crt ;key client.key
Comenta la directiva tls-auth
porque añadiremos la ta.key
directamente en el archivo de configuración del cliente.
# If a tls-auth key is used on the server # then every client must also have the key. ;tls-auth ta.key 1
Haz coincidir las opciones cipher
y auth
que estableciste en el archivo `/etc/openvpn/server/server.conf
.
cipher AES-256-GCM auth SHA256
Añade la directiva key-direction
y ajústala a 1
para que la VPN funcione correctamente.
key-direction 1
A continuación, añade algunas líneas comentadas para gestionar los distintos métodos que utilizan los clientes VPN para la resolución DNS. Añade el siguiente conjunto de líneas para los clientes que no utilizan systemd-resolved
sino que confían en la utilidad resolvconf
para gestionar el DNS.
; script-security 2 ; up /etc/openvpn/update-resolv-conf ; down /etc/openvpn/update-resolv-conf
Añade el siguiente conjunto de líneas para los clientes que utilizan systemd-resolved
para la resolución DNS.
; script-security 2 ; up /etc/openvpn/update-systemd-resolved ; down /etc/openvpn/update-systemd-resolved ; down-pre ; dhcp-option DOMAIN-ROUTE .
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Crea un script para compilar la configuración base con los archivos de certificado, clave y cifrado pertinentes, y luego copia el archivo de configuración generado en el directorio ~/client-configs/files
.
Crea y abre el archivo make_config.sh
dentro del directorio ~/client-configs
.
$ nano ~/client-configs/make_config.sh
Pega en él el siguiente código.
#!/bin/bash # First argument: Client identifier KEY_DIR=~/client-configs/keys OUTPUT_DIR=~/client-configs/files BASE_CONFIG=~/client-configs/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-crypt>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-crypt>') \ > ${OUTPUT_DIR}/${1}.ovpn
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Haz que el archivo sea ejecutable y restríngele los permisos.
$ chmod 700 ~/client-configs/make_config.sh
Este script hace una copia del archivo base.conf
, recopila todos los archivos de certificados y claves, extrae su contenido, los añade al archivo de configuración base y exporta todo eso para crear un nuevo archivo de configuración de cliente. Cada vez que añadas un nuevo cliente, deberás generar nuevas claves y certificados para él y, a continuación, ejecutar este script para crear un archivo de configuración de cliente.
Ya hemos creado los archivos de certificados y claves de cliente en el paso 7. Vamos a crear el archivo de configuración para el mismo.
Cambia al directorio ~/client-configs
.
$ cd ~/client-configs
Ejecuta el script para crear el archivo de configuración del cliente.
$ ./make_config.sh client1
Se creará un archivo llamado client1.ovpn
. Cambia el parámetro si quieres un nombre de archivo diferente. Comprueba el contenido del directorio.
$ ls ~/client-configs/files client1.ovpn
Este es el archivo de configuración que tienes que transferir al cliente, que luego se utilizará para conectarse al servidor OpenVPN. Puedes utilizar cualquier protocolo/programa SFTP para transferir el archivo al cliente.
Paso 13 – Instalar y probar la conexión con el cliente
Para nuestro tutorial, estamos utilizando una máquina cliente Ubuntu 22.04. Instala OpenVPN mediante el siguiente comando.
$ sudo apt install openvpn
Comprueba si tu sistema utiliza systemd-resolved
para gestionar las consultas DNS ejecutando el siguiente comando.
$ cat /etc/resolv.conf
Obtendrás un resultado similar.
Output # This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8). # Do not edit. . . . nameserver 127.0.0.53 options edns0 trust-ad search .
Si el sistema está utilizando systemd-resolved
, entonces la dirección IP de arriba será 127.0.0.53
. Además, el comentario de la parte superior del archivo confirmará lo mismo. Si la dirección IP es distinta de 127.0.0.53
, entonces el sistema no está utilizando systemd-resolved
y deberás seguir los pasos que se mencionan más adelante.
Para clientes con systemd-resolved
Instala el paquete openvpn-systemd-resolved
que proporciona scripts que obligan a systemd-resolved
a utilizar el servidor VPN para DNS.
$ sudo apt install openvpn-systemd-resolved
Abre el archivo de configuración del Cliente para editarlo.
$ nano client1.ovpn
Descomenta las siguientes líneas del archivo eliminando el punto y coma que las precede.
script-security 2 up /etc/openvpn/update-systemd-resolved down /etc/openvpn/update-systemd-resolved down-pre dhcp-option DOMAIN-ROUTE .
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Para Clientes con update-resolv-conf
En primer lugar, confirma que tu distribución utiliza update-resolv-conf
.
$ ls /etc/openvpn client server update-resolv-conf
Si tu sistema contiene el archivo update-resolv-conf
, abre el archivo de configuración del Cliente para editarlo.
$ nano client1.ovpn
Descomenta las siguientes líneas del archivo eliminando el punto y coma que las precede.
script-security 2 up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf
Si utilizas una distribución basada en CentOS, cambia la directiva group
de nogroup
a nobody
.
group nobody
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Conectar el cliente
Ejecuta el siguiente comando para conectar el cliente al servidor VPN.
$ sudo openvpn --config client1.ovpn
Deberías obtener un resultado similar.
2023-02-06 15:18:37 OpenVPN 2.5.5 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 14 2022 2023-02-06 15:18:37 library versions: OpenSSL 3.0.2 15 Mar 2022, LZO 2.10 2023-02-06 15:18:37 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts 2023-02-06 15:18:37 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key 2023-02-06 15:18:37 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication 2023-02-06 15:18:37 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key 2023-02-06 15:18:37 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication 2023-02-06 15:18:37 TCP/UDP: Preserving recently used remote address: [AF_INET]64.225.66.226:443 2023-02-06 15:18:37 Socket Buffers: R=[131072->131072] S=[16384->16384] 2023-02-06 15:18:37 Attempting to establish TCP connection with [AF_INET]64.225.66.226:443 [nonblock] 2023-02-06 15:18:38 TCP connection established with [AF_INET]64.225.66.226:443 2023-02-06 15:18:38 TCP_CLIENT link local: (not bound) 2023-02-06 15:18:38 TCP_CLIENT link remote: [AF_INET]64.225.66.226:443 2023-02-06 15:18:38 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay 2023-02-06 15:18:38 TLS: Initial packet from [AF_INET]64.225.66.226:443, sid=b6459c4e 0e23d362 2023-02-06 15:18:38 VERIFY OK: depth=1, CN=Easy-RSA CA 2023-02-06 15:18:38 VERIFY KU OK 2023-02-06 15:18:38 Validating certificate extended key usage 2023-02-06 15:18:38 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication 2023-02-06 15:18:38 VERIFY EKU OK 2023-02-06 15:18:38 VERIFY OK: depth=0, CN=server 2023-02-06 15:18:38 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256 2023-02-06 15:18:38 [server] Peer Connection Initiated with [AF_INET]64.225.66.226:443 2023-02-06 15:18:39 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1) 2023-02-06 15:18:39 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM' 2023-02-06 15:18:39 OPTIONS IMPORT: timers and/or timeouts modified 2023-02-06 15:18:39 OPTIONS IMPORT: --ifconfig/up options modified 2023-02-06 15:18:39 OPTIONS IMPORT: route options modified 2023-02-06 15:18:39 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified 2023-02-06 15:18:39 OPTIONS IMPORT: peer-id set 2023-02-06 15:18:39 OPTIONS IMPORT: adjusting link_mtu to 1626 2023-02-06 15:18:39 OPTIONS IMPORT: data channel crypto options modified 2023-02-06 15:18:39 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key 2023-02-06 15:18:39 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key 2023-02-06 15:18:39 net_route_v4_best_gw query: dst 0.0.0.0 2023-02-06 15:18:39 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3 2023-02-06 15:18:39 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:84:e2:0b 2023-02-06 15:18:39 TUN/TAP device tun0 opened 2023-02-06 15:18:39 net_iface_mtu_set: mtu 1500 for tun0 2023-02-06 15:18:39 net_iface_up: set tun0 up 2023-02-06 15:18:39 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0 2023-02-06 15:18:39 /etc/openvpn/update-systemd-resolved tun0 1500 1626 10.8.0.6 10.8.0.5 init <14>Feb 6 15:18:39 update-systemd-resolved: Link 'tun0' coming up <14>Feb 6 15:18:39 update-systemd-resolved: Adding DNS Routed Domain . <14>Feb 6 15:18:39 update-systemd-resolved: Adding IPv4 DNS Server 208.67.222.222 <14>Feb 6 15:18:39 update-systemd-resolved: Adding IPv4 DNS Server 208.67.220.220 <14>Feb 6 15:18:39 update-systemd-resolved: SetLinkDNS(5 2 2 4 208 67 222 222 2 4 208 67 220 220) <14>Feb 6 15:18:39 update-systemd-resolved: SetLinkDomains(5 1 . true) 2023-02-06 15:18:39 net_route_v4_add: 64.225.66.226/32 via 10.0.2.2 dev [NULL] table 0 metric -1 2023-02-06 15:18:39 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1 2023-02-06 15:18:39 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1 2023-02-06 15:18:39 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1 2023-02-06 15:18:39 GID set to nogroup 2023-02-06 15:18:39 UID set to nobody 2023-02-06 15:18:39 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this 2023-02-06 15:18:39 Initialization Sequence Completed
Abre otro terminal para comprobar la configuración DNS.
$ systemd-resolve --status tun0
Obtendrás la siguiente salida donde puedes ver los servidores DNS que configuramos antes. Esto garantiza que la VPN funciona correctamente.
Link 4 (tun0) Current Scopes: DNS Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported Current DNS Server: 208.67.222.222 DNS Servers: 208.67.222.222 208.67.220.220 DNS Domain: ~.
Puedes seguir verificando la conexión visitando la URL https://whatismyip.com
en tu navegador y verás tu dirección IP y la ubicación de tu servidor OpenVPN.
También puedes seguir verificando realizando una prueba estándar en el sitio web https://www.dnsleaktest.com/
.
Puedes ver los nombres de host OpenDNS que configuramos antes y la ubicación del servidor coincide con la ubicación del servidor OpenVPN.
El comando anterior ejecuta OpenVPN en primer plano, lo que significa que el terminal estará bloqueado. Para cerrar la conexión, debes pulsar Ctrl + C. Sin embargo, también puedes ejecutar OpenVPN en segundo plano. Para ello, utiliza el siguiente comando.
sudo openvpn --config client1.ovpn --daemon
Para cerrar la conexión, busca el ID del proceso.
$ ps aux | grep openvpn
Obtendrás una salida similar.
nobody 4357 0.3 0.0 13468 8432 ? Ss 15:35 0:00 openvpn --config client1.ovpn --daemon username 4406 0.0 0.0 17732 2432 pts/0 S+ 15:35 0:00 grep --color=auto openvpn
Como puedes ver, el ID del proceso correspondiente al proceso OpenVPN es 4357
. Cierra la conexión VPN utilizando el siguiente comando para matar el proceso.
$ sudo kill -9 4357
OpenVPN ofrece clientes GUI para plataformas Windows, macOS, Android e iOS en los que puedes importar el archivo de configuración del cliente para conectarte.
Paso 14 – Revocar certificados de cliente
Si quieres revocar el certificado de un cliente para impedir el acceso, puedes hacerlo accediendo al servidor CA.
Cambia al directorio ~/easy-rsa
.
$ cd ~/easy-rsa
Ejecuta el script con la opción revoke
seguida del nombre del cliente.
$ ./easyrsa revoke client1
Se te preguntará si quieres revocar el certificado.
Please confirm you wish to revoke the certificate with the following subject: subject= commonName = client1 Type the word 'yes' to continue, or any other input to abort. Continue with revocation: yes . . . Revoking Certificate 8348B3F146A765581946040D5C4D590A . . .
Esto revoca el certificado en el servidor CA. Sin embargo, el servidor OpenVPN no tiene forma de comprobar el estado de revocación. Para ello, necesitamos generar una Lista de Revocación de Certificados (CRL) y transferirla al servidor OpenVPN.
Genera la CRL.
$ ./easyrsa gen-crl
Se te pedirá la frase de contraseña de tu CA. El comando anterior genera un archivo crl.pem
.
Copia este archivo en el servidor OpenVPN.
$ scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp
Vuelve a entrar en el servidor OpenVPN y copia el archivo CRL en el directorio /etc/openvpn/server
.
$ sudo cp /tmp/crl.pem /etc/openvpn/server/
Abre el archivo de configuración del servidor OpenVPN para editarlo.
$ sudo nano /etc/openvpn/server/server.conf
Añade la siguiente línea al final del archivo. Esto indica al servidor OpenVPN que compruebe la lista de revocación de los clientes que han sido restringidos.
crl-verify crl.pem
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Reinicia el servidor OpenVPN para aplicar los cambios.
sudo systemctl restart [email protected]
El cliente ya no podrá conectarse al servidor OpenVPN.
Conclusión
Con esto concluye nuestro tutorial sobre la instalación y configuración del servidor OpenVPN en un servidor Ubuntu 22.04. También hemos conectado el cliente OpenVPN Linux al servidor. Si tienes alguna pregunta, publícala en los comentarios a continuación.