Guía definitiva para configurar un servidor OpenVPN seguro en Ubuntu 20.04
Una red privada virtual (VPN) le permite conectarse de forma segura y privada a una red privada remota, por ejemplo, la red de su oficina o Internet de tal manera que esté conectado directamente a una red privada.
VPN funciona en una arquitectura de servidor-cliente. Un servidor VPN se implementa en una máquina y es de acceso público a través de Internet. El servidor VPN se puede configurar para permitir la conexión a una LAN privada, como una red de oficina, o permitir conexiones a Internet. El usuario se conecta al servidor VPN mediante un cliente VPN en su máquina local. La comunicación entre el servidor VPN y el cliente se realiza mediante un protocolo de túnel seguro. Para Internet, parece que el destino del tráfico es el servidor VPN; sin embargo, el tráfico pasa al cliente a través del servidor.
La VPN tiene muchos usos en la vida diaria, como conectarse de forma segura a una red Wifi pública, que a menudo se ve comprometida o eludir las restricciones geográficas en ciertos sitios web al conectarse a una VPN con base en un país permitido por el sitio web.
OpenVPN es una implementación de VPN ampliamente utilizada que permite una amplia gama de configuraciones y opciones. Utiliza el protocolo Secure Sockets Layer (SSL) para el cifrado de los datos y claves precompartidas, nombre de usuario / contraseña o certificados para la autenticación del cliente VPN. En este artículo, veremos cómo configurar un servidor VPN y un cliente VPN en Ubuntu 20.04.
Instalación
OpenVPN está disponible en los repositorios oficiales de Ubuntu en el paquete openvpn
. Este paquete instala tanto el servidor OpenVPN como el cliente.
sudo apt instalar openvpn
Como se mencionó anteriormente, OpenVPN usa certificados SSL para encriptar datos entre el servidor y el cliente. Necesitamos configurar nuestra propia autoridad de certificación (CA) para emitir certificados para la VPN. Tenga en cuenta que esto debe configurarse en una máquina diferente a aquella en la que está configurado OpenVPN; la razón es que si está en el mismo servidor y si se ve comprometido, un atacante puede acceder a la clave privada y así atacar la conexión VPN.
Usaremos una herramienta llamada "Easy-RSA" para configurar la autoridad de certificación. Para instalarlo, ejecute lo siguiente en la máquina CA, la máquina servidor OpenVPN y la máquina cliente, ya que la configuración es necesaria en los tres para configurar la CA.
sudo apt install easy-rsa
Ahora configuraremos primero la autoridad de certificación en la máquina CA y realizaremos algunos pasos de configuración necesarios para la misma en la máquina del servidor Open VPN.
Configuración de la autoridad de certificación
Configuración inicial en la máquina de CA
Ahora, este paquete instala un comando llamado hacer-cadir
que se utiliza para crear una carpeta para la configuración de la autoridad de certificación. Creemos una carpeta usando esto e ingresemos a la carpeta.
make-cadir cert_authority && cd cert_authority
Abra el archivo llamado vars
creado en este directorio. Este archivo contiene algunas variables de configuración que necesitamos modificar. Los valores que deben modificarse están en las líneas 91-96, después del comentario sobre Campos organizacionales que describe estos campos. Descomente las líneas y complete los valores apropiados en lugar de los valores de muestra.
Guardar y salir del archivo. Si está utilizando vim editor, presione Esc
, escribe : wq
y presione Ingresar
para guardar y salir.
A continuación, ejecutamos el easyrsa
programa en el directorio para configurar la infraestructura de clave pública (PKI), que se utilizará para generar claves públicas y certificados.
./easyrsa init-pki
El siguiente paso generará la clave y el certificado de CA. Cuando el comando solicite una contraseña, ingrese una contraseña para la clave CA. Además, ingrese un nombre común cuando se le solicite. Si deja este espacio en blanco, se utilizará el nombre predeterminado Easy-RSA CA name.
./easyrsa build-ca
Como podemos ver en la salida, se han generado el certificado y la clave. Esta clave se utilizará para firmar los certificados de cliente y servidor, por lo que nunca debe tocarse / modificarse.
Ahora, tenemos la configuración de PKI. El siguiente paso es crear una clave de servidor y un certificado en la máquina que usaremos como servidor OpenVPN. Este certificado será posteriormente firmado por la máquina CA.
Generación de la clave y el certificado del servidor en la máquina del servidor
Ya hemos instalado Easy RSA en la máquina del servidor. Ahora realice los tres pasos en la máquina servidor, que realizamos anteriormente en la máquina CA, a saber. creando un directorio de CA usando hacer-cadir
y entrando en él, modificando las variables en el vars
archivo y generando PKI usando ./easyrsa init-pki
mando.
A continuación, debemos ejecutar el comando para generar una solicitud y una clave de certificado de servidor.
./easyrsa gen-req servidor nopass
Tenga en cuenta que pasamos la opción no pase
para que el comando no nos pida que ingresemos una contraseña para la clave del servidor. Seguirá solicitando un nombre común para el servidor, que puede ingresar cualquier cosa, o dejarlo vacío para el nombre predeterminado (servidor) para ser utilizado.
Mueva el archivo de clave generado dentro del / etc / openvpn
directorio.
sudo mv pki / private / server.key / etc / openvpn
Envíe la solicitud de certificado a la máquina CA. Usaremos el comando scp
para este propósito.
scp pki / reqs / server.req usuario @ CA_MACHINE_HOSTNAME: / directorio
En la captura de pantalla anterior, el host 45.79.125.41 es la máquina CA. Hemos copiado el certificado en el directorio / root.
Ahora, el certificado del servidor se ha copiado en la máquina CA. El siguiente paso es volver a la máquina CA y firmar este certificado.
Firma del certificado del servidor en la CA
Primero, verifiquemos si el archivo de solicitud de certificado del servidor se ha copiado en la máquina de CA. Vaya al directorio donde copiamos el archivo (/ root en mi ejemplo) y ejecute ls
.
: ~ # cd / root && ls cert_authority server.req
Como podemos ver, el archivo server.req
está presente. A continuación, vaya al directorio de CA e importe esta solicitud.
cd cert_authority ./easyrsa import-req /root/server.req servidor
Para firmar esta solicitud, ejecute el siguiente comando.
./easyrsa sign-req servidor servidor
Aquí el primer argumento es el tipo de solicitud, es decir, servidor, y el segundo argumento es el nombre común de la máquina servidor, para la cual usamos previamente el valor predeterminado, es decir, servidor.
Ingrese la frase sí, y la contraseña de la clave CA cuando se le solicite.
Ahora podemos eliminar el archivo de solicitud de certificado y copiar el certificado generado para el servidor, así como el certificado público de CA de regreso a la máquina del servidor.
rm /root/server.req scp pki / emitido / server.crt [email protected]: / root scp pki / ca.crt [email protected]: / root
A continuación, tenemos que realizar algunos pasos más para garantizar una conexión segura de la VPN.
Generación de parámetros DH
El intercambio de claves DH (Diffie-Hellman) es un algoritmo para garantizar un intercambio seguro de claves criptográficas a través de un canal inseguro. Primero, muevamos el certificado recibido y el certificado público de CA a / etc / openvpn
.
mv /root/ca.crt /root/server.crt / etc / openvpn
Vaya a la carpeta CA en la máquina servidor y ejecute el siguiente comando para generar los parámetros DH. Puede llevar mucho tiempo generar.
./easyrsa gen-dh
Ahora, mueva el archivo generado a / etc / openvpn
.
mv /root/cert_authority/pki/dh.pem / etc / openvpn
Generando claves TA
OpenVPN usa otra medida de seguridad adicional usando la clave de autenticación TLS. Para generar la clave de autenticación TLS, ejecute:
openvpn --genkey --secret tls_auth.key
Y mueve la llave a / etc / openvpn
.
mv tls_auth.key / etc / openvpn
La configuración de la clave del servidor y la configuración de la autoridad de certificación ahora están hechas. Pasemos ahora a la configuración real del servidor VPN.
Configuración del servidor OpenVPN
El archivo de configuración para el servidor OpenVPN no se crea automáticamente, sin embargo, podemos usar un archivo de configuración de plantilla del openvpn
paquete.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz / etc / openvpn / sudo gzip -d /etc/openvpn/server.conf.gz
Abra el archivo usando vim o cualquier editor de su elección.
cd / etc / openvpn vim server.conf
Tenemos que ingresar los nombres comunes de claves y certificados que generamos previamente. Vaya a la línea no. 78. Como usamos todos los nombres predeterminados, los mantenemos sin cambios. Luego verifique el nombre del archivo de parámetros DH en la línea 85. Hemos usado el nombre dh.pem, así que cambiémoslo.
A continuación, modifiquemos los privilegios del servidor OpenVPN. Vaya a la línea 274 y 275 y elimine el ;
para descomentarlo.
De manera similar, vaya a la línea 192 y elimine el punto y coma. Esta directiva permite que el tráfico de todos los clientes pase a través de la VPN.
Guardar y salir del archivo.
Cambie la propiedad de la carpeta / etc / openvpn a root.
sudo chown -R root: root / etc / openvpn
Configuración de redes y firewall
Necesitamos permitir el reenvío de IP en el servidor para permitir que los paquetes se reenvíen desde y hacia el cliente VPN. Descomente la línea 28 en /etc/sysctl.conf
:
Guardar y salir del archivo.
Reiniciar systemctl
para que estos cambios tengan lugar.
sudo sysctl -p
Necesitamos configurar la traducción de direcciones de red (NAT) en el servidor usando un firewall UFW para permitir que el cliente VPN acceda a Internet usando la dirección IP del servidor VPN. Primero, habilitemos el reenvío de paquetes en la configuración del firewall. Abierto / etc / default / ufw
y cambie la variable en la línea 19 a ACEPTAR.
Guardar y salir del archivo.
Ahora agregue las siguientes reglas al archivo /etc/ufw/before.rules
antes de filtrar línea en el archivo.
* nat: POSTROUTING ACCEPT [0: 0] -A POSTROUTING -s 10.8.0.0/8 -o -j MASQUERADE COMMIT
Ingrese su interfaz de red en lugar de . Puede ver su interfaz de red con el comando ifconfig
.
Permita el tráfico para el servicio OpenVPN en el Firewall y permita el puerto 1194.
sudo ufw allow openvpn && sudo ufw allow 1194
Vuelva a cargar el servicio de firewall.
sudo ufw recargar
Ahora podemos reiniciar el demonio del servidor Open VPN ejecutando:
reinicio de openvpn del servicio sudo
Habilítelo para que se inicie en el momento del arranque ejecutando:
sudo systemctl habilitar openvpn
El servidor OpenVPN ahora se ha configurado y se ha iniciado. Pasemos ahora a la solicitud de certificado de cliente, la generación de claves y otras configuraciones.
Configuración del cliente OpenVPN
Necesitamos generar una clave y una solicitud de certificado para el cliente. El procedimiento para hacer esto es el mismo que para el servidor.
Aunque se puede crear una clave de cliente y una solicitud de certificado en la máquina del cliente y luego transferirla a la máquina de CA, se recomienda crearla en la máquina del servidor. La ventaja de hacer esto en el servidor es que puede crear un script para realizar todos los pasos requeridos en el servidor, lo que facilita que un nuevo cliente se una a la VPN.
Vaya a la carpeta CA en el servidor y ejecute lo siguiente:
cd ~ / cert_authority ./easyrsa gen-req cliente nopass
De manera similar a como se hizo anteriormente, ingrese un nombre común cuando se le solicite, o déjelo en blanco para usar el nombre común predeterminado, es decir, cliente.
Copiemos ahora la solicitud de certificado de cliente generada en la máquina de CA.
scp pki / reqs / client.req [email protected]: / root
Importemos esta solicitud en la máquina de CA:
./easyrsa import-req /root/client.req cliente
Y ahora firmémoslo:
./easyrsa sign-req cliente cliente
Ingresarsí
cuando se le solicite que continúe. Ingrese la contraseña para la clave CA cuando se le solicite.
Ahora podemos eliminar el archivo solicitado para el cliente y copiar la solicitud de nuevo a la máquina del servidor VPN.
rm /root/client.req scp pki / Published / client.crt [email protected]: / root
Creemos una carpeta llamada cliente
para mantener todos los archivos relacionados con el cliente en el servidor VPN. Moveremos la clave del cliente y el certificado a esta carpeta.
mkdir ~ / client sudo mv ~ / client.crt ~ / cert_authority / pki / private / client.key ~ / client
Ahora, creemos un archivo de configuración a partir de una plantilla disponible, similar a cómo creamos el archivo de configuración del servidor.
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~ / client
Abre el archivo client.conf
. En la línea 42, ingrese el nombre de host o la dirección IP de su máquina servidor en lugar de mi-servidor-1
.
Elimine el comentario de las líneas 61 y 62 eliminando el punto y coma inicial para degradar los privilegios del archivo.
A continuación, comente las líneas 88-90 y 108. La razón es que queremos agregar el contenido de los archivos mencionados manualmente en lugar de usar las ubicaciones de los archivos. El propósito de hacer esto es que el archivo de configuración del cliente se transferirá más tarde al cliente, donde en realidad no tendremos la clave del cliente ni los archivos de certificado; por lo tanto, copiamos el contenido de los que se encuentran en el archivo de configuración.
Agregue lo siguiente al archivo de configuración del cliente. Ingrese el contenido del archivo de los archivos respectivos dentro de las etiquetas dadas.
# Pegar el contenido del archivo ca.crt aquí # Pegar el contenido del archivo client.crt aquí # Pegar el contenido del archivo client.key aquí key-direction 1 # Pegar el contenido del archivo tls_auth.key aquí
Guardar y salir del archivo. Cambiar el nombre de este archivo de client.conf
a client.ovpn
, ya que esta última es la extensión necesaria para los archivos de configuración que se pueden importar como configuraciones de red.
Ahora, transfiera el archivo client.ovpn
al cliente, es decir, máquina local.
Correr scp
en su máquina cliente para transferir el archivo desde la máquina servidor a su máquina local.
usuario scp @ ip_servidor: / ruta_al_archivo ruta_de_destino_local
Finalmente, necesitamos usar este archivo de configuración para conectarnos al servidor VPN. Esto se puede hacer tanto a través de la línea de comandos como a través de la GUI.
Para iniciar el cliente VPN desde la línea de comandos, ejecute:
sudo openvpn --config client.ovpn
Y ese es el único comando que debe ejecutar para iniciar el Cliente VPN.
Para iniciar el cliente VPN a través de la GUI, realice los siguientes pasos.
Vaya a Configuración »Red en su máquina cliente.
Clickea en el + en la sección VPN y elija "Importar desde archivo ..." de las opciones.
Haga clic en "Agregar" para comenzar a usar la VPN.
Tenga en cuenta que en "Puerta de enlace", es la dirección IP del servidor.
Finalmente, active el botón "VPN cliente" para habilitar la VPN en la máquina.
Es posible que tarde unos segundos en establecer una conexión VPN. Aparecerá un nuevo logotipo de progreso para VPN en la esquina superior izquierda de su pantalla mientras se está configurando, y cambiará a un logotipo de VPN una vez que esté configurado.
Para verificar si la VPN funciona correctamente, ejecute lo siguiente:
curl //ipinfo.io/ip
Debería devolver la dirección IP de su máquina servidor. O también puede verificar su dirección IP simplemente buscando "Mi IP" en Google. Debería mostrar la dirección IP de su servidor VPN si nuestra configuración de VPN funciona correctamente.
Conclusión
En este artículo, vimos cómo configurar un servidor OpenVPN, una autoridad de certificación y un cliente OpenVPN. Para agregar más clientes a la VPN, ahora debemos seguir el procedimiento para generar y firmar un certificado para el cliente y usar el mismo archivo de configuración creado aquí, con solo la clave del cliente y los valores del certificado cambiados.
En el caso de conexiones a Internet más lentas, es posible que si se utiliza UDP para la comunicación, haya una pérdida considerable de paquetes. El usuario puede cambiar a TCP quitando el comentario de la línea proto tcp
y comentando en la linea proto udp
en el archivo de configuración del servidor.
Además, en caso de que haya otros errores, puede establecer el nivel de registro con el verbo
directiva en los archivos de configuración del servidor y del cliente. Puede ingresar valores entre 0 y 9. Cuanto mayor sea el valor de esta directiva, más detallado será el registro.