X
    Categorías: DevOps

Cómo crear tu propio Servidor VPN con OpenVPN

OpenVPN es una solución multiplataforma que ha simplificado la configuración de VPNs en contra de soluciones más antiguas y difíciles de configurar como IPSec, haciéndolo más accesible para el público con menos experiencia en este tipo de tecnologías, permitiéndonos así crear nuestro propio servidor VPN.

Tabla de Contenidos

Servidor

Lo primero que tenemos que hacer para crear nuestro propio servidor VPN es, obviamente, conseguir un servidor dónde realizar la instalación. Existen múltiples opciones en la nube y la mayoría de ellas, además, cuentan con imágenes para poder preinstalar OpenVPN en la creación de los servidores. Entre las posibles opciones que podemos utilizar encontramos los siguientes:

  • ScaleWay C1: 4 CPU, 2GB RAM, 50GB SDD, 1 IP, 200 Mbit/s ancho de banda -> 2.99€ al mes.
  • DigitalOcean: 1 CPU, 512 MB RAM, 20 GB SDD, 1 IP, 1 TB ancho de banda -> 5$ al mes.
  • Google Cloud Platform: Facturación por minutos de uso.
  • Amazon EC2: Facturación por minutos de uso.

También podríamos realizar la instalación en cualquier máquina Ubuntu con acceso a internet, como un ordenador antiguo o una Raspberry Pi. En estos casos deberemos realizar además tareas de redireccionamiento de tráfico en nuestra red local para que todo funcione correctamente.

Instalación

Para instalar OpenVPN en Ubuntu podemos utilizar apt-get mediante el siguiente comando:

sudo apt-get install openvpn easy-rsa

Después de esto, tenemos que extraer el fichero de ejemplo de configuración en la carpeta /etc/openvpn para incorporarlo así a nuestra configuración. Esto se puede hacer con un solo comando:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Una vez extraído editamos el fichero server.conf y realizamos algunos cambios.

sudo nano /etc/openvpn/server.conf

Las modificaciones más importantes a realizar son descomentar algunas líneas eliminando el caracter ‘;’. Para que el servidor VPN pase el tráfico web de los clientes a su destino, debemos descomentar la siguiente línea:

push "redirect-gateway def1 bypass-dhcp"

Es importante utilizar el servidor OpenDNS con los clientes conectados para la resolución de DNS. Esto puede ayudar a evitar que las solicitudes de DNS se escapen fuera de la conexión VPN. Sin embargo, es importante especificar también estos servidores DNS en los dispositivos de los clientes.. Para lograrlo necesitamos descomentar las siguientes líneas:

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

Para evitar que OpenVPN se ejecute en modo root descomentaremos las siguientes líneas que especifica el usuario nobody como el usuario por defecto a utilizar. Nobody es un usuario sin los privilegios por defecto de un usuario normal.

user nobody
group nogroup

El siguiente paso es configurar el reenvío de paquetes con sysctl. Esto le indicará al núcleo del servidor que reenvíe el tráfico de los dispositivos cliente hacia Internet. De lo contrario, el tráfico se detendrá en el servidor. Para lograrlo debemos ejecutar este comando:

echo 1 > /proc/sys/net/ipv4/ip_forward

Para hacer que este cambio sea permanente debemos descomentar la siguiente línea en el fichero /etc/sysctl.conf.

net.ipv4.ip_forward=1

Cortafuegos

De forma predeterminada, las reglas de reenvío de Linux eliminan todos los paquetes que intentan acceder a otra interfaz, por lo que necesitamos configurar un cortafuegos que permita el tráfico a través del puerto VPN 1194 y enviar por defecto las peticiones realizadas a Internet por los clientes. Para evitar el uso de IPTables vamos a usar ufw con los siguientes comandos para permitir conexiones SSH y 1194/udp:

ufw allow ssh
ufw allow 1194/udp

Después de eso, tenemos que modificar el archivo de configuración ufw para establecer la política de forward por defecto a ACCEPT. Este archivo es /etc/default/ufw y necesitamos modificar la línea:

DEFAULT_FORWARD_POLICY="ACCEPT"

Finalmente, debemos añadir unas cuantas reglas en el fichero /etc/ufw/before.rules para que OpenVPN funcione correctamente. Estas reglas son:

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

El resultado del fichero debe parecerse al de la Captura 1:

Captura 1: /etc/ufw/before.rules

Con los cambios realizados en ufw, podemos activarlo finalmente:

ufw enable

Generación de Certificados

El siguiente paso es configurar y generar los certificados que OpenVPN utilizará para cifrar el tráfico. Para este propósito vamos a utilizar los scripts de Easy RSA en nuestra carpeta de servidor.

Copiamos los scripts de generación de Easy RSA con el siguiente comando:

cp -r /usr/share/easy-rsa/ /etc/openvpn/

Creamos una carpeta para almacenar las claves:

mkdir /etc/openvpn/easy-rsa/keys

Ahora debemos modificar algunas variables en el fichero /etc/openvpn/easy-rsa/vars como la carpeta de EASY_RSA el valor del KEY_SIZE como podemos ver en la Captura 2:

Captura 2: /etc/openvpn/easy-rsa/vars

Antes de crear cualquier clave necesitamos configurar nuestro servidor como CA (Certificate Authority) para firmar nuestras claves con los siguientes comandos:

cd /etc/openpvn/easy-rsa
source ./vars # Carga el fichero vars editado previamente
./clean-all # Borra cualquier configuración y claves anteriores. Si ya hemos generado claves anteriormente, podemos saltarnos este comando.
./build-ca # Genera CA

Como podemos ver en la Captura 3 el sistema nos pedirá información sobre el certificado como el país, la provincia, el nombre, etc.

Captura 3: Creando Autoridad de Certificación

Con el siguiente comando generamos las claves del servidor para un servidor con nombre ‘server’ como podemos ver en la Captura 4.

./build-key-server server
Captura 4: Generando Clave para el Servidor

Ahora que tenemos las claves en la carpeta/etc/openvpn/easy-rsa/keys/ las copiamos en la carpeta /etc/openvpn:

cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

Generamos además los parámetros Diffie-Hellman. Esto puede tardar varios minutos.

openssl dhparam -out /etc/openvpn/dh2048.pem 2048
Captura 5: Generando Diffie-Hellman

Finalmente, podemos iniciar nuestro servidor OpenVPN con el siguiente comando:

service openvpn start

Claves de Cliente

Una vez generadas las claves del servidor, podemos generar claves para cada uno de los diferentes clientes que queremos conectar a nuestra VPN. No existe ninguna relación entre la clave y el propio dispositivo por lo que podríamos generar una clave de cliente única y usarla en todos los dispositivos, eso sí, sólo un cliente podría conectarse a la VPN al mismo tiempo.

Para crear credenciales de autenticación independientes para los clientes (Captura 6) necesitamos usar el script build-key de la carpeta Easy RSA:

./build-key client1
Captura 6: Creando Clave para Client 1

Este comando va a generar las siguientes claves:

  • /etc/openvpn/easy-rsa/keys/client1.crt
  • /etc/openvpn/easy-rsa/keys/client1.key

Ahora que tenemos las claves, podemos proceder con la creación del archivo de configuración. Para ello partimos de uno de los archivos predeterminados de Easy RSA copiándolo en nuestra carpeta:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

El siguiente paso requiere descargar a nuestro equipo local las llaves del cliente, los archivos de client.ovpn y ca.cart. Podemos hacer eso con SCP:

scp root@[SERVER-IP]:/etc/openvpn/easy-rsa/keys/client1.key .
scp root@[SERVER-IP]:/etc/openvpn/easy-rsa/keys/client1.crt .
scp root@[SERVER-IP]:/etc/openvpn/easy-rsa/keys/client.ovpn .
scp root@[SERVER-IP]:/etc/openvpn/easy-rsa/keys/ca.crt .

Una vez que hayamos descargado los archivos en nuestro ordenador, podemos crear un perfil OpenVPN unificado mediante la edición del archivo de plantilla client.ovpn e incluir la Autoridad de Certificación de los servidores, el certificado de clientes y su clave. También necesitamos hacer algunas modificaciones en el archivo:

  • Descomentar user nobody y group nogroup
  • Cambiar la línea remote my-server-1 1194 line con remote [SERVER-IP] 1194
  • Comentar las líneas de la Captura 7.
Captura 7: Fichero client.ovpn

Para combinar los archivos individuales en el único perfil unificado, el contenido de los archivos ca.crt, client1.crt y client1.key se pegan directamente en el perfil de .ovpn utilizando una sintaxis básica similar a XML. El código XML al final del archivo debe tener este formato:

<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>
<cert>
Certificate:
...
-----END CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
</key>

Clientes OpenVPN

Para poder usar el archivo .opvn de configuración y conectarnos remotamente a nuestro servidor VPN podemos hacer uso de diferentes clientes VPN disponibles.

OpenVPN Connect ofrece versiones para PC, dispositivos Android e iOS. En nuestro caso vamos a utilizar otro cliente VPN para Mac OSX, llamado Tunnelblick. Una vez instalado solo necesitamos abrir nuestro archivo de perfil .ovpn y Tunnelblick configurará automáticamente la conexión VPN para que podamos utilizarla como podemos ver en Captura 8.

Captura 8: Tunnelblick Conectado

Podemos asegurarnos de que estamos conectados a la VPN usando cualquier servicio web para obtener nuestra IP pública como podemos ver en Captura 9 que detecta que todo está bien configurado.

Captura 9: Comprobando mi IP
Miguel:
Entrada Relacionada