Cómo instalar un servidor y un cliente OpenVPN con Easy-RSA 3 en CentOS 8
OpenVPN es una aplicación de código abierto que te permite crear una red privada segura a través de la Internet pública. OpenVPN implementa una red privada virtual (VPN) para crear una conexión segura. OpenVPN utiliza la biblioteca OpenSSL para proporcionar el cifrado y ofrece varios mecanismos de autenticación, como la basada en certificados, las claves precompartidas y la autenticación con nombre de usuario y contraseña.
En este tutorial, te mostraremos cómo instalar y configurar paso a paso OpenVPN en un servidor CentOS 8. Y pondremos en práctica la autenticación OpenVPN basada en certificados.
Requisitos previos
- Servidor CentOS 8
- Privilegios de root
¿Qué vamos a hacer?
- Instalar OpenVPN y Easy-RSA
- Configurar Easy-RSA 3 Vars
- Construir las claves de OpenVPN
- Configurar el servidor OpenVPN
- Configurar Firewalld y habilitar el reenvío de puertos
- Configuración del cliente
- Prueba de
Paso 1 – Instalar OpenVPN y Easy-RSA
En primer lugar, vamos a añadir el repositorio EPEL (Extra Package for Enterprise Linux) e instalar el último paquete de OpenVPN y descargar el script easy-rsa en el sistema CentOS 8.
Instala el repositorio EPEL con el comando dnf que aparece a continuación.
dnf install epel-release
Después, instala el último paquete OpenVPN 2.4.7.
dnf install openvpn
Una vez completada la instalación, ve a ‘/etc/openvpn’ y descarga el script easy-rsa utilizando el comando wget que aparece a continuación.
cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
Ahora extrae el archivo ‘EasyRSA-unix-v3.0.6.tgz’ y renombra el directorio a ‘easy-rsa’.
tar -xf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6/ easy-rsa/; rm -f EasyRSA-unix-v3.0.6.tgz
El paquete OpenVPN y el script easy-rsa se han instalado en el sistema CentOS 8.
Paso 2 – Configurar Easy-RSA 3
En este paso, configuraremos easy-rsa 3 creando un nuevo archivo ‘vars’. El archivo ‘vars’ contiene la configuración de Easy-RSA 3.
Ve al directorio ‘/etc/openvpn/easy-rsa/’ y crea un nuevo script vars utilizando el editor vim.
cd /etc/openvpn/easy-rsa/
vim vars
Pega las configuraciones vars easy-rsa 3 de abajo.
set_var EASYRSA "$PWD"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "ID"
set_var EASYRSA_REQ_PROVINCE "Jakarta"
set_var EASYRSA_REQ_CITY "Jakarta"
set_var EASYRSA_REQ_ORG "hakase-labs CERTIFICATE AUTHORITY"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "HAKASE-LABS EASY CA"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "HAKASE-LABS CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-easyrsa.cnf"
set_var EASYRSA_DIGEST "sha256"
Guarda y sal.
Nota:
- Cambia los valores de las variables según tus necesidades.
- Aumenta el ‘EASYRSA_KEY_SIZE’ para mejorar la seguridad.
- Cambia ‘EASYRSA_CA_EXPIRE’ y ‘EASYRSA_CERT_EXPIRE’.
Ahora haz que el archivo ‘vars’ sea ejecutable cambiando el permiso del archivo.
chmod +x vars
La configuración de easy-rsa 3 se ha completado.
Paso 3 – Construir las claves OpenVPN
En este paso, construiremos las claves OpenVPN basándonos en el archivo ‘vars’ de easy-rsa 3 que hemos creado. Construiremos la clave de la CA, las claves del Servidor y del Cliente, el DH y el archivo PEM de la CRL.
Construiremos todas esas claves utilizando la línea de comandos ‘easyrsa’. Ve al directorio ‘/etc/openvpn/easy-rsa/’.
cd /etc/openvpn/easy-rsa/3/
– Inicialización y construcción de la CA
Antes de construir la clave del servidor y del cliente, tenemos que inicializar el directorio PKI (Infraestructura de Clave Pública) y construir la clave CA.
Inicializa el directorio de la PKI y construye la clave de la CA utilizando el siguiente comando.
./easyrsa init-pki
./easyrsa build-ca
Ahora escribe la contraseña de tu clave CA y obtendrás tus archivos ‘ca.crt’ y ‘ca.key’ en el directorio ‘pki’.
– Construir la clave del servidor
Ahora queremos construir la clave del servidor, y construiremos la clave del servidor llamada ‘hakase-server’.
Construye la clave del servidor ‘hakase-server’ utilizando el siguiente comando.
./easyrsa gen-req hakase-server nopass
Nota:
- nopass = opción para desactivar la contraseña de la clave ‘hakase-servidor’.
Y firma la clave ‘hakase-servidor’ utilizando nuestro certificado de CA.
./easyrsa sign-req server hakase-server
Se te pedirá la contraseña de la ‘CA’, escribe la contraseña y pulsa Intro. Y obtendrás el archivo de certificado ‘hakase-server.crt’ en el directorio ‘pki/issued/’.
Verifica el archivo de certificado con el comando OpenSSL y asegúrate de que no hay ningún error.
openssl verify -CAfile pki/ca.crt pki/issued/hakase-server.crt
Se han creado todas las claves del certificado del servidor. La clave privada del servidor se encuentra en el archivo ‘pki/private/hakase-server.key’, y el certificado del servidor en el archivo ‘pki/issued/hakase-server.crt’.
– Construir la clave del cliente
Ahora tenemos que construir las claves para el cliente. Generaremos una nueva clave de cliente llamada ‘cliente01’.
Genera la clave ‘client01’ utilizando el siguiente comando.
./easyrsa gen-req client01 nopass
Ahora firma la clave ‘client01’ utilizando nuestro certificado de la CA como se indica a continuación.
./easyrsa sign-req client client01
Escribe «sí» para confirmar la solicitud del certificado de cliente, y luego escribe la contraseña de la CA.
El certificado de cliente llamado ‘client01’ ha sido generado, verifica el certificado de cliente utilizando el comando openssl.
openssl verify -CAfile pki/ca.crt pki/issued/client01.crt
Asegúrate de que no hay ningún error.
– Construye la clave Diffie-Hellman
La clave Diffie-Hellman es necesaria para mejorar la seguridad. Y vamos a generar la clave DH ‘2048’ basándonos en el archivo de configuración ‘vars’ que se ha creado en la parte superior.
Genera la clave Diffie-Hellman con el siguiente comando.
./easyrsa gen-dh
Y se ha generado la clave DH, situada en el directorio ‘pki’.
– Opcional: Generar la clave CRL
La clave CRL (Certificate Revoking List) se utilizará para revocar la clave del cliente. Si tienes varios certificados de clientes en tu servidor VPN, y quieres eliminar alguna clave, sólo tienes que revocar utilizando el comando easy-rsa.
Si quieres revocar alguna clave, ejecuta el siguiente comando.
./easyrsa revoke someone
Y luego genera la clave CRL.
./easyrsa gen-crl
El archivo CRL PEM se ha generado en el directorio ‘pki’ – el siguiente es un ejemplo en mi servidor.
– Copiar los archivos de los certificados
Se han generado todos los certificados, ahora copia los archivos de certificado y los archivos PEM.
Copia la clave y el certificado del servidor.
cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/hakase-server.crt /etc/openvpn/server/
cp pki/private/hakase-server.key /etc/openvpn/server/
Copia la clave y el certificado del cliente01.
cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/client01.crt /etc/openvpn/client/
cp pki/private/client01.key /etc/openvpn/client/
Copia la clave DH y CRL.
cp pki/dh.pem /etc/openvpn/server/
cp pki/crl.pem /etc/openvpn/server/
Todos los certificados del servidor y del cliente se han copiado en cada directorio.
Paso 4 – Configurar OpenVPN
En este paso, crearemos una nueva configuración ‘server.conf’ para el servidor OpenVPN.
Ve al directorio ‘/etc/openvpn/server/’ y crea un nuevo archivo de configuración ‘server.conf’ utilizando vim.
cd /etc/openvpn/server/
vim server.conf
Pega allí la siguiente configuración del servidor OpenVPN.
# OpenVPN Port, Protocol, and the Tun
port 1194
proto udp
dev tun
# OpenVPN Server Certificate - CA, server key and certificate
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/hakase-server.crt
key /etc/openvpn/server/hakase-server.key
#DH and CRL key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem
# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.5.0.0 255.255.255.0
push "redirect-gateway def1"
# Using the DNS from https://dns.watch
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"
#Enable multiple clients to connect with the same certificate key
duplicate-cn
# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
# Other Configuration
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
# OpenVPN Log
log-append /var/log/openvpn.log
verb 3
Guarda y sal.
Y la configuración del servidor OpenVPN ha sido creada.
Paso 5 – Habilitar el reenvío de puertos y configurar el enrutamiento en Firewalld
En este paso, habilitaremos el módulo del núcleo de reenvío de puertos y configuraremos el enrutamiento ‘Firewalld’ para OpenVPN.
Habilita el módulo del núcleo de reenvío de puertos ejecutando los siguientes comandos.
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
A continuación, configura el enrutamiento mediante el Firewalld para OpenVPN.
Añade el servicio OpenVPN a la zona del cortafuegos «pública» y «de confianza».
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
Después, añade el ‘tun0’ a la zona ‘de confianza’.
firewall-cmd --permanent --zone=trusted --add-interface=tun0
Ahora activa «MASQUERADE» en el cortafuegos de la zona «pública» por defecto.
firewall-cmd --permanent --add-masquerade
Activa el NAT para la dirección IP interna de OpenVPN ‘10.5.0.0/24’ a la dirección IP externa ‘SERVERIP’.
SERVERIP=$(ip route get 1.1.1.1 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.5.0.0/24 -o $SERVERIP -j MASQUERADE
Y recarga firewalld.
firewall-cmd --reload
Una vez completada la configuración del reenvío de puertos y del enrutamiento de Firewalld, inicia el servicio OpenVPN y habilítalo para que se inicie automáticamente cada vez que se inicie el sistema.
systemctl start openvpn-server@server
systemctl enable openvpn-server@server
Después, comprueba el servicio OpenVPN con los siguientes comandos.
netstat -plntu
systemctl status openvpn-server@server
Y obtendrás el resultado que se indica a continuación.
El resultado es que el servicio OpenVPN está funcionando en el protocolo UDP con el puerto por defecto «1194».
Paso 6 – Configuración del cliente OpenVPN
Ve al directorio ‘/etc/openvpn/client’ y crea un nuevo archivo de configuración del cliente openvpn ‘client01.ovpn’ utilizando vim.
cd /etc/openvpn/client
vim client01.ovpn
Pega allí la siguiente configuración del cliente OpenVPN.
client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
ca ca.crt
cert client01.crt
key client01.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
Guarda y sal.
Ahora comprime el directorio ‘/etc/openvpn/client’ en un archivo ‘zip’ o ‘tar.gz’ y descarga el archivo comprimido utilizando SCP desde tu ordenador local.
Comprime el directorio ‘/etc/openvpn/client’ en el archivo ‘client01.tar.gz’.
cd /etc/openvpn/
tar -czvf client01.tar.gz client/*
Ahora puedes descargar el archivo comprimido de OpenVPN utilizando el servidor FTP o el comando scp como se indica a continuación.
scp [email protected]:/etc/openvpn/client01.tar.gz .
Paso 7 – Conéctate al OpenVPN
Prueba en los clientes.
– En Linux
Instala el paquete OpenVPN y, si quieres una configuración de interfaz gráfica, instala el gestor de red OpenVPN.
sudo apt install openvpn network-manager-openvpn network-manager-openvpn-gnome -y
Si quieres conectarte utilizando un shell de terminal, ejecuta el siguiente comando OpenVPN.
openvpn --config client01.ovpn
Cuando estés conectado a OpenVPN, abre una nueva pestaña de terminal y comprueba la conexión mediante el comando curl.
curl ifconfig.io
Y obtendrás la dirección IP del servidor OpenVPN.
– En Mac OS
Descarga Tunnelblick e instálalo.
Extrae el archivo ‘client01.tar.gz’ y cambia el nombre del directorio ‘client’ por el de ‘client01.tblk’.
tar -xzvf client01.tar.gz
mv client client01.tblk
Haz doble clic en «client01.tblk» y Tunnelblick detectará automáticamente la configuración de OpenVPN y la importará.
Ahora conéctate a través del Tunnelblick en la barra superior.
– En Windows
Descarga el cliente openvpn para windows e importa la configuración.