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 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. 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.
También puedes seguir verificándolo realizando una prueba estándar en el sitio web https://www.dnsleaktest.com/
.
Puedes ver los nombres de host OpenDNS que configuramos antes y la ubicación del servidor coincide con la ubicación del servidor OpenVPN.
El comando anterior ejecuta OpenVPN en primer plano, lo que significa que el terminal estará bloqueado. Para cerrar la conexión, debes pulsar Ctrl + C. Sin embargo, también puedes ejecutar OpenVPN en segundo plano. Para ello, utiliza el siguiente comando.
sudo openvpn --config client1.ovpn --daemon
Para cerrar la conexión, busca el ID del proceso.
$ ps aux | grep openvpn
Obtendrás una salida similar.
nobody 4357 0.3 0.0 13468 8432 ? Ss 15:35 0:00 openvpn --config client1.ovpn --daemon username 4406 0.0 0.0 17732 2432 pts/0 S+ 15:35 0:00 grep --color=auto openvpn
Como puedes ver, el ID del proceso correspondiente al proceso OpenVPN es 4357
. Cierra la conexión VPN utilizando el siguiente comando para matar el proceso.
$ sudo kill -9 4357
OpenVPN ofrece clientes GUI para plataformas Windows, macOS, Android e iOS en los que puedes importar el archivo de configuración del cliente para conectarte.
Paso 14 – Revocar certificados de cliente
Si quieres revocar el certificado de un cliente para impedir el acceso, puedes hacerlo accediendo al servidor CA.
Cambia al directorio ~/easy-rsa
.
$ cd ~/easy-rsa
Ejecuta el script con la opción revoke
seguida del nombre del cliente.
$ ./easyrsa revoke client1
Se te preguntará si quieres revocar el certificado.
Please confirm you wish to revoke the certificate with the following subject: subject= commonName = client1 Type the word 'yes' to continue, or any other input to abort. Continue with revocation: yes . . . Revoking Certificate 8348B3F146A765581946040D5C4D590A . . .
Esto revoca el certificado en el servidor CA. Sin embargo, el servidor OpenVPN no tiene forma de comprobar el estado de revocación. Para ello, necesitamos generar una Lista de Revocación de Certificados (CRL) y transferirla al servidor OpenVPN.
Genera la CRL.
$ ./easyrsa gen-crl
Se te pedirá la frase de contraseña de tu CA. El comando anterior genera un archivo crl.pem
.
Copia este archivo en el servidor OpenVPN.
$ scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp
Vuelve a entrar en el servidor OpenVPN y copia el archivo CRL en el directorio /etc/openvpn/server
.
$ sudo cp /tmp/crl.pem /etc/openvpn/server/
Abre el archivo de configuración del servidor OpenVPN para editarlo.
$ sudo nano /etc/openvpn/server/server.conf
Añade la siguiente línea al final del archivo. Esto indica al servidor OpenVPN que compruebe la lista de revocación de los clientes que han sido restringidos.
crl-verify crl.pem
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Reinicia el servidor OpenVPN para aplicar los cambios.
sudo systemctl restart [email protected]
El cliente ya no podrá conectarse al servidor OpenVPN.
Conclusión
Con esto concluye nuestro tutorial sobre la instalación y configuración del servidor OpenVPN en un servidor 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.