Cómo montar una VPN rápido y sin complicaciones donde quieras
Tags: vpn, openvpn, ubuntu
Published: 2024-03-08 09:45:52

<aside>
⚠️ Este tutorial sirve para montar una VPN en 5 minutos por si necesitas conexiones esporádicas a alguna red en concreto. Si lo usas de manera profesional, asegúrate de tener la paquetería de seguridad actualizada.
</aside>

## Dónde instalar el servidor VPN

Partimos de cero eligiendo una VPS según nuestros requisitos:

- Si es para **conectarnos a una red local** del que queramos usar servicios, montamos una máquina virtual, Raspberry Pi o cualquier otra opción que nos ofrezca poder instalar una distribución de Ubuntu Server. 
- Si es para **facilitarnos una IP específica** de un país, ya sea porque trabajamos en un marketplace con geolocalización y necesitamos comprobar que sale la moneda local de inicio, entre otros casos. Si es así, en servicios como Digital Ocean o Linode podemos crear una VPS ([Droplet](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04) en el caso de Digital Ocean) con Ubuntu Server.

## Cómo instalar el servidor VPN
 
1. Saber cuál es nuestra IP real, podemos verla en [whatismyip.com](http://whatismyip.com).
2. Una vez montada la instancia de Ubuntu Server según nuestras necesidades, descargamos el script de GitHub con permisos de root:
    
    ```bash
    curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
    ```
    
3. Damos permisos de ejecución al script:
    
    ```bash
    chmod +x openvpn-install.sh
    ```
    
4. Ejecutamos el script:
    
    ```bash
    ./openvpn-install.sh
    ```
    
5. Los primeros pasos para configurar la VPN son:
    1. IP pública del servidor
    2. Activar o no el soporte IPv6 (por defecto: no)
    3. Puerto del VPN (por defecto: 1194)
    4. Protocolo: (UDP)
    5. DNS: En mi caso, he elegido OpenDNS (8)
    6. Activar compresión (por defecto: no)
    7. Personalizar las opciones de cifrado (por defecto: no)
6. ¡Listo! Siguiendo con la configuración de openVPN, el script permite crear el primer archivo .ovpn de credenciales. Es muy sencillo, escribe un nombre y la opción de si incluir una contraseña o no de importación.    

![Archivos de configuración de openVPN](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yrilsp4o1zbfvvl7qvt5.png)
    
También podemos revisar el estado de openVPN con este comando:

```bash
systemctl status openvpn
```

Con un resultado similar a éste:

```bash
● openvpn.service - OpenVPN service
Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2022-08-30 09:21:07 UTC; 1 day 23h ago
Main PID: 12963 (code=exited, status=0/SUCCESS)
CPU: 4ms
```

### Cómo añadir perfiles

Una vez hecho todo lo de arriba, no tenemos que volver a configurar nada si queremos crear perfiles y descargar las credenciales, o también revocarlas si queremos denegarles el acceso.

```bash
bash openvpn-install.sh
```

El menú es el siguiente:

```
Welcome to OpenVPN-install!
The git repository is available at: [https://github.com/angristan/openvpn-install](https://github.com/angristan/openvpn-install)
It looks like OpenVPN is already installed.
What do you want to do?
1) Add a new user
2) Revoke existing user
3) Remove OpenVPN
4) Exit
Select an option [1-4]:
```

Si queremos crear un nuevo perfil, elegimos la primera opción y los pasos serán los mismos que en la última parte del proceso inicial.

1. Nombre del perfil.
2. Como medida de seguridad, podemos asignarle una contraseña. Por ello, elegimos la segunda opción, “Use a password for the client” just to import it.
3. Copiar ese archivo a nuestro equipo local para conectarnos, o enviársela a una persona para que se conecte.

### Cómo compartir el archivo con otras personas

Existe multitud de opciones, por ejemplo usando el comando scp para enviar remotamente copias de archivos, pero en este caso, vamos a hacerlo de una manera más simple. 

```bash
cat archivo.ovpn
```

Entendiendo que hacemos el listado del archivo conectado por ssh a donde hemos instalado el servidor VPN, copiamos el contenido y, ya en **local**, usamos nuestro editor favorito:

```bash
vim archivo.ovpn
```

el archivo, al no existir en local, se crea nuevo y sólo necesitamos pulsar la tecla `i` ([INSERT]) y `CTRL+shift+v` para copiar el contenido.

El último paso para salir:

```bash
:wq
```

### Cómo comprobar las conexiones recientes

Puedes ver quién está conectado a la instancia con:

```bash
cat /var/log/openvpn/status.log
```

Con un resultado como éste:

```bash
OpenVPN CLIENT LIST
Updated,2023-02-07 14:41:27
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
[nombrearchivo],[IP de su equipo]:49161,2759574,2477388,2023-02-07 14:39:55
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.2,gh-[name+username],[remote IP]:49161:49161,2023-02-07 14:41:26
GLOBAL STATS
Max bcast/mcast queue length,0
END
```

## Cómo instalar el cliente VPN en Ubuntu

<aside>
🦘 Si ya tienes configurado el cliente VPN en el sistema, salta directamente al punto 4. Los puntos previos son para instalar y activar los servicios. Los pasos a seguir son para distribuciones tipo Debian.
</aside>

1. Abre un terminal e instala la paquetería necesaria
    
    ```bash
    sudo apt install openvpn network-manager-openvpn
    ```
    
2. Activa y habilita el servicio openVPN:
    
    ```bash
    sudo systemctl start openvpn && sudo systemctl enable openvpn
    ```
    
3. Revisa el estado del permiso con:
    
    ```bash
    sudo systemctl status openvpn
    ```
    
    obtendrás un mensaje similar a éste
    
    ```bash
    ● openvpn.service - OpenVPN service
    Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
    Active: active (exited) since Wed 2022-08-31 08:12:00 CEST; 3h 11min ago
    Main PID: 1427 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 37661)
    Memory: 0B
    CGroup: /system.slice/openvpn.service
    ```
    
4. Sube el archivo de configuración de extensión .ovpn

![Escritorio GNOME](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vfq06l6bao3u1byqm77.png) 

Tras seguir los pasos de cómo cargar el archivo .ovpn, puedes comprobar tu IP de nuevo en [whatismyip.com](http://whatismyip.com) y verificar si ha ido todo correcto.

Esto es todo, muy sencillo por ejemplo si tienes un servidor NAS en casa pero no quieres conectarlo a la red pública por privacidad. O tienes una cuenta compartida de algún servicio de streaming y necesitas que tu dispositivo se identifique como "hogar" una vez al mes ;-)

Termino este tutorial igual que como lo empecé, aconsejando que la paquetería de seguridad sea debidamente actualizada.

## VPN known issues

### Timeout error

En caso de que tengas un timeout en el log[1] y estás usando un escritorio distinto a GNOME, reinicia el servicio de network-manager. Dos opciones: 

```bash
sudo service network-manager restart
```

o en su lugar

```bash
sudo systemctl restart systemd-networkd
```

Ubuntu usa network-manager en lugar del servicio por defecto de otras distribuciones.

[1] Obtén información tecleando: 

```bash
grep openvpn /var/log/syslog
```

### Slack

Encendiendo o apagando la VPN, Slack tendrá un retraso en la conexión de al menos 30-40 segundos en la app de Slack, como si se quedara desconectado. Vía web no me ha ocurrido y tampoco con otra aplicación.

### Kubuntu

Hay un bug en KDE no resuelto. Importamos el archivo openvpn en la interfaz del network-manager. Se conecta, timeout, pero no tenemos más pistas. Lo llamativo es que conectándonos vía terminal va perfectamente:

 ```bash
sudo openvpn —config [file].ovpn
```


Hemos de abrir el archivo openvpn y extraer el bloque **key** en un archivo independiente. El bloque es algo como esto:

```
-----BEGIN OpenVPN Static key V1-----
92e2de5ae643729863zzzz4a0ebe952
.
.
.

cc05zxzxczczxxczxzxczxce902b498a5
-----END OpenVPN Static key V1-----

```

Sálvalo con la extensión `[archivo].key`

Por ello:

1. Abre la conexión openVPN ya creada en networkmanager.
2. Elige "Advanced..." en la pestaña VPN, luego **TLS Settings**, y cambia sólo dos cosas:
    1. Modo a **TLS-Crypt**
    2. y el hueco de "Key File", usa la ruta del archivo .key creado anteriormente. ¡No lo elimines!

Et voilà, la conexión funcionará.

Información sobre este bug:

[Bug #1847144 “network-manager-openvpn config import ignores tls-...” : Bugs : network-manager-openvpn package : Ubuntu](https://bugs.launchpad.net/ubuntu/+source/network-manager-openvpn/+bug/1847144)