Una red privada virtual (VPN), le permite atravesar redes no fiables como si estuviese en una red privada. Le permite acceder a internet de forma segura desde su smartphone o equipo portátil cuando se conecta a una red no fiable, como la WiFi de un hotel o de una cafetería.
Cuando se combina con conexiones HTTPS, esta configuración le permite proteger los inicios de sesión y las operaciones que realiza por medios inalámbricos. Puede evadir censuras y restricciones geográficas, y proteger su ubicación y el tráfico de HTTP no cifrado contra la actividad de las redes no fiables.
OpenVPN es una solución VPN de seguridad en la capa de transporte (TLS) de código abierto y con características completas que aloja muchas configuraciones. En este tutorial, configurará OpenVPN en un servidor CentOS 8 y, luego, lo configurará para que sea accesible desde la máquina de un cliente.
Nota: Si planea configurar un servidor de OpenVPN en un Droplet de DigitalOcean tenga en cuenta que, como muchos proveedores de host, cobraremos por excesos de ancho de banda. Por este motivo, controle el volumen de tráfico que maneja su servidor.
Consulte esta página para obtener más información.
Para este tutorial, necesitará lo siguiente:
Nota: Si bien es técnicamente posible usar su servidor de OpenVPN o su máquina local como CA, no se recomienda, dado que expone su VPN a algunas vulnerabilidades de seguridad. Según la documentación oficial de OpenVPN, debería colocar su CA en una máquina independiente dedicada a importar y firmar solicitudes de certificado. Por ello, esta guía presupone que su CA está en un servidor separado de CentOS 8 que también tiene un non-root user con privilegios sudo y firewall básico habilitado.
Además de eso, necesitará una máquina de cliente que usará para conectarse a su servidor de OpenVPN. En esta guía, lo llamaremos Cliente de OpenVPN. A los efectos de este tutorial, le recomendamos que use su máquina local como el cliente de OpenVPN.
Una vez implementados estos requisitos previos, estará listo para comenzar a instalar y configurar un servidor de OpenVPN en CentOS 8.
Nota: Tenga en cuenta que si deshabilita la autenticación de contraseña mientras configura estos servidores, es posible que experimente dificultades al transferir archivos entre ellos más adelante en esta guía. Para solucionar este problema, puede volver a habilitar la autenticación de contraseña en cada servidor. De manera alternativa, puede generar un par de claves SSH para cada servidor, luego agregar la clave SSH pública del servidor de OpenVPN al archivo authorized_keys
y viceversa. Consulte Cómo configurar claves SSH en CentOS 8 para obtener instrucciones sobre cómo aplicar cualquiera de estas soluciones.
El primer paso de este tutorial es instalar OpenVPN y Easy-RSA. Easy-RSA es una herramienta de gestión de infraestructura de clave pública (PKI) que usará en el servidor de OpenVPN para generar una solicitud de certificado que, luego, verificará y firmará en el servidor CA.
Sin embargo, OpenVPN y Easy-RSA no vienen predeterminadas en CentOS 8, por lo que deberá habilitar el repositorio Extra Packages for Enterprise Linux (EPEL). El Proyecto Fedora gestiona el EPEL, que contiene paquetes no estándar, pero populares, para Fedora, CentOS y otras distribuciones de Linux que usan el formato de paquete RPM. Inicie sesión en su servidor de OpenVPN como el non-root sudo user que creó durante los pasos de configuración iniciales y ejecute lo siguiente:
- sudo dnf install epel-release
- sudo dnf install openvpn easy-rsa
A continuación, deberá crear un directorio nuevo en el servidor de OpenVPN como su non-root user llamado ~/easy-rsa
:
- mkdir ~/easy-rsa
Ahora, deberá crear un symlink desde la secuencia de comandos de easyrsa
que el paquete instaló en el directorio ~/easy-rsa
que acaba de crear:
- ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
Nota: Aunque otras guías le indiquen que copie los archivos del paquete easy-rsa
a su directorio de la PKI, en este tutorial, usaremos enlaces simbólicos. Como resultado, toda actualización del paquete easy-rsa
se reflejará automáticamente en las secuencias de comandos de su PKI.
Por último, asegúrese de que el propietario del directorio sea su non-root sudo user y restrinja el acceso a ese usuario usando chmod
:
- sudo chown sammy ~/easy-rsa
- chmod 700 ~/easy-rsa
Cuando haya instalado estos programas y se hayan movido a las ubicaciones correctas en su sistema, el siguiente paso es crear una infraestructura de clave pública (PKI) en el servidor de OpenVPN para que pueda solicitar y administrar certificados TLS para clientes y otros servidores que se conecten a su VPN.
Antes de poder crear la clave y el certificado privados de su servidor de OpenVPN, deberá crear un directorio local de infraestructura de clave pública en su servidor de OpenVPN. Usará este directorio para gestionar las solicitudes de certificado de clientes y del servidor en vez de hacerlas directamente en su servidor CA.
Para crear un directorio de PKI en su servidor de OpenVPN, deberá completar un archivo llamado vars
con algunos valores predeterminados. Primero, usará cd
para ingresar al directorio easy-rsa
y, luego, creará y editará el archivo vars
con el editor de texto que prefiera.
El editor de texto predeterminado que viene con CentOS 8 es vi
. vi
es un editor de texto extremadamente potente, pero puede ser un tanto obtuso para los usuarios que carecen de experiencia con él. Posiblemente desee instalar un editor más sencillo, como nano
, para facilitar la edición de los archivos de configuración en su servidor de CentOS 8.
- sudo dnf install nano
Cuando se le solicite instalar nano
ingrese y
para proceder con los pasos de la instalación. Con eso, estará listo para editar el archivo vars
:
- cd ~/easy-rsa
- nano vars
Una vez abierto el archivo, pegue las siguientes dos líneas:
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Estas líneas garantizarán que se configuren sus claves y solicitudes de certificado privadas para que la moderna Elliptic Curve Cryptography (ECC) genere claves y firmas seguras para sus clientes y su servidor de OpenVPN.
Configurar sus servidores de OpenVPN y CA para que usen ECC significa que cuando un cliente y un servidor intenten establecer una clave simétrica compartida, pueden usar algoritmos de Elliptic Curve para realizar el intercambio. Usar ECC para un intercambio de claves es mucho más rápido que usar solo Diffie-Hellman con el clásico algoritmo RSA, dado que los números son mucho más pequeños y los cálculos son más rápidos.
Antecedentes: Cuando los clientes se conectan a OpenVPN, usan el cifrado asimétrico (también conocido como la clave pública/privada) para realizar un protocolo de enlace TLS. Sin embargo, al transmitir tráfico de VPN cifrado, el servidor y los clientes usan el cifrado simétrico, que también se conoce como cifrado de clave compartida.
Hay mucha menos estructura informática con cifrado simétrico que con el asimétrico: los números que se utilizan son mucho más pequeños y las CPU modernas integran instrucciones para realizar operaciones de cifrado simétricas optimizadas. Para hacer el cambio de cifrado de asimétrico a simétrico, el servidor de OpenVPN y el cliente usarán el algoritmo Elliptic Curve Diffie-Hellman (ECDH) para acordar una clave secreta compartida lo antes posible.
Cuando haya completado el archivo vars
, puede continuar creando el directorio PKI. Para ello, ejecute la secuencia de comandos easyrsa
con la opción init-pki
. Aunque ya ejecutó este comando en el servidor CA como parte de los requisitos previos, debe ejecutarlo aquí porque su servidor de OpenVPN y el de CA tienen directorios PKI separados:
- ./easyrsa init-pki
Tenga en cuenta que no necesita crear una entidad de certificación en su servidor de OpenVPN. Su servidor de CA es el único responsable de validar y firmar certificados. La PKI de su servidor VPN solo se usa como una ubicación adecuada y centralizada para almacenar solicitudes de certificado y certificados públicos.
Después de iniciar su PKI en el servidor de OpenVPN, estará listo para continuar con el siguiente paso: crear una solicitud de certificado de servidor de OpenVPN y una clave privada.
Ahora que su servidor de OpenVPN tiene todos los requisitos previos instalados, el siguiente paso es generar una clave privada y una solicitud de firma de certificados (CSR) en su servidor de OpenVPN. A continuación, transferirá la solicitud a su CA para que se firme, lo que creará el certificado requerido. Cuando tenga un certificado firmado, lo transferirá de vuelta al servidor de OpenVPN y lo instalará para que el servidor lo use.
Para comenzar, diríjase al directorio ~/easy-rsa
de su servidor de OpenVPN como su non-root user:
- cd ~/easy-rsa
Invoque easyrsa
con la opción gen-req
seguida de un nombre común (CN) para la máquina. El CN puede ser el que prefiera, pero puede resultarle útil que sea descriptivo. Durante este tutorial, el CN del servidor de OpenVPN será server
. Asegúrese de incluir también la opción nopass
. Si no lo hace, se protegerá con contraseña el archivo de solicitud, lo que puede generar problemas de permisos más adelante.
Nota: Si elige otro nombre que no sea server
, deberá modificar algunas de las instrucciones a continuación. Por ejemplo, al copiar los archivos generados al directorio /etc/openvpn
, deberá sustituir los nombres que correspondan. También deberá modificar el archivo /etc/openvpn/server.conf
más adelante para señalar los archivos .crt
y .key
correctos.
- ./easyrsa gen-req server nopass
OutputCommon Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are:
req: /home/sammy/easy-rsa/pki/reqs/server.req
key: /home/sammy/easy-rsa/pki/private/server.key
Con esto, se crearán una clave privada para el servidor y un archivo de solicitud de certificado llamado server.req
. Copie la clave del servidor al directorio /etc/openvpn/server
:
- sudo cp /home/sammy/easy-rsa/pki/private/server.key /etc/openvpn/server/
Tras completar estos pasos, habrá creado correctamente una clave privada para su servidor de OpenVPN. También generó una solicitud de firma de certificado para el servidor de OpenVPN. Ahora la CSR está listo para firmar por su CA. En la siguiente sección de este tutorial, aprenderá a firmar una CSR con la clave privada de su servidor CA.
En el paso anterior, creó una solicitud de firma de certificado (CSR) y una clave privada para el servidor de OpenVPN. Ahora el servidor de CA necesita conocer el certificado server
y validarlo. Una vez que el CA valide y devuelva el certificado al servidor de OpenVPN, los clientes que confían en su CA podrán confiar también en el servidor de OpenVPN.
En el servidor de OpenVPN, como su non-root user, use SCP u otro método de transferencia para copiar la solicitud de certificado server.req
al servidor CA para firmar lo siguiente:
- scp /home/sammy/easy-rsa/pki/reqs/server.req sammy@your_ca_server_ip:/tmp
Ahora inicie sesión en el servidor CA como el non-root user que posee el directorio easy-rsa
, donde creó su PKI. Importe la solicitud del certificado usando la secuencia de comandos easyrsa
:
- cd ~/easy-rsa
- ./easyrsa import-req /tmp/server.req server
Output. . .
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.
A continuación, firme la solicitud ejecutando la secuencia de comandos easyrsa
con la opción sign-req
seguida del tipo de solicitud y el nombre común. El tipo de solicitud puede ser client
o server
. Como estamos trabajando con la solicitud de certificado del servidor de OpenVPN, asegúrese de usar el tipo de solicitud server
:
- ./easyrsa sign-req server server
En el resultado, se le solicitará que verifique que la solicitud provenga de una fuente de confianza. Escriba yes
y pulse ENTER
para confirmar:
OutputYou 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 3650 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/sammy/easy-rsa/pki/issued/server.crt
Tenga en cuenta que si cifró su clave privada CA, se le solicitará su contraseña en este momento.
Completados estos pasos, ha firmado la solicitud de certificado del servidor de OpenVPN usando la clave privada del servidor de CA. El archivo server.crt
resultante contiene la clave de cifrado pública del servidor de OpenVPN, así como una nueva firma del servidor de CA. El objetivo de la firma es indicar a todos los que confían en el servidor de CA que también pueden confiar en el servidor de OpenVPN cuando se conecten a él.
Para terminar de configurar los certificados, copie los archivos server.crt
y ca.crt
desde el servidor de CA al servidor de OpenVPN:
- scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
- scp pki/ca.crt sammy@your_vpn_server_ip:/tmp
Ahora vuelva a su servidor de OpenVPN, copie los archivos de /tmp
a /etc/openvpn/server
:
- sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Ahora su servidor de OpenVPN está casi listo para aceptar conexiones. En el siguiente paso, realizará algunos pasos adicionales para aumentar la seguridad del servidor.
Para obtener una capa de seguridad adicional, añadiremos una clave secreta extra compartida que el servidor y todos los clientes usarán con la directiva tls-crypt
de OpenVPN. Esta opción se usa para confundir el certificado TLS que se usa cuando un servidor y un cliente se conectan inicialmente. También lo usa el servidor de OpenVPN para realizar comprobaciones rápidas de los paquetes entrantes: si se firma un paquete usando la clave previamente compartida, el servidor lo procesa; si no se firma, el servidor sabe que es de una fuente no confiable y puede descartarlo sin tener que realizar otras tareas de descifrado.
Esta opción lo ayudará a asegurarse de que su servidor de OpenVPN pueda hacer frente al tráfico sin autenticación, a los escáneres de puerto y a los ataques de denegación de servicio, que pueden restringir recursos del servidor. También hace que sea más difícil identificar el tráfico de red de OpenVPN.
Para generar la clave tls-crypt
antes compartida, ejecute lo siguiente en el servidor de OpenVPN en el directorio ~/easy-rsa
:
- cd ~/easy-rsa
- openvpn --genkey --secret ta.key
El resultado será un archivo llamado ta.key
. Cópielo en el directorio /etc/openvpn/server/
:
- sudo cp ta.key /etc/openvpn/server
Con estos archivos implementados en el servidor de OpenVPN, estará listo para crear certificados de cliente y archivos de clave para sus usuarios, que usará para conectarse con la VPN.
Aunque puede generar una solicitud de claves y certificados privados en su máquina cliente y, luego, enviarla a la CA para que la firme, en esta guía se describe un proceso para generar la solicitud de certificado en el servidor de OpenVPN. El beneficio de este enfoque es que podemos crear una secuencia de comandos que generará de manera automática archivos de configuración de cliente que contienen las claves y los certificados necesarios. Esto le permite evitar la transferencia de claves, certificados y archivos de configuración a los clientes y optimiza el proceso para unirse a la VPN.
Generaremos un par individual de clave y certificado de cliente para esta guía. Si tiene más de un cliente, puede repetir este proceso para cada uno. Tenga en cuenta que deberá pasar un valor de nombre único a la secuencia de comandos para cada cliente. En este tutorial, el primer par de certificado y clave se denominará client1
.
Comience por crear una estructura de directorios dentro de su directorio de inicio para almacenar los archivos de certificado y clave de cliente:
- mkdir -p ~/client-configs/keys
Debido a que almacenará los pares de certificado y clave de sus clientes y los archivos de configuración en este directorio, debe bloquear sus permisos ahora como medida de seguridad:
- chmod -R 700 ~/client-configs
Luego, diríjase al directorio EasyRSA y ejecute la secuencia de comandos easyrsa
con las opciones gen-req
y nopass
, junto con el nombre común para el cliente:
- cd ~/easy-rsa
- ./easyrsa gen-req client1 nopass
Presione ENTER
para confirmar el nombre común. Luego, copie el archivo client1.key
al directorio ~/client-configs/keys/
que creó antes:
- cp pki/private/client1.key ~/client-configs/keys/
Luego, transfiera el archivo client1.req
a su servidor de CA usando un método seguro:
- scp pki/reqs/client1.req sammy@your_ca_server_ip:/tmp
Ahora inicie sesión en su servidor de CA. A continuación, diríjase al directorio de EasyRSA e importe la solicitud de certificado:
- cd ~/easy-rsa
- ./easyrsa import-req /tmp/client1.req client1
Luego, firme la solicitud como lo hizo para el servidor en el paso anterior. Esta vez, asegúrese de especificar el tipo de solicitud client
:
- ./easyrsa sign-req client client1
Cuando se le solicite, ingrese yes
para confirmar que desea firmar la solicitud de certificado y que esta provino de una fuente confiable:
OutputType the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Nuevamente, si cifró su clave de CA, se le solicitará la contraseña en este punto.
Con esto, se creará un archivo de certificado de cliente llamado client1.crt
. Transfiera este archivo de vuelta al servidor:
- scp pki/issued/client1.crt sammy@your_server_ip:/tmp
Vuelva a su servidor de OpenVPN, copie el certificado del cliente al directorio ~/client-configs/keys/
:
- cp /tmp/client1.crt ~/client-configs/keys/
Luego copie los archivos ca.crt
y ta.key
al directorio ~/client-configs/keys/
también y establezca los permisos correspondientes para su usuario sudo:
- cp ~/easy-rsa/ta.key ~/client-configs/keys/
- sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
- sudo chown sammy.sammy ~/client-configs/keys/*
Con esto, se generarán los certificados y las claves de su servidor y cliente, y se almacenarán en los directorios correspondientes de su servidor de OpenVPN. Aún quedan algunas acciones que se deben realizar con estos archivos, pero se realizarán más adelante. Por ahora, puede continuar con la configuración de OpenVPN.
Al igual que muchas otras herramientas de código abierto ampliamente usadas, OpenVPN tiene muchas opciones de configuración disponibles para personalizar su servidor para sus necesidades específicas. En esta sección, le daremos instrucciones para instalar una configuración de un servidor de OpenVPN basada en uno de los archivos de configuración de muestra incluidos en la documentación de este software.
Primero, copie el archivo de muestra server.conf
como punto de inicio para su propio archivo de configuración:
- sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/
Abra el archivo nuevo para editarlo con el editor de texto que prefiera. Usaremos nano en nuestro ejemplo:
- sudo nano /etc/openvpn/server/server.conf
Deberá cambiar algunas líneas en este archivo. Primero, encuentre la sección HMAC
de la configuración buscando la directiva tls-auth
. Esta línea no debería tener comentarios. Elimine los comentarios agregando un ;
al comienzo de la línea. Luego, añada una nueva línea después que contenga solo el valor tls-crypt ta.key
:
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key
Luego, busque las líneas cipher
para encontrar la sección de cifrado. El valor predeterminado está configurado para AES-256-CBC
; sin embargo, el cipher de AES-256-GCM
ofrece un mejor nivel de cifrado, de rendimiento y es muy compatible con los clientes de OpenVPN actualizados. Eliminaremos el valor predeterminado añadiendo un signo ;
al inicio de esta línea y, luego, añadiremos otra línea que contenga el valor actualizado de AES-256-GCM
:
;cipher AES-256-CBC
cipher AES-256-GCM
Justo después de esta línea, añada una directiva auth
para seleccionar el algoritmo de codificación de mensajes HMAC. SHA256
es una buena opción:
auth SHA256
Luego, encuentre la línea que contenga la directiva dh
que define los parámetros Diffie-Hellman. Como hemos configurado todos los certificados para usar Elliptic Curve Cryptography, no necesita un archivo seed Diffie-Hellman. Elimine la línea existente que se parece a dh dh2048.pem
o dh dh.pem
. El nombre del archivo para la clave Diffie-Hellman puede ser diferente al indicado en el archivo de configuración del servidor de ejemplo. Luego, añada una línea después con el contenido dh none
:
;dh dh2048.pem
dh none
A continuación, queremos que OpenVPN se ejecute sin privilegios cuando se inicie, por lo que debemos indicarle que se ejecute con un usuario y grupo de nobody. Para ello, encuentre y elimine el comentario de las líneas user nobody
y group nobody
eliminando el signo ;
desde el inicio de cada línea:
user nobody
group nobody
Con los ajustes anteriores, creará la conexión de VPN entre su cliente y el servidor, pero no se forzarán conexiones para usar el túnel. Si desea usar la VPN para dirigir todo su tráfico de clientes a la VPN, probablemente le convenga aplicar algunos ajustes más a las computadoras de clientes.
Para comenzar, encuentre y elimine el comentario de la línea que contenga push "redirect-gateway def1 bypass-dhcp"
. Al hacerlo le indicará a su cliente que redirija todo su tráfico a través de su servidor de OpenVPN. Tenga en cuenta que habilitar esta funcionalidad puede causar problemas de conectividad con otros servicios de red, como SSH:
push "redirect-gateway def1 bypass-dhcp"
Debajo de esta línea, encontrará la sección dhcp-option
. Nuevamente, elimine ;
del inicio de ambas líneas para quitar los comentarios:
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Estas líneas le indicarán a su cliente que use los solucionadores OpenDNS gratuitos en las direcciones IP en la lista. Si prefiere otros solucionadores DNS, puede sustituirlos en lugar de las IP resaltadas.
Esto ayudará a los clientes a configurar de nuevo sus ajustes de DNS para usar el túnel de la VPN como puerta de enlace predeterminada.
Por defecto, el servidor de OpenVPN usa el puerto 1194
y el protocolo UDP para aceptar las conexiones de los clientes. Si necesita usar un puerto diferente debido a restricciones de los entornos de red que sus clientes puedan emplear, puede cambiar la opción port
. Si no aloja contenido web en su servidor de OpenVPN, el puerto 443
es una opción común, ya que se suele permitir en las reglas de firewall.
Para hacer que OpenVPN escuche en el puerto 443, abra el archivo server.conf
y encuentre la línea que tiene el siguiente aspecto:
port 1194
Edítela para que el puerto sea 443:
# Optional!
port 443
Algunas veces, el protocolo se limita a ese puerto también. Si es así, encuentre la línea proto
debajo de la línea port
y cambie el protocolo de udp
a tcp
:
# Optional!
proto tcp
Si cambia el protocolo a TCP, deberá cambiar el valor de la directiva explicit-exit-notify
de 1
a 0
, ya que solo UDP la usa. Si no lo hace al usar TCP, se producirán errores al iniciar el servicio de OpenVPN.
Busque la línea explicit-exit-notify
al final del archivo y cambie el valor a 0
:
# Optional!
explicit-exit-notify 0
Si no tiene necesidad de usar un puerto y protocolo distintos, es mejor dejar estos ajustes sin cambiar.
Si seleccionó antes un nombre diferente durante el comando ./easyrsa gen-req server
, modifique las líneas cert
y key
en el archivo de configuración server.conf
para que apunten a los archivos .crt
y .key
correspondientes. Si usa el nombre predeterminado, server
, ya está configurado correctamente:
cert server.crt
key server.key
Cuando termine, guarde y cierre el archivo.
Ya ha terminado de configurar sus ajustes generales de OpenVPN. En el siguiente paso, personalizaremos las opciones de redes del servidor.
Hay algunos aspectos de la configuración de redes del servidor que deben modificarse para que OpenVPN pueda dirigir el tráfico de manera correcta a través de la VPN. El primero es el reenvío IP, un método para determinar a dónde se debe dirigir el tráfico de IP. Esto es esencial para la funcionalidad de VPN que proporcionará su servidor.
Para ajustar su configuración de IP predeterminada de su servidor de OpenVPN, abra el archivo /etc/sysctl.conf
usando nano
o su editor preferido:
- sudo nano /etc/sysctl.conf
Luego, añada la siguiente línea en la parte superior del archivo:
net.ipv4.ip_forward = 1
Guarde y cierre el archivo cuando termine.
Para leer el archivo y cargar los nuevos valores de la sesión actual, escriba lo siguiente:
- sudo sysctl -p
Outputnet.ipv4.ip_forward = 1
Ahora, su servidor de OpenVPN podrá reenviar el tráfico entrante de un dispositivo ethernet a otro. Este ajuste garantiza que el servidor pueda dirigir tráfico desde los clientes que se conectan en la interfaz de VPN virtual fuera de sus otros dispositivos de ethernet físicos. Esta configuración enviará todo el tráfico web de su cliente a través de la dirección IP de su servidor y la dirección IP pública de su cliente se ocultará de manera eficaz.
En el siguiente paso, deberá configurar algunas reglas de firewall para asegurarse de que el tráfico hacia y desde su servidor de OpenVPN fluye adecuadamente.
Hasta ahora, instaló OpenVPN en su servidor, lo configuró y generó las claves y los certificados necesarios para que su cliente acceda a la VPN. Sin embargo, aún no ha proporcionado ninguna instrucción a OpenVPN sobre a dónde enviar el tráfico web entrante de los clientes. Puede especificar cómo el servidor debería gestionar el tráfico de clientes estableciendo algunas reglas de firewall y configuraciones de enrutamiento.
Asumiendo que ha seguido los requisitos previos al inicio de este tutorial, ya debería tener instalado firewalld
y ejecutándose en su servidor. Para permitir OpenVPN en el firewall, debe saber qué zona de firewalld
está activa. Búsquelo con el siguiente comando:
- sudo firewall-cmd --get-active-zones
Outputpublic
Interfaces: eth0
Si no ve una zona trusted
que indique la interfaz tun0
, ejecute los siguientes comandos para agregar el dispositivo VPN a esa zona:
- sudo firewall-cmd --zone=trusted --add-interface=tun0
- sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0
A continuación, agregue el servicio openvpn
a la lista de servicios permitidos por firewalld
dentro de su zona activa y, luego, haga que el ajuste sea permanente ejecutando el comando de nuevo pero añadiendo la opción --permanent
:
- sudo firewall-cmd --permanent --add-service openvpn
- sudo firewall-cmd --permanent --zone=trusted --add-service openvpn
Para aplicar los cambios en el firewall, ejecute:
- sudo firewall-cmd --reload
Ahora puede verificar que el servicio se haya añadido correctamente con el siguiente comando:
- sudo firewall-cmd --list-services --zone=trusted
Outputopenvpn
Luego, añadiremos una regla de mascarada al firewall. Enmascarar permite a su servidor de OpenVPN traducir las direcciones de sus clientes de OpenVPN a la dirección pública propia del servidor y hacer lo contrario con el tráfico que se envía de vuelta a los clientes. Este proceso también se conoce como Traducción de la dirección de red (NAT).
Añada reglas de enmascaramiento con los siguientes comandos:
- sudo firewall-cmd --add-masquerade
- sudo firewall-cmd --add-masquerade --permanent
Puede verificar que el enmascaramiento se haya añadido correctamente con este comando:
- sudo firewall-cmd --query-masquerade
Outputyes
A continuación, deberá crear la regla de enmascaramiento específica para su subred de OpenVPN solo. Puede hacerlo creando primero una variable shell (DEVICE
en nuestro ejemplo) que representará la interfaz de red principal usada por su servidor y, luego, usar esa variable para añadir de manera permanente 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
Asegúrese de volver a cargar firewalld
para que se activen todos sus cambios:
- sudo firewall-cmd --reload
Los comandos con el indicador --permanent
se asegurarán de que las reglas persistirán en los reinicios. El comando firewall-cmd --reload
garantiza que se apliquen todos los cambios pendientes en el firewall. Con las reglas de firewall implementadas, podemos iniciar el servicio de OpenVPN en el servidor.
OpenVPN se ejecuta como servicio systemd, por lo que podemos usar systemctl
para administrarlo. Configuraremos OpenVPN para que se inicie en el arranque para que pueda conectarse a su VPN en cualquier momento siempre que su servidor se esté ejecutando. Para ello, habilite el servicio de OpenVPN añadiéndolo a systemctl
:
- sudo systemctl -f enable openvpn-server@server.service
Luego, inicie el servicio de OpenVPN:
- sudo systemctl start openvpn-server@server.service
Vuelva a verificar que el servicio de OpenVPN está activo con el siguiente comando. Debería ver active (running)
en el resultado:
- sudo systemctl status openvpn-server@server.service
Output● openvpn-server@server.service - OpenVPN service for server
Loaded: loaded (/usr/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-04-07 02:32:07 UTC; 1min 52s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 15868 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 5059)
Memory: 1.2M
CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─15868 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --ncp-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf
. . .
Ya completamos la configuración de la parte del servidor para OpenVPN. A continuación, configurará su máquina de cliente y se conectará con el servidor de OpenVPN.
Es posible que se deban crear archivos de configuración para clientes de OpenVPN, ya que todos los clientes deben tener su propia configuración y alinearse con los ajustes mencionados en el archivo de configuración del servicio. En este paso, en lugar de detallarse el proceso para escribir un único archivo de configuración que solo se pueda usar en un cliente, se describe un proceso para crear una infraestructura de configuración de cliente que puede usar para generar archivos de configuración sobre la marcha. Primero creará un archivo de configuración “de base” y, luego, una secuencia de comandos que le permitirá generar archivos de configuración, certificados y claves de clientes exclusivos según sea necesario.
Comience creando un nuevo directorio en el que almacenará archivos de configuración de clientes dentro del directorio client-configs
creado anteriormente:
- mkdir -p ~/client-configs/files
Luego, copie un archivo de configuración de cliente de ejemplo al directorio client-configs
para usarlo como su configuración de base:
- cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf ~/client-configs/base.conf
Abra este archivo nuevo con nano
o su editor de texto preferido:
- nano ~/client-configs/base.conf
Dentro de este, ubique la directiva remote
. Esto dirige al cliente a la dirección de su servidor de OpenVPN: la dirección IP pública de su servidor de OpenVPN. Si decidió cambiar el puerto en el que el servidor de OpenVPN escucha, también deberá cambiar 1194
por el puerto seleccionado:
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
. . .
Asegúrese de que el protocolo coincida con el valor que usa en la configuración del servidor:
proto udp
Luego, elimine los comentarios de las directivas user
y group
quitando el signo ;
al inicio de cada línea:
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody
Encuentre las directivas que establecen ca
, cert
y key
. Elimine los comentarios de estas directivas, ya que pronto agregará los certificados y las claves dentro del archivo:
# 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
De modo similar, elimine la directiva tls-auth
, ya que añadirá ta.key
directamente al archivo de configuración del cliente (y se configura el servidor para que use tls-crypt
):
# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1
Refleje los ajustes de cipher
y auth
establecidos en el archivo /etc/openvpn/server/server.conf
:
cipher AES-256-GCM
auth SHA256
Luego, agregue la directiva key-direction
en algún lugar del archivo. Es necesario que fije el valor “1” para esta, a fin de que la VPN funcione de manera correcta en la máquina cliente:
key-direction 1
Por último, agregue algunas líneas no incluidas. Aunque puede incluir estas directivas en todos los archivos de configuración de clientes, solo debe habilitarlas para clientes Linux que incluyan un archivo /etc/openvpn/update-resolv-conf
. Esta secuencia de comandos usa la utilidad resolvconf
para actualizar la información de DNS para clientes Linux.
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
Si su cliente tiene Linux instalado y un archivo /etc/openvpn/update-resolv-conf
, elimine los comentarios de estas líneas del archivo de configuración de cliente luego de que se haya generado.
Guarde y cierre el archivo cuando termine.
A continuación, cree una secuencia de comandos que compile su configuración de base con el certificado, la clave y los archivos de cifrado pertinentes, y, luego, ubique la configuración generada en el directorio ~/client-configs/files
. Abra un nuevo archivo llamado make_config.sh
en el directorio ~/client-configs
:
- nano ~/client-configs/make_config.sh
Dentro de este, agregue el siguiente contenido:
#!/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
Guarde y cierre el archivo cuando termine.
Antes de continuar, asegúrese de marcar este archivo como ejecutable escribiendo lo siguiente:
- chmod 700 ~/client-configs/make_config.sh
Esta secuencia de comandos realizará una copia del archivo base.conf
que creó, recopilará todos los archivos de certificados y claves que haya confeccionado para su cliente, extraerá el contenido de estos y los anexará a la copia del archivo de configuración de base, y exportará todo este contenido a un nuevo archivo de configuración de cliente. Esto significa que se evita la necesidad de administrar los archivos de configuración, certificado y clave del cliente por separado, y que toda la información necesaria se almacena en un solo lugar. El beneficio de este método es que, si alguna vez necesita agregar un cliente más adelante, puede simplemente ejecutar esta secuencia de comandos para crear de manera rápida el archivo de nueva configuración y asegurarse de que toda la información importante se almacene en una sola ubicación de acceso sencillo.
Tenga en cuenta que siempre que agregue un nuevo cliente, deberá generar claves y certificados nuevos para poder ejecutar esta secuencia de comandos y generar su archivo de configuración. Podrá practicar con este comando en el siguiente paso.
Si siguió la guía, creó un certificado y una clave de cliente llamados client1.crt
y client1.key
, respectivamente, en el paso 6. Puede generar un archivo de configuración para estas credenciales si se dirige al directorio ~/client-configs
y ejecuta la secuencia de comandos que realizó al final del paso anterior:
- cd ~/client-configs
- ./make_config.sh client1
Con esto, se creará un archivo llamado client1.ovpn
en su directorio ~/client-configs/files
:
- ls ~/client-configs/files
Outputclient1.ovpn
Debe transferir este archivo al dispositivo que planee usar como cliente. Por ejemplo, puede ser su computadora local o un dispositivo móvil.
Si bien las aplicaciones exactas empleadas para lograr esta transferencia dependerán del sistema operativo de su dispositivo y sus preferencias personales, un método seguro y confiable consiste en usar el protocolo de transferencia de archivos SSH (SFTP ) o la copia segura (SCP) en el backend. Con esto, se transportarán los archivos de autenticación de VPN de su cliente a través de una conexión cifrada.
Aquí tiene un comando SFTP de ejemplo que puede ejecutar desde su computadora local (macOS o Linux). Esto copiará el archivo client1.ovpn
que hemos creado en el último paso a su directorio de inicio:
- sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/
A continuación, se muestran diferentes herramientas y tutoriales para transferir de manera segura los archivos del servidor de OpenVPN a una computadora local:
En esta sección, se aborda la forma de instalar un perfil de VPN de cliente en Windows, macOS, Linux, iOS y Android. Ninguna de estas instrucciones para clientes depende de la otra. Por lo tanto, no dude en dirigirse directamente a la que corresponda para su dispositivo.
La conexión de OpenVPN tendrá el mismo nombre que usó para el archivo .ovpn
. En lo que respecta a este tutorial, esto significa que la conexión se llama client1.ovpn
y guarda correspondencia con el primer archivo de cliente que generó.
Instalación
Descargue la aplicación de cliente de OpenVPN para Windows de la página de descargas de OpenVPN. Seleccione la versión adecuada del instalador para su versión de Windows.
Nota: OpenVPN necesita privilegios administrativos para instalarse.
Luego de instalar OpenVPN, copie el archivo .ovpn
a esta ubicación:
C:\Program Files\OpenVPN\config
Cuando inicie OpenVPN, este detectará el perfil de manera automática y lo dejará disponible.
Debe ejecutar OpenVPN como administrador cada vez que lo use, aun en cuentas administrativas. Para realizar esto sin tener que hacer clic con el botón secundario y seleccionar Ejecutar como administrador cada vez que use la VPN, debe fijarlo como ajuste predeterminado desde una cuenta administrativa. Esto también significa que los usuarios estándares deberán ingresar la contraseña del administrador para usar OpenVPN. Por otro lado, los usuarios estándares no pueden conectarse de manera adecuada al servidor a menos que la aplicación OpenVPN del cliente tenga derechos de administrador. Por lo tanto, se necesitan privilegios elevados.
Para configurar la aplicación OpenVPN de modo que se ejecute siempre con privilegios de administrador, haga clic con el botón secundario en su ícono de acceso directo y diríjase a Propiedades. Al final de la pestaña Compatibilidad, haga clic en el botón Cambiar la configuración para todos los usuarios. En la nueva ventana, seleccione Ejecutar este programa como administrador.
Conexión
Cada vez que inicie OpenVPN GUI, Windows le preguntará si quiere que el programa realice cambios en su computadora. Haga clic en Sí. Iniciar la aplicación OpenVPN de cliente solo ubica el applet en la bandeja del sistema para que pueda conectar y desconectar la VPN según sea necesario; no establece la conexión de VPN.
Una vez que se inicie OpenVPN, establezca una conexión ingresando al área de notificación y haga clic con el botón secundario en el ícono de OpenVPN. Con esto, se abrirá el menú contextual. Seleccione client1 en la parte superior del menú (su perfil client1.ovpn
) y, luego, Connect.
Una ventana de estado se abrirá y mostrará el resultado de registro mientras se establece la conexión, y se mostrará un mensaje una vez que el cliente esté conectado.
Desconéctese de la VPN de la misma forma: ingrese al applet de la bandeja del sistema, haga clic con el botón secundario en el icono de OpenVPN, seleccione el perfil del cliente y haga clic en Disconnect.
Instalación
Tunnelblick es un cliente de OpenVPN gratuito y de código abierto para macOS. Puede descargar la última imagen de disco desde la página de descargas de Tunnelblick. Haga clic en el archivo .dmg
descargado y siga las instrucciones para instalarlo.
Al finalizar el proceso de instalación, Tunnelblick le preguntará si tiene algún archivo de configuración. Responda I have configuration files (tengo archivos de configuración) y deje que Tunnelblick finalice el proceso. Abra una ventana de Finder, busque client1.ovpn
y haga doble clic en él. Tunnelblick instalará el perfil de cliente. Se necesitan privilegios de administrador.
Conexión
Inicie Tunnelblick haciendo doble clic en el icono de Tunnelblick de la carpeta Aplicaciones. Una vez que se haya iniciado Tunnelblick, su icono aparecerá en la barra de menú de la esquina superior derecha de la pantalla para controlar las conexiones. Haga clic en el icono y, luego, en el elemento de menú Connect client1 para iniciar la conexión de VPN.
Instalación
Si usa Linux, dispone de varias herramientas según su distribución. En su entorno de escritorio o gestor de ventanas, también pueden incluirse utilidades de conexión.
Sin embargo, el método de conexión más universal consiste en simplemente usar el software OpenVPN.
En Ubuntu o Debian, puede instalarlo como en el servidor escribiendo lo siguiente:
- sudo apt update
- sudo apt install openvpn
En CentOS, puede habilitar los repositorios EPEL y, luego, instalarlo escribiendo lo siguiente:
- sudo yum install epel-release
- sudo yum install openvpn
Configuración
Verifique si su distribución incluye una secuencia de comandos /etc/openvpn/update-resolv-conf
:
- ls /etc/openvpn
Outputupdate-resolv-conf
A continuación, edite el archivo de configuración de cliente de OpenVPN que transfirió:
- nano client1.ovpn
Si pudo encontrar un archivo update-resolv-conf
, elimine los comentarios de las tres líneas de agregó para modificar los ajustes de DNS:
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
Si usa CentOS, cambie la directiva group
de nogroup
a nobody
para que coincidan los grupos de distribución disponibles:
group nobody
Guarde y cierre el archivo.
Ahora, podrá conectarse a la VPN simplemente apuntando el comando openvpn
hacia el archivo de configuración de cliente:
- sudo openvpn --config client1.ovpn
Esto debería permitirle establecer conexión con la VPN.
Instalación
Desde iTunes App Store, busque e instale OpenVPN Connect, la aplicación oficial de cliente de OpenVPN de iOS. Para transferir su configuración de cliente iOS al dispositivo, conéctelo directamente a una computadora.
El proceso para completar la transferencia con iTunes se describe aquí. Abra iTunes en la computadora y haga clic en iPhone > apps. Deslícese hacia la parte inferior, hasta la sección Compartir archivos, y haga clic en la app OpenVPN. La ventana en blanco de la derecha, Documentos OpenVPN, sirve para compartir archivos. Arrastre el archivo .ovpn
a la ventana de documentos de OpenVPN.
Ahora inicie la aplicación OpenVPN en el iPhone. Recibirá una notificación de que un nuevo perfil está listo para importarse. Toque el símbolo verde del signo de suma para importarlo.
Connecting (Conectando)
De esta manera, OpenVPN estará listo para usarse con el nuevo perfil. Inicie la conexión deslizando el botón Connect (Conectar) a la posición On (Activado). Finalice la conexión deslizando el mismo botón a la posición Off (Desactivado).
Nota: El conmutador de VPN de Settings (Ajustes) no se puede usar para establecer conexión con la VPN. Si lo intenta, recibirá un aviso que le indicará conectarse únicamente utilizando la aplicación OpenVPN.
Instalación
Abra Google Play Store. Busque e instale Android OpenVPN Connect, la aplicación de cliente de OpenVPN oficial de Android.
Puede transferir el perfil .ovpn
conectando el dispositivo Android a su computadora a través de un puerto USB y copiando el archivo. De manera alternativa, si tiene un lector de tarjetas SD, puede quitar la tarjeta SD del dispositivo, copiar el perfil a ella y, luego, insertarla tarjeta de vuelta en el dispositivo Android.
Inicie la aplicación OpenVPN y haga clic en el menú FILE
(Archivo) para importar el perfil.
.
Luego, diríjase a la ubicación del perfil guardado (en la captura de pantalla se usa /storage/emulated/0/openvpn
) y seleccione su archivo .ovpn
. Haga clic en el botón IMPORT
para terminar de importar este perfil.
.
Connecting (Conectando) Cuando se añada el perfil, verá una pantalla como esta:
Para conectarse, haga clic en el botón de activar para el perfil que desea usar. Verá datos en tiempo real de su conexión y tráfico enrutados a través de su servidor de OpenVPN:
Para desconectarse, solo haga clic en el botón de alternancia en la parte superior izquierda de nuevo. Se le solicitará que confirme que desea desconectarse de su VPN.
Nota: Este método para probar su conexión de VPN solo funcionará si optó por enrutar todo el tráfico a través de la VPN en el paso 7 cuando editó el archivo server.conf
para OpenVPN.
Una vez que todo esté instalado, con una simple revisión confirmará que todo funciona de forma correcta. Sin tener una conexión VPN habilitada, abra un explorador e ingrese a DNSLeakTest.
El sitio mostrará la dirección de IP asignada por su proveedor de servicio de Internet y la forma en que aparece para el resto del mundo. Para corroborar sus ajustes de DNS a través del mismo sitio web, haga clic en Extended Test (Prueba extendida). Esto le indicará los servidores DNS que usa.
Ahora, conecte el cliente de OpenVPN a la VPN de su Droplet y actualice el navegador. Con esto, debería aparecer una dirección de IP totalmente distinta (la de su servidor de VPN). De esta manera, aparecerá ante el mundo. Una vez más, la opción Extended Test de DNSLeakTest revisará sus ajustes de DNS y confirmará que ahora use los solucionadores de DNS enviados por su VPN.
Es posible que, de tanto en tanto, deba rechazar un certificado de cliente para evitar más accesos al servidor de OpenVPN.
Para ello, siga el ejemplo en el tutorial de requisitos previos Cómo instalar y configurar una entidad de certificación en CentOS 8 en la sección Revocar un certificado.
Cuando haya revocado un certificado para un cliente usando estas instrucciones, deberá copiar el archivo crl.pem
generado a su servidor de OpenVPN en el directorio /etc/openvpn/server
:
- sudo cp /tmp/crl.pem /etc/openvpn/server/
Luego, abra el archivo de configuración del servidor de OpenVPN:
- sudo nano /etc/openvpn/server/server.conf
Al final del archivo, agregue la opción crl-verify
, que indicará al servidor OpenVPN que revise la lista de rechazo de certificados que creamos cada vez que se realice un intento de conexión:
crl-verify crl.pem
Guarde y cierre el archivo.
Por último, reinicie OpenVPN para implementar el rechazo de certificados:
- sudo systemctl restart openvpn-server@server.service
El cliente ya no debería poder conectarse de manera correcta al servidor usando la credencial anterior.
Para rechazar clientes adicionales, siga este proceso:
./easyrsa revoke client-name
.crl.pem
nuevo a su servidor de OpenVPN y cópielo al directorio /etc/openvpn/server/
para sobrescribir la lista anterior.Puede usar este proceso para rechazar cualquier certificado emitido anteriormente para su servidor.
Ahora debería tener una red privada completamente funcional ejecutándose en su servidor de OpenVPN. Puede navegar en la web y descargar contenido sin preocuparse porque individuos malintencionados rastreen su actividad.
Hay varios pasos que podría seguir para personalizar su instalación de OpenVPN aún más, como configurar su cliente para que se conecte a la VPN de manera automática o configurar reglas específicas para los clientes y políticas de acceso. Para esto y para otras personalizaciones de OpenVPN, debería consultar la documentación oficial de OpenVPN.
Para configurar más clientes, solo debe seguir los pasos 6 y 11-13 para cada dispositivo adicional. Para rechazar el acceso de los clientes, siga el paso 15.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Gracias por el tutorial, quería saber si me podrían ayudar con el error en el cliente ‘Cannot pre-load keyfile (ta.key)’, volví a revisar los pasos y sigo en el mismo error.
En el paso 11 entendí que debo eliminar el ; en la línea
¿Es eso correcto?
Gracias