Cómo instalar y configurar un servidor OpenVPN en Debian 12

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 Debian 12 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 Debian 12 que admita conexiones IPv4 e IPv6. Nos referiremos a él como el servidor OpenVPN. El Cortafuegos sin complicaciones (UFW) está activado y funcionando en él.
  • Un servidor que ejecuta Debian 12 y admite 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 Debian 12 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 (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.

$ 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.

* Notice:

  init-pki complete; you may now create a CA or requests.

  Your newly created PKI dir is:
  * /home/<username>/easy-rsa/pki

* Notice:
  IMPORTANT: Easy-RSA 'vars' file has now been moved to your PKI above.

Paso 1.3 – Crear una Autoridad de Certificación

Antes de que puedas crear la clave privada y el certificado de tu CA, tienes que configurar la información de la organización para ella. El archivo de configuración vars ya está creado en el directorio pki. Ábrelo para editarlo.

$ cd ~/easy-rsa
$ nano pki/vars

Busca las siguientes variables y descoméntalas eliminando la almohadilla(#) que hay delante y editándolas como se muestra a continuación.

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 pida.

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. A continuación, se te pedirá una frase de contraseña PEM. 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.

* Notice:
Using Easy-RSA configuration from: /home/<username>/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)


Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Using configuration from /home/<username>/easy-rsa/pki/ab18123c/temp.918764ef
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]:

* Notice:

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/private/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.

$ 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

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 tu servidor CA tienen directorios PKI separados.

$ cd ~/easy-rsa
$ ./easyrsa init-pki

La PKI del servidor OpenVPN se utiliza como lugar centralizado para almacenar las solicitudes de certificados y los certificados públicos.

Abre el directorio ~/easy-rsa/pki/vars para almacenar la información necesaria para crear la PKI y ábrelo para editarlo.

$ nano pki/vars

Busca las siguientes variables y descoméntalas eliminando la almohadilla (#) que aparece delante de ellas y cambiando sus valores como se indica a continuación.

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

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 el 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.

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.

* Notice:
Using Easy-RSA configuration from: /home/<username>/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)

-----
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]:
* Notice:

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.

* Notice:
Using Easy-RSA configuration from: /home/navjot/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)

* Notice:

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.

* Notice:
Using Easy-RSA configuration from: /home/navjot/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)


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/de50cb3f/temp.93caaa8c
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
00F7EDB7: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 Nov 10 07:48:56 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

* Notice:
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 una clave Diffie-Hellman fuerte para utilizarla durante el intercambio de claves utilizando el siguiente comando.

$ ./easyrsa gen-dh

Genera la clave precompartida tls-crypt. Esto creará un archivo llamado ta.key

$ sudo openvpn --genkey secret ta.key

Copia el ta.key al directorio /etc/openvpn/server.

$ sudo cp ta.key /etc/openvpn/server
$ sudo cp pki/dh.pem /etc/openvpn/server

Paso 7 – Generar un certificado de cliente y un par de claves

Crea un directorio en tu servidor VPN 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.

* Notice:
Using Easy-RSA configuration from: /home/<username>/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)

-----
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]:
* Notice:

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.

* Notice:
Using Easy-RSA configuration from: /home/<username>/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)

* Notice:

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.

* Notice:
Using Easy-RSA configuration from: /home/<username>/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)


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/7bf6e9b1/temp.c01d673d
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 Nov 10 08:25:10 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

* Notice:
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.

$ sudo 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 openvpn y ;group openvpn y cámbialas como se muestra.

user nobody
group nogroup

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
vm.swappiness = 0
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 69.28.90.1 dev ens3 onlink

Esto nos indica que el nombre de la interfaz es ens3. 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 ens3 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o ens3 -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 solicite.

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

Inicia el servicio OpenVPN.

$ sudo systemctl start [email protected]

Comprueba el estado del servicio.

$ sudo systemctl status [email protected]

Recibirás un resultado similar.

? [email protected] - OpenVPN service for server
     Loaded: loaded (/lib/systemd/system/[email protected]; disabled; preset: enabled)
     Active: active (running) since Tue 2023-08-08 09:22:49 UTC; 7s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 4531 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 2315)
     Memory: 1.4M
        CPU: 27ms
     CGroup: /system.slice/system-openvpn\x2dserver.slice/[email protected]
             ??4531 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf

Aug 08 09:22:49 vpnserver openvpn[4531]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443
Aug 08 09:22:49 vpnserver openvpn[4531]: TCPv4_SERVER link remote: [AF_UNSPEC]
Aug 08 09:22:49 vpnserver openvpn[4531]: UID set to nobody
Aug 08 09:22:49 vpnserver openvpn[4531]: GID set to nogroup
Aug 08 09:22:49 vpnserver openvpn[4531]: Capabilities retained: CAP_NET_ADMIN
Aug 08 09:22:49 vpnserver openvpn[4531]: MULTI: multi_init called, r=256 v=256
Aug 08 09:22:49 vpnserver openvpn[4531]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62
Aug 08 09:22:49 vpnserver openvpn[4531]: IFCONFIG POOL LIST
Aug 08 09:22:49 vpnserver openvpn[4531]: MULTI: TCP INIT maxclients=1024 maxevents=1029
Aug 08 09:22:49 vpnserver openvpn[4531]: Initialization Sequence Completed

Habilita el servicio OpenVPN para que se inicie al arrancar.

$ sudo systemctl -f enable [email protected]

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 descomentándolo y comentando la configuración proto udp.

proto tcp

Descomenta las directivas user y group eliminando el punto y coma que las precede. Además, cambia los valores como se indica a continuación.

# 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 la configuración cipher que estableciste en el archivo `/etc/openvpn/server/server.conf. Añade también la configuración auth al final del archivo.

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 unas cuantas líneas comentadas para gestionar los distintos métodos utilizados por 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=/home/<username>/client-configs/keys
OUTPUT_DIR=/home/<username>/client-configs/files
BASE_CONFIG=/home/<username>/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 Debian 12. 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.

# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4

Si el sistema utiliza 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 cualquier otra que 127.0.0.53, entonces el sistema no está utilizando systemd-resolved y necesitas seguir los pasos que se mencionan más adelante.

Pero antes, descarga el archivo client1.ovpn del servidor utilizando el siguiente comando.

$ scp username@your_server_ip:/home/<username>/client-configs/files/client1.ovpn

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

Este es el paso que debes seguir si tienes un sistema Debian. 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 una salida similar.

2023-08-08 16:23:29 Note: Kernel support for ovpn-dco missing, disabling data channel offload.
2023-08-08 16:23:29 OpenVPN 2.6.3 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
2023-08-08 16:23:29 library versions: OpenSSL 3.0.9 30 May 2023, LZO 2.10
2023-08-08 16:23:29 DCO version: N/A
2023-08-08 16:23:29 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
2023-08-08 16:23:29 TCP/UDP: Preserving recently used remote address: [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-08-08 16:23:29 Attempting to establish TCP connection with [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 TCP connection established with [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 TCPv4_CLIENT link local: (not bound)
2023-08-08 16:23:29 TCPv4_CLIENT link remote: [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-08-08 16:23:29 TLS: Initial packet from [AF_INET]69.28.91.204:443, sid=6bd67e12 50ebf8bc
2023-08-08 16:23:30 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-08-08 16:23:30 VERIFY KU OK
2023-08-08 16:23:30 Validating certificate extended key usage
2023-08-08 16:23:30 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-08-08 16:23:30 VERIFY EKU OK
2023-08-08 16:23:30 VERIFY OK: depth=0, CN=server
2023-08-08 16:23:30 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 384 bit ECsecp384r1, signature: ecdsa-with-SHA512
2023-08-08 16:23:30 [server] Peer Connection Initiated with [AF_INET]69.28.91.204:443
2023-08-08 16:23:30 TLS: move_session: dest=TM_ACTIVE src=TM_INITIAL reinit_src=1
2023-08-08 16:23:30 TLS: tls_multi_process: initial untrusted session promoted to trusted
2023-08-08 16:23:31 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
2023-08-08 16:23:31 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,protocol-flags cc-exit tls-ekm dyn-tls-crypt,tun-mtu 1500'
2023-08-08 16:23:31 OPTIONS IMPORT: --ifconfig/up options modified
2023-08-08 16:23:31 OPTIONS IMPORT: route options modified
2023-08-08 16:23:31 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-08-08 16:23:31 OPTIONS IMPORT: tun-mtu set to 1500
2023-08-08 16:23:31 net_route_v4_best_gw query: dst 0.0.0.0
2023-08-08 16:23:31 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-08-08 16:23:31 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:b7:cc:29
2023-08-08 16:23:31 TUN/TAP device tun0 opened
2023-08-08 16:23:31 net_iface_mtu_set: mtu 1500 for tun0
2023-08-08 16:23:31 net_iface_up: set tun0 up
2023-08-08 16:23:31 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-08-08 16:23:31 /etc/openvpn/update-resolv-conf tun0 1500 0 10.8.0.6 10.8.0.5 init
2023-08-08 16:23:31 net_route_v4_add: 69.28.91.204/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 UID set to nobody
2023-08-08 16:23:31 GID set to nogroup
2023-08-08 16:23:31 Capabilities retained: CAP_NET_ADMIN
2023-08-08 16:23:31 Initialization Sequence Completed
2023-08-08 16:23:31 Data Channel: cipher 'AES-256-GCM', peer-id: 0
2023-08-08 16:23:31 Timers: ping 10, ping-restart 120
2023-08-08 16:23:31 Protocol options: protocol-flags cc-exit tls-ekm dyn-tls-crypt

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 las direcciones IP de Google debido a las direcciones IP que obtuvimos del archivo resolv.conf en el cliente y su ubicación está en EE.UU., que coincide con la ubicación del servidor OpenVPN que utilizamos.

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.

* Notice:
Using Easy-RSA configuration from: /home/navjot/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)


  Please confirm you wish to revoke the certificate
  with the following subject:

  subject=
    commonName                = client1

  serial-number: A38D324EC106628F53D1ADFCF8F2D706


Type the word 'yes' to continue, or any other input to abort.
    Continue with revocation: yes

Si tu clave privada de la CA estaba protegida con una frase de contraseña, introdúcela cuando se te solicite.

Using configuration from /home/<username>/easy-rsa/pki/a02dc925/temp.0b5d5ab5
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
Revoking Certificate A38D324EC106628F53D1ADFCF8F2D706.
Data Base Updated

* Notice:

IMPORTANT!!!

Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.

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.

* Notice:
Using Easy-RSA configuration from: /home/<username>/easy-rsa/pki/vars

* Notice:
Using SSL: openssl OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)

Using configuration from /home/<username>/easy-rsa/pki/bce6b789/temp.522aebf7
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:

* Notice:

An updated CRL has been created.
CRL file: /home/<username>/easy-rsa/pki/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 Debian 12. 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...