GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Cómo configurar un servidor OpenVPN en Ubuntu 20.04

Ubuntu 20.04 Focal Fossa es el último soporte a largo plazo de una de las distribuciones de Linux más utilizadas. En este tutorial veremos cómo usar este sistema operativo para crear un servidor OpenVPN y cómo crear un .ovpn que usaremos para conectarnos a él desde nuestra máquina cliente.

En este tutorial aprenderás:

  • Cómo generar una Autoridad Certificadora
  • Cómo generar el certificado y la clave del servidor y del cliente
  • Cómo firmar un certificado con la autoridad de certificación
  • Cómo crear parámetros Diffie-Hellman
  • Cómo generar una clave tls-auth
  • Cómo configurar el servidor OpenVPN
  • Cómo generar un archivo .ovpn para conectarse a la VPN

Cómo configurar un servidor OpenVPN en Ubuntu 20.04

Requisitos de software y convenciones utilizadas

Configuración del escenario

Antes de continuar con la configuración VPN real, hablemos de las convenciones y la configuración que adoptaremos en este tutorial.

Usaremos dos máquinas, ambas con tecnología Ubuntu 20.04 Focal Fossa . El primero, camachine se utilizará para alojar nuestra Autoridad de certificación; el segundo, openvpnmachine será el que configuraremos como la VPN real servidor. Es posible usar la misma máquina para ambos propósitos, pero sería menos seguro, ya que una persona que viola el servidor podría "suplantar" a la Autoridad de certificación y usarla para firmar certificados no deseados (el problema es particularmente relevante solo si usted planea tener más de un servidor o si planea usar la misma CA para otros fines). Para mover archivos entre una máquina y otra usaremos el scp (copia segura) comando. Los 10 pasos principales que realizaremos son los siguientes:

  1. Generación de la Autoridad de Certificación;
  2. Generación de la clave del servidor y solicitud de certificado;
  3. Firma de la solicitud de certificado del servidor con la CA;
  4. Generación de los parámetros Diffie-Hellman en el servidor;
  5. Generación de clave tls-auth en el servidor;
  6. Configuración OpenVPN;
  7. Configuración de red y firewall (ufw) en el servidor;
  8. Generación de una clave de cliente y solicitud de certificado;
  9. Firma del certificado de cliente con la CA;
  10. Creación del archivo .ovpn del cliente utilizado para conectarse a la VPN.

Paso 1:Generación de la Autoridad de Certificación (CA)

El primer paso en nuestro viaje consiste en la creación de la Autoridad Certificadora en la máquina dedicada. Trabajaremos como un usuario sin privilegios para generar los archivos necesarios. Antes de comenzar, necesitamos instalar el easy-rsa paquete:

$ sudo apt-get update && sudo apt-get -y install easy-rsa

Con el paquete instalado, podemos usar el make-cadir comando para generar un directorio que contenga las herramientas necesarias y los archivos de configuración, en este caso lo llamaremos certificate_authority . Una vez creado, nos moveremos dentro de él:

$ make-cadir certificate_authority && cd certificate_authority

Dentro del directorio encontraremos un archivo llamado vars . En el archivo podemos definir algunas variables que se utilizarán para la generación del certificado. Un conjunto comentado de estas variables se puede encontrar en la línea 91 a 96 . Simplemente elimine el comentario y asigne los valores apropiados:

set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "California"
set_var EASYRSA_REQ_CITY       "San Francisco"
set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
set_var EASYRSA_REQ_EMAIL      "[email protected]"
set_var EASYRSA_REQ_OU         "My Organizational Unit"

Una vez guardados los cambios, podemos proceder y generar la PKI (Infraestructura de clave pública), con el siguiente comando que creará un directorio llamado pki :

$ ./easyrsa init-pki

Con la infraestructura en su lugar, podemos generar nuestra clave y certificado de CA. Después de ejecutar el siguiente comando, se nos pedirá que ingresemos una frase de contraseña para la clave ca . Tendremos que proporcionar la misma contraseña cada vez que interactuemos con la autoridad. Un nombre común también se debe proporcionar el certificado. Este puede ser un valor arbitrario; si solo presionamos enter en el indicador, se usará el predeterminado, en este caso Easy-RSA CA :

$ ./easyrsa build-ca

Aquí está la salida del comando:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
..........+++++
....................................................................+++++
e is 65537 (0x010001)
Can't load /home/egdoc/certificate_authority/pki/.rnd into RNG
140296362980608:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/home/egdoc/certificate_authority/pki/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/egdoc/certificate_authority/pki/ca.crt

El build-ca el comando generó dos archivos; su ruta, relativa a nuestro directorio de trabajo son:

  • pki/ca.crt
  • pki/private/ca.clave

El primero es el certificado público, el segundo es la clave que se usará para firmar los certificados del servidor y de los clientes, por lo que debe mantenerse lo más seguro posible.

Una pequeña nota, antes de seguir adelante:en la salida del comando, es posible que haya notado un mensaje de error. Aunque el error no está lleno, una solución para evitarlo es comentar la tercera línea del openssl-easyrsa.cnf archivo que está dentro del directorio de trabajo generado. El problema se discute en el repositorio de github de openssl. Después de la modificación, el archivo debería verse así:

# For use with Easy-RSA 3.1 and OpenSSL or LibreSSL

RANDFILE                = $ENV::EASYRSA_PKI/.rnd

Dicho esto, pasemos a la máquina que usaremos como servidor OpenVPN y generemos la clave y el certificado del servidor.

Paso 2:generación de la clave del servidor y solicitud de certificado

En este paso generaremos la clave del servidor y la solicitud de certificado que será firmada por la autoridad certificadora. En la máquina que usaremos como servidor OpenVPN, debemos instalar el openvpn , easy-rsa y ufw paquetes:

$ sudo apt-get update && sudo apt-get -y install openvpn easy-rsa ufw

Para generar la clave del servidor y la solicitud de certificado, realizamos el mismo procedimiento que usamos en la máquina que aloja la Autoridad de certificación:

  1. Generamos un directorio de trabajo con el make-cadir y muévase dentro de él.
  2. Configurar las variables contenidas en las vars archivo que se utilizará para el certificado.
  3. Generar la infraestructura de clave pública con ./easyrsa init-pki comando.

Después de estos pasos preliminares, podemos emitir el comando para generar el certificado del servidor y el archivo de claves:

$ ./easyrsa gen-req server nopass

Esta vez, ya que usamos el nopass opción, no se nos pedirá que insertemos una contraseña durante la generación de la clave del servidor . Todavía se nos pedirá que ingresemos un Nombre común para el certificado de servidor . En este caso, el valor predeterminado utilizado es server . Eso es lo que usaremos en este tutorial:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

Generating a RSA private key
....................+++++
.................+++++
writing new private key to '/home/egdoc/openvpnserver/pki/private/server.key.9rU3WfZMbW'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /home/egdoc/openvpnserver/pki/reqs/server.req
key: /home/egdoc/openvpnserver/pki/private/server.key

Una solicitud de firma de certificado y una clave privada se generará:

  • /home/egdoc/openvpnserver/pki/reqs/server.req
  • /home/egdoc/openvpnserver/pki/private/server.key .

El archivo clave debe moverse dentro de /etc/openvpn directorio:

$ sudo mv pki/private/server.key /etc/openvpn

La solicitud de certificado, en cambio, debe enviarse a la máquina de la autoridad de certificación para que se firme. Podemos usar scp comando para transferir el archivo:

$ scp pki/reqs/server.req egdoc@camachine:/home/egdoc/

Volvamos a camachine y autorizar el certificado.

Paso 3:firma del certificado del servidor con la CA

En la máquina de la Autoridad de Certificación deberíamos encontrar el archivo que copiamos en el paso anterior en el $HOME directorio de nuestro usuario:

$ ls ~
certificate_authority  server.req

Lo primero que hacemos es importar la solicitud de certificado. Para realizar la tarea, usamos import-req acción del easyrsa texto. Su sintaxis es la siguiente:

import-req <request_file_path> <short_basename>

En nuestro caso, esto se traduce en:

$ ./easyrsa import-req ~/server.req server

El comando generará el siguiente resultado:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

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.

Para firmar la solicitud, usamos el sing-req action, que toma como primer argumento el tipo de la solicitud (servidor, en este caso), y el short_basename usamos en el comando anterior (servidor). Ejecutamos:

$ ./easyrsa sign-req server server

Se nos pedirá que confirmemos que queremos firmar el certificado y que proporcionemos la contraseña que usamos para la clave de la autoridad de certificación. Si todo va como se esperaba, se creará el certificado:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 1080 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/egdoc/certificate_authority/pki/safessl-easyrsa.cnf
Enter pass phrase for /home/egdoc/certificate_authority/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Mar 20 02:12:08 2023 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/egdoc/certificate_authority/pki/issued/server.crt

Ahora podemos eliminar el archivo de solicitud que transferimos previamente desde openvpnmachine . Y copie el certificado generado de vuelta a nuestro OpenVPN servidor, junto con el certificado público de la CA:

$ rm ~/server.req
$ scp pki/{ca.crt,issued/server.crt} egdoc@openvpnmachine:/home/egdoc

De vuelta en la openvpnmachine debemos encontrar los archivos en nuestro directorio de inicio. Ahora podemos moverlos a /etc/openvpn :

$ sudo mv ~/{ca.crt,server.crt} /etc/openvpn

Paso 4:generación de parámetros Diffie-Hellman

El siguiente paso consiste en la generación de un Diffie-Hellman parámetros El Diffie-Hellman El intercambio de claves es el método utilizado para transferir claves criptográficas a través de un canal público e inseguro. El comando para generar la clave es el siguiente (podría tardar un poco en finalizar):

$ ./easyrsa gen-dh

La clave se generará dentro del pki directorio como dh.pem . Vamos a moverlo a /etc/openvpn como dh2048.pem :

$ sudo mv pki/dh.pem /etc/openvpn/dh2048.pem

Paso 5 – Generación de la clave tls-auth (ta.key)

Para mejorar la seguridad, OpenVPN implementa tls-auth . Citando la documentación oficial:

La directiva tls-auth agrega una firma HMAC adicional a todos los paquetes de protocolo de enlace SSL/TLS para verificar la integridad. Cualquier paquete UDP que no tenga la firma HMAC correcta se puede descartar sin más procesamiento. La firma tls-auth HMAC proporciona un nivel adicional de seguridad por encima y más allá del proporcionado por SSL/TLS. Puede proteger contra:
– Ataques DoS o inundación de puertos en el puerto UDP OpenVPN.
– Escaneo de puertos para determinar qué puertos UDP del servidor están en un estado de escucha.
– Vulnerabilidades de desbordamiento de búfer en el Implementación de SSL/TLS.
– Iniciaciones de protocolos de enlace SSL/TLS desde máquinas no autorizadas (mientras que tales protocolos de enlace fallarían en última instancia para autenticar, tls-auth puede cortarlos en un punto mucho más temprano).

Para generar la clave tls_auth podemos ejecutar el siguiente comando:

$ openvpn --genkey --secret ta.key

Una vez generada, movemos la ta.key archivo a /etc/openvpn :

$ sudo mv ta.key /etc/openvpn

La configuración de nuestras claves de servidor ya está completa. Podemos continuar con la configuración real del servidor.

Paso 6:configuración de OpenVPN

El archivo de configuración de OpenVPN no existe por defecto dentro de /etc/openvpn . Para generarlo, usamos una plantilla que se envía con openvpn paquete. Ejecutemos este comando:

$ zcat \
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \
  | sudo tee /etc/openvpn/server.conf > /dev/null

Ahora podemos editar el /etc/openvpn/server.conf expediente. Las partes relevantes se muestran a continuación. Lo primero que queremos hacer es comprobar que el nombre de las claves y certificados referenciados se corresponden con los que generamos. Si siguió este tutorial definitivamente debería ser el caso (líneas 78-80 y 85 ):

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem

Queremos hacer que el demonio OpenVPN se ejecute con privilegios bajos, el nobody usuario y nogroup grupo. La parte relevante del archivo de configuración está en las líneas 274 y 275 . Solo tenemos que eliminar el ; inicial :

user nobody
group nogroup

Otra línea de la que queremos eliminar el comentario es 192 . Esto hará que todos los clientes redirijan su puerta de enlace predeterminada a través de la VPN:

push "redirect-gateway def1 bypass-dhcp"

Líneas 200 y 201 to también se puede usar para permitir que el servidor envíe servidores DNS específicos a los clientes. Los del archivo de configuración son los proporcionados por opendns.com :

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

En este punto, /etc/openvpn El directorio debe contener estos archivos que generamos:

/etc/openvpn
├── ca.crt
├── dh2048.pem
├── server.conf
├── server.crt
├── server.key
└── ta.key

Asegurémonos de que todos sean propiedad de root:

$ sudo chown -R root:root /etc/openvpn

Podemos continuar con el siguiente paso:configurar las opciones de red.

Paso 7:configurar redes y ufw

Para que nuestra VPN funcione, debemos habilitar el reenvío de IP en nuestro servidor. Para hacerlo, simplemente descomentamos la línea 28 desde el /etc/sysctl.conf archivo:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Para recargar la configuración:

$ sudo sysctl -p

También debemos permitir el reenvío de paquetes en el firewall ufw modificando el /etc/default/ufw y cambiando la DEFAULT_FORWARD_POLICY de DROP para ACCEPT (línea 19 ):

# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"

Ahora necesitamos agregar las siguientes reglas al comienzo de /etc/ufw/before.rules expediente. Aquí asumimos que la interfaz utilizada para la conexión es eth0 :

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT

Finalmente, debemos permitir el tráfico entrante para openvpn servicio en el administrador de firewall ufw:

$ sudo ufw allow openvpn

En este punto podemos reiniciar ufw para que se apliquen los cambios. Si su firewall no estaba habilitado en este punto, asegúrese de que ssh el servicio siempre está permitido, de lo contrario, es posible que se corte si está trabajando de forma remota.

$ sudo ufw disable && sudo ufw enable

Ahora podemos iniciar y habilitar el servicio openvpn.service en el arranque:

$ sudo systemctl restart openvpn && sudo systemctl enable openvpn

Paso 8:Generación de una clave de cliente y solicitud de certificado

La configuración de nuestro servidor ya está terminada. El siguiente paso consiste en la generación de la clave de cliente y solicitud de certificado. El procedimiento es el mismo que usamos para el servidor:simplemente usamos "cliente" como nombre en lugar de "servidor", generamos la clave y la solicitud de certificado, luego pasamos este último a la máquina CA para que lo firme.

$ ./easyrsa gen-req client nopass

Al igual que antes, se nos pedirá que ingresemos un nombre común. Se generarán los siguientes archivos:

  • /home/egdoc/openvpnserver/pki/reqs/client.req
  • /home/egdoc/openvpnserver/pki/private/client.key

Copiemos el client.req a la máquina CA:

$ scp pki/reqs/client.req egdoc@camachine:/home/egdoc

Una vez que se copia el archivo, en camachine , importamos la solicitud:

$ ./easyrsa import-req ~/client.req client

Luego, firmamos el certificado:

$ ./easyrsa sign-req client client

Después de ingresar la contraseña de CA, el certificado se creará como pki/issued/client.crt . Eliminemos el archivo de solicitud y copiemos el certificado firmado nuevamente en el servidor VPN:

$ rm ~/client.req
$ scp pki/issued/client.crt egdoc@openvpnmachine:/home/egdoc

Para mayor comodidad, vamos a crear un directorio para contener todo el material relacionado con el cliente y mover la clave y el certificado del cliente dentro:

$ mkdir ~/client
$ mv ~/client.crt pki/private/client.key ~/client

Bien, ya casi llegamos. Ahora, tenemos que copiar la plantilla de configuración del cliente, /usr/share/doc/openvpn/examples/sample-config-files/client.conf dentro del ~/client directorio y modificarlo para adaptarlo a nuestras necesidades:

$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client

Aquí están las líneas que necesitamos cambiar en el archivo. En la línea 42 coloque la IP del servidor real o el nombre de host en lugar de my-server-1 :

remote my-server-1 1194

En las líneas 61 y 62 elimina el ; inicial carácter para degradar los privilegios después de la inicialización:

user nobody
group nogroup

En las líneas 88 a 90 y 108 podemos ver que se hace referencia al certificado de CA, el certificado de cliente, la clave de cliente y la clave tls-auth. Queremos comentar esas líneas, ya que pondremos el contenido real de los archivos entre un par de "etiquetas" dedicadas:

  • <ca></ca> para el certificado CA
  • <cert></cert> para el certificado de cliente
  • <key></key> para la clave del cliente
  • <tls-auth></tls-auth> para la clave tls-auth

Una vez que se comentan las líneas, agregamos el siguiente contenido al final del archivo:

<ca>
# Here goes the content of the ca.crt file
</ca>

<cert>
# Here goes the content of the client.crt file
</cert>

<key>
# Here goes the content of the client.key file
</key>

key-direction 1
<tls-auth>
# Here goes the content of the ta.key file
</tls-auth>

Una vez terminado de editar el archivo, lo renombramos con el .ovpn sufijo:

$ mv ~/client/client.conf ~/client/client.ovpn

Todo lo que queda por hacer es importar el archivo en nuestra aplicación cliente para que se conecte a nuestra VPN. Si estamos usando el entorno de escritorio GNOME, por ejemplo, podemos importar el archivo desde Red sección del panel de control. En la sección VPN simplemente haga clic en + y luego en "importar desde archivo" para seleccionar e importar el archivo ".ovpn" que transfirió previamente a su máquina cliente.



Interfaz GNOME para importar archivo .ovpn

Conclusiones

En este tutorial vimos cómo crear una configuración de OpenVPN que funcione. Generamos una Autoridad de Certificación y la utilizamos para firmar los certificados de servidor y cliente que generamos junto con las claves correspondientes. Vimos cómo configurar el servidor y cómo configurar la red, permitiendo el reenvío de paquetes y realizando las modificaciones necesarias en la configuración del firewall ufw. Finalmente, vimos cómo generar un cliente .ovpn archivo que se puede importar desde una aplicación cliente para conectarse fácilmente a nuestra VPN. ¡Disfrútalo!


Ubuntu
  1. Configuración básica de conexión cliente/servidor Ubuntu 20.04 OpenVPN

  2. Cómo configurar el servidor Rsyslog en Ubuntu 18.04 LTS

  3. Cómo configurar el servidor NTP en Ubuntu y LinuxMint

  4. Configurar el servidor Rsyslog en Ubuntu 20.04 - ¿Cómo hacerlo?

  5. Cómo instalar OpenVPN en Ubuntu 18.04

Cómo configurar el servidor multijugador de Minecraft en Ubuntu 16.04

Cómo configurar OpenVPN en Ubuntu Server

Cómo configurar el servidor Git en Ubuntu 20.04

Cómo configurar el servidor Rsyslog en Ubuntu

Cómo configurar el servidor DHCP en Ubuntu

Cómo instalar el servidor OpenVPN en Ubuntu 20.04 LTS

    Requisitos de software y convenciones de la línea de comandos de Linux
    Categoría Requisitos, convenciones o versión de software utilizada
    Sistema Ubuntu 20.04 fosa focal
    Software openvpn, ufw, easy-rsa
    Otro Permisos de raíz para realizar tareas administrativas
    Convenciones # – requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando
    $ – requiere que los comandos de Linux dados se ejecuten como un usuario normal sin privilegios