Cómo configurar un servidor OpenVPN en Ubuntu 20.04

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

Ingresar 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.