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 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
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.
También puedes seguir verificándolo realizando una prueba estándar en el sitio web https://www.dnsleaktest.com/
.
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.