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.
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 |
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:
- Generación de la Autoridad de Certificación;
- Generación de la clave del servidor y solicitud de certificado;
- Firma de la solicitud de certificado del servidor con la CA;
- Generación de los parámetros Diffie-Hellman en el servidor;
- Generación de clave tls-auth en el servidor;
- Configuración OpenVPN;
- Configuración de red y firewall (ufw) en el servidor;
- Generación de una clave de cliente y solicitud de certificado;
- Firma del certificado de cliente con la CA;
- 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:
- Generamos un directorio de trabajo con el
make-cadir
y muévase dentro de él.
- Configurar las variables contenidas en las
vars
archivo que se utilizará para el certificado.
- 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!