Cómo instalar y configurar un servidor OpenVPN en Rocky Linux 9

Una Red Privada Virtual (VPN) te permite acceder a Internet enmascarando tu ubicación, lo que te da libertad para 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 Rocky Linux 9 y 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 Rocky Linux 9 que admita conexiones IPv4 e IPv6. Nos referiremos a él como el servidor OpenVPN. El cortafuegos Firewalld debe estar activado y ejecutándose en él.
  • Un servidor con Rocky Linux 9 que admita conexiones IPv4 e IPv6. Lo configuraremos como una Autoridad de Certificación (AC) privada, a la que nos referiremos como servidor AC.
  • 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 Rocky Linux 9 para el tutorial.
  • Todo está actualizado en OpenVPN y el servidor CA.
    $ sudo dnf update
    

Paso 1 – Configurar el servidor CA

Una Autoridad de Certificación (AC) 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.

Pero antes, tenemos que habilitar el repositorio EPEL que contiene el paquete easy-rsa.

$ sudo dnf install epel-release

Instala Easy-RSA.

$ sudo dnf 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 CA.

$ mkdir ~/easy-rsa

Crea enlaces simbólicos que apunten a los archivos del paquete easy-rsa instalado.

$ ln -s /usr/share/easy-rsa/3/* ~/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. También se te pedirá una frase de contraseña PEM. Elige una frase de contraseña fuerte para ambas, 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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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 archivo ca.key, tendrás que destruir tu CA. Por eso, tu archivo ca.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. Instala también el repositorio EPEL antes que ellos.

$ sudo dnf install epel-release
$ sudo dnf 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/3/* ~/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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
.....+.................+.+.....+....+........+...+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+.+...+..+......+...+....+.....+...+.........+......+.......+...+.....+.......+.....+.....................+.+...+...+...............+........+..........+......+.....+...+.......+........+.+...........+...+.+.....+......+.+...+.........+...+........+.+...........+...+....+..+...+............+.............+.....+...+.......+...+...+...........+.+..+.......+.....+...................+..+...+......+....+..+.......+......+......+......+..+......+....+............+...............+.....+..........+...+..+....+..+.........+....+...............+..............+.......+...+..+...+......+.+....................................+........+....+...+...+.........+.....+.+..+...+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
................+...+....+............+...+...+.....+...+....+...............+......+.....+....+.....+.+.........+...+.................+......+.........+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+...+..+.......+..+...+.+.....+.........+.+..+....+...+.....+......+.......+.........+........+......+.+.....+.+............+..+..........+........+.+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.........+...+..+.+........+....+..+......+....+.........+..+............+...+...+.........+.............+..+...+...+.+......+.....+....+.....+.+...+..............................+......+........+..........+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)

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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)


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-5673.9KntVf/tmp.P5JqSD
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
802BB2829D7F0000: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 12 01:34:35 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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
........+.+.........+.........+...+...+..+.........+......+...+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+..+...+....+........+.......+........+............+...+......+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+...............+..........+......+......+.....+....+...........+.+..+......+.+.....................+.........+.........+..+.........+..+...+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+.....+.+..................+...........+...+.+............+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+.....+.+.........+...+..+.........+....+..+..................+.+......+...+...+.....+...+......+..........+........+...+...+......+...+...+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+.....+.......+........+.......+........+.+.........+...........+.......+...............+.....+....+.........+.....+.+...+........+...+.+...+..+.+........+............+.........+.+.........+.....+.++.......+.....+.......+.....+....+......+.....+.............+...........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)

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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)


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-5908.XM2MNt/tmp.SGLqAt
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 12 01:41:45 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/sample/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 compendio 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 nobody

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, descoméntala eliminando el punto y coma, y cambia su valor.

port 443

Busca la línea proto udp y coméntala añadiendo un punto y coma delante de ella. 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  # This file should be kept secret

Cambiar la ubicación del archivo de registro para SELinux

Busca la línea status openvpn-status.log y cámbiala por lo siguiente.

status /var/log/openvpn-status.log

Por defecto, el servidor OpenVPN genera y almacena el registro en el directorio /run/openvpn/openvpn-status.log, lo que causa problemas si SELinux está activado. La solución fácil es cambiar la ubicación al directorio de registro del sistema.

Cuando 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 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

Hemos instalado y configurado OpenVPN, pero no lo hemos configurado para gestionar el tráfico entrante del cliente. Para ello necesitamos configurar el Cortafuegos.

Primero, comprueba las zonas activas en tu Cortafuegos firewalld.

$ sudo firewall-cmd --get-active-zones

Recibirás una salida similar.

public
  interfaces: eth0 eth1

Si no ves la interfaz tun0 como zona trusted, ejecuta los siguientes comandos para añadir el servidor a esa zona.

$ sudo firewall-cmd --zone=trusted --add-interface=tun0
$ sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0

A continuación, añade el servicio OpenVPN a la lista de servicios permitidos dentro de la zona activa. A continuación, haz que la configuración sea permanente.

$ sudo firewall-cmd --permanent --add-service openvpn
$ sudo firewall-cmd --permanent --zone=trusted --add-service openvpn

Recarga el Cortafuegos para aplicar los cambios.

$ sudo firewall-cmd --reload

Confirma que se ha añadido el servicio OpenVPN.

$ sudo firewall-cmd --list-services --zone=trusted
openvpn

A continuación, tenemos que añadir una regla de enmascaramiento al cortafuegos. Esto permite al servidor OpenVPN traducir las direcciones de los clientes a la dirección pública del servidor, y luego hacer lo contrario con el tráfico enviado de vuelta a los clientes. Este proceso también se denomina Traducción de Direcciones de Red (NAT).

Añade reglas de enmascaramiento con los siguientes comandos.

$ sudo firewall-cmd --add-masquerade
$ sudo firewall-cmd --add-masquerade --permanent

Confirma que la mascarada se ha añadido correctamente.

$ sudo firewall-cmd --query-masquerade
yes

Por último, crea la regla de enmascaramiento específica para la subred OpenVPN. Para ello, crea una variable shell (DEVICE en nuestro tutorial) que represente la interfaz de red primaria utilizada por el servidor y, a continuación, utiliza esa variable para añadir permanentemente la regla de enrutamiento.

$ DEVICE=$(ip route | awk '/^default via/ {print $5}')
$ sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE

Por último, abre el puerto establecido anteriormente para OpenVPN.

$ sudo firewall-cmd --permanent --add-port=443/tcp

Recarga el cortafuegos para aplicar el cambio.

$ sudo firewall-cmd --reload

Paso 11 – Iniciar OpenVPN

Activa 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 (/usr/lib/systemd/system/[email protected]; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2023-02-07 02:09:36 UTC; 13s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 4789 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 4443)
     Memory: 1.7M
        CPU: 21ms
     CGroup: /system.slice/system-openvpn\x2dserver.slice/[email protected]
             ??4789 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf

Feb 07 02:09:36 openvpn-server openvpn[4789]: Listening for incoming TCP connection on [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link remote: [AF_UNSPEC]
Feb 07 02:09:36 openvpn-server openvpn[4789]: GID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: UID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: multi_init called, r=256 v=256
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL LIST
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: TCP INIT maxclients=1024 maxevents=1028
Feb 07 02:09:36 openvpn-server openvpn[4789]: 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/sample/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.

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody

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

Crea un script para compilar la configuración base con los archivos pertinentes de certificado, clave y cifrado, 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 Rocky Linux 9. Instala OpenVPN mediante el siguiente comando.

$ sudo dnf install openvpn

Ejecuta el siguiente comando para conectar el cliente al servidor VPN.

$ sudo openvpn --config client1.ovpn

Deberías obtener un resultado similar.

2023-02-07 11:42:05 OpenVPN 2.5.8 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov  1 2022
2023-02-07 11:42:05 library versions: OpenSSL 3.0.1 14 Dec 2021, LZO 2.10
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 TCP/UDP: Preserving recently used remote address: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-02-07 11:42:05 Attempting to establish TCP connection with [AF_INET]142.93.225.189:443 [nonblock]
2023-02-07 11:42:05 TCP connection established with [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 TCP_CLIENT link local: (not bound)
2023-02-07 11:42:05 TCP_CLIENT link remote: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-02-07 11:42:05 TLS: Initial packet from [AF_INET]142.93.225.189:443, sid=7c9feddd a75e1d1f
2023-02-07 11:42:06 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-02-07 11:42:06 VERIFY KU OK
2023-02-07 11:42:06 Validating certificate extended key usage
2023-02-07 11:42:06 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-02-07 11:42:06 VERIFY EKU OK
2023-02-07 11:42:06 VERIFY OK: depth=0, CN=server
2023-02-07 11:42:06 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256
2023-02-07 11:42:06 [server] Peer Connection Initiated with [AF_INET]142.93.225.189:443
2023-02-07 11:42:06 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-07 11:42:06 OPTIONS IMPORT: timers and/or timeouts modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ifconfig/up options modified
2023-02-07 11:42:06 OPTIONS IMPORT: route options modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-02-07 11:42:06 OPTIONS IMPORT: peer-id set
2023-02-07 11:42:06 OPTIONS IMPORT: adjusting link_mtu to 1626
2023-02-07 11:42:06 OPTIONS IMPORT: data channel crypto options modified
2023-02-07 11:42:06 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 net_route_v4_best_gw query: dst 0.0.0.0
2023-02-07 11:42:06 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-02-07 11:42:06 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:fd:d4:94
2023-02-07 11:42:06 TUN/TAP device tun0 opened
2023-02-07 11:42:06 net_iface_mtu_set: mtu 1500 for tun0
2023-02-07 11:42:06 net_iface_up: set tun0 up
2023-02-07 11:42:06 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-02-07 11:42:06 net_route_v4_add: 142.93.225.189/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 GID set to nobody
2023-02-07 11:42:06 UID set to nobody
2023-02-07 11:42:06 Initialization Sequence Completed

Puedes verificar 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.

Salida de WhatisMyIP

También puedes seguir verificándolo realizando una prueba estándar en el sitio web https://www.dnsleaktest.com/.

Prueba estándar de fuga DNS

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 Rocky Linux 9. También hemos conectado el cliente OpenVPN Linux al servidor. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...