WireGuard (II): Crear un cliente

En una entrada anterior expliqué qué es y cómo instalar de manera sencilla WireGuard en nuestro servidor. En esta entrada veremos cómo crear un cliente para poder conectarnos a nuestra VPN de manera remota.

Para esta entrada daremos por sentado que nuestro WireGuard ha sido instalado a través de PiVPN, como cuento en mi anterior entrada.

Partiremos de un servidor de WireGuard instalado gracias a Multipass (ya os hablaré de ello, lo estoy preparando 😊). Éste tiene configurado el puerto por defecto de WireGuard: el 51820. Como podéis ver, el servidor se encuentra escuchando ya en la red local y en su propia red de VPN:

wireguard    Running    192.168.64.5    Ubuntu 20.04 LTS
                        10.6.0.1
IP de Multipass donde está WireGuard alojado

Clientes para WireGuard

Hoy en día hay aplicaciones para conectarse a un servidor WireGuard para todas las plataformas y de todos los gustos. Personalmente, me gusta usar los clientes oficiales siempre que puedo, pero dejo a vuestra elección que uséis el que más os guste.

Dar de alta un cliente nuevo

Lo bueno de usar PiVPN es que se nos facilita muchísimo el control de nuestro servidor VPN. De hecho, al ejecutar el comando pivpn --help, veremos todas las opciones de que disponemos, y que son más que suficientes para su gestión.

::: Control all PiVPN specific functions!
:::
::: Usage: pivpn <command> [option]
:::
::: Commands:
:::    -a, add              Create a client conf profile
:::    -c, clients          List any connected clients to the server
:::    -d, debug            Start a debugging session if having trouble
:::    -l, list             List all clients
:::   -qr, qrcode           Show the qrcode of a client for use with the mobile app
:::    -r, remove           Remove a client
:::  -off, off              Disable a user
:::   -on, on               Enable a user
:::    -h, help             Show this help dialog
:::    -u, uninstall        Uninstall pivpn from your system!
:::   -up, update           Updates PiVPN Scripts
:::   -bk, backup           Backup VPN configs and user profiles
Comandos de PiVPN

Así pues, para dar de alta un cliente nuevo, bastará con usar el comando pivpn -a, y, tras introducir un nombre para él, automáticamente se nos creará la configuración necesaria:

ubuntu@wireguard:~$ pivpn -a
Enter a Name for the Client: Android
::: Client Keys generated
::: Client config generated
::: Updated server config
::: WireGuard reloaded
======================================================================
::: Done! Android.conf successfully created!
::: Android.conf was copied to /home/ubuntu/configs for easy transfer.
::: Please use this profile only on one device and create additional
::: profiles for other devices. You can also use pivpn -qr
::: to generate a QR Code you can scan with the mobile app.
======================================================================
Creación de un nuevo cliente

Una vez dado de alta un cliente nuevo, su configuración se encontrará en la carpeta configs del usuario que hayamos configurado en la instalación del servidor, en mi caso /home/ubuntu/configs. Allí, veremos que tenemos un fichero de configuración llamado como nuestro cliente: Android.conf. Su contenido será similar a:

[Interface]
PrivateKey = uJN/8P3R51fqWy+N8kzBIYIAEIKyK7bPA1ZwnVCKn0o=
Address = 10.6.0.2/24
DNS = 94.140.14.14, 94.140.15.15

[Peer]
PublicKey = GE65qUx+HUu6ED4tYsS95YtAxMwu5RJfvwP2SHZqbV0=
PresharedKey = f/mnQhyhrcraLXJJPAx3XOQMBKmSB0VXrK4Xa/9YaEk=
Endpoint = 192.168.64.5:51820
AllowedIPs = 0.0.0.0/0, ::0/0
Configuración del cliente Android.conf

Como veis, es un fichero muy sencillo. En el apartado Interface tenemos la clave que usará el cliente, la dirección IP que tomará al conectarse a nuestro servidor VPN y las direcciones DNS que usará (por si no las conocéis, para el ejemplo estoy usando los servidores de AdGuard DNS, que sirven para filtrar anuncios y bloquear rastreos... ¡Da para una entrada nueva! 📝).

En el apartado de Peer, tenemos la clave pública de nuestro servidor, así como su PresharedKey. Además, vemos un Endpoint y las direcciones IP permitidas, que en nuestro ejemplo son todas (ya que querremos conectarnos desde cualquier sitio). En este apartado. deberemos modificar el Endpoint poniendo, o bien nuestra IP pública del servidor (si ésta es fija), o bien nuestra dirección DDNS. Por ejemplo: En mi casa mi servidor VPN está en una RaspberryPi, pero obviamente, no tengo IP pública estática, con lo que hago uso de DuckDNS para poder tenerlo siempre localizado. Así, deberé reemplazar 192.168.64.5:51820 por midominio.duckdns.org:51820. Es importante recordar que el puerto debe ser abierto en nuestro router si queremos poder conectarnos desde fuera.

Una vez hemos hecho la modificación en nuestro fichero de configuración del cliente, deberemos enviarlo al dispositivo cliente (por Bluetooth, por SFTP, Airdrop... lo que queramos, pero que sea seguro y, a ser posible, sin intermediarios) y allí importarlo en la aplicación (en el caso de MacOS, por ejemplo, mediante la opción Importar túneles desde archivo).

Sin embargo, como podéis ver más arriba, tenemos una opción mucho más cómoda para dispositivos móviles. Si hemos instalado la aplicación oficial de WireGuard (en otras no sé, pero supongo que también estará), veremos que tenemos la opción de importar la configuración mediante un código QR. Pero... ¿cómo podemos hacer esto? Pues de manera tan sencilla como usar el comando pivpn -qr. A continuación seleccionamos el cliente que queremos y ¡listo!. Veremos cómo se nos genera un código QR que podremos usar desde el móvil directamente:

ubuntu@wireguard:~/configs$ pivpn -qr
::  Client list  ::
1) Android
Please enter the Index/Name of the Client to show: 1
::: Showing client Android below
=====================================================================
█████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████
████ ▄▄▄▄▄ ██▄██ ▄▄█▀▄▀▄▀ ▄ ▀█▄█ ▄▄ ▄█ ███ █▄▄▄███ ██ █  █ ▄▄▄▄▄ ████
████ █   █ █▀█▀███▀▀▄███▀  █▀▀ ▄▄█▀▄▀▄▄ ▄▀▀▄▀▀ ▄▀▄▄█ █ ▄ █ █   █ ████
████ █▄▄▄█ █▄ █  ▄ ▀█▄▀▄▀▄▀██▄▀█ ▄▄▄ ▄▄█▀█▄▄▄ ▀▀▀█▀▄▀█ ▄██ █▄▄▄█ ████
████▄▄▄▄▄▄▄█▄▀▄▀▄▀ █ ▀ █ ▀▄█▄▀▄▀ █▄█ █ █▄█ ▀▄▀▄█▄█ █ █▄█▄█▄▄▄▄▄▄▄████
████  ▀▀▀▄▄▄█ ▀ █▀  █▀ ▀█ ▄█▀█ ▀ ▄  ▄▀ ▄ ▄ ███▀▄██ ▀█▀▀█▄▀▀█▄ ▀█▀████
█████ ▄ ▀▀▄ ▀▀█▀▄▀▄▄▄▀ ▀ ▄ ███▀▀▄▄▀ ██ █▀█  ▀▀▀▀ █▀█▄▄▄█▄▀▀▄▀▀█ ▄████
█████▄▄ ▀▄▄▀▄▀██ ██▄██▄▄ █ ▀ ▀▄█▄█  ▄▄▀█▄▀█▀▄▄█▀ █▀▄▀ █▄█▄   ▄ ▄█████
████▀ █▄ ▀▄▀▀▀█▀▀▀▀█ ▀█▄▀▄▀▀█▀▄▀▀▄▄▀▄▄█▀▄▀  ▄██▀ ▀▀▄▀▄ ▄ ██▀█ ▄█▄████
████▄   ▀█▄▄█▀▄▄█▀█████▀█▀█ ▀█▀▄▄▀ ▀█▀▄  ▀▄ █▄█▀ ▀█  ▄ ▀█▄█▀ ▄▀██████
████ ▄ █▀█▄█▀▀▄ ▀▀▀█▄▄▄▄▀  █ ▄ █▄▀ █▄██  █▀▀▄█ ▄▄▀██ ██▄▀▄▀ █▀█ ▀████
████▄ ▄▄ ▀▄  ▄▀▀█▄▀▄▀▄▀█▀█▀ ▀█ █▄█ █ █▄▄  ▀█▀▄▄▀ ▀█▀█ █▄▄▄█████▀▀████
████   █▀▀▄ ▀█▄▄ ▄██▄▄█ ▀ ██▀▀██▄▄█ ██▀▀▄▄ ▄▀▀█▄▄█▄▀▀█▄█▄█ █▀▀█▀▀████
████▄██▀▄█▄▀██ ▄▄ ▀▄▀█▀█▄▄▀█▀█ █▀▄█▄█ █▄▄▀▀  █▀▀▄▄▀██ ███▀ █ ▄█ ▀████
████ ▀▄▀█▀▄█▀ ▀▀▀▄▄█ ▄ ▄▀▄▄█▀█▀▄█▄█▀ ▄▀▄██▀▄ ▄▀▄▀█ █▄█ █ ▀█▀█▀▀ ▄████
█████ ██ ▄▄▄  ██▄ █▀▄▄▄▄█ █▀▀▄██ ▄▄▄ █▄▀▄ ▄ ▄█ ▀▀█ ▄▀█ █ ▄▄▄ █▀▄▀████
█████ ▄  █▄█  ▀ ▀▄ ██ ▀▄▀▄▄▀▀ ▀▄ █▄█ ▄█ █▄█  ▄▄▄▄█ ▄▄█ █ █▄█ █▀ ▄████
████▀███ ▄▄  ▀ ▀██▀ █▀█ ▀▄▀█▄▄ ▄▄  ▄ ▄▄▀▄ ▀▄█ ▀█▄█▀▄ █▄▄  ▄  ▄▄█▀████
████▄▀██▄ ▄▄▀▀█▄▄ ▄  ▀▄▄█  ▄ █▀▀█▀ ▀█▄▀▀ ▄█▄██▄▀▀▄   █▀▄██▄▄ ▀▀ ▀████
████  ██  ▄ ▀▄ ▄▀▄    ▀███  ▄▄▄▄ ▀▄█▀█▄█ █  ██▄████ ▄█▄▄▀ ▀ █ ▀ ▀████
█████ ▀█▄ ▄▀ █ ▀█ ▀▄ ▀  ▄ ▄██▀▀  ▀▀▀▄▄▀█▀██▄██▄ ▄█▀█▀██▀▄███   █ ████
████  █ █▀▄██▀▄█▀▄▄▄ ▀ ▀▀▄▄█ ██▄▀▄ █▄ ▄ ▄▄█ ▀▀ ▄██▀▄▄ █ ▄▀▄▀██▄█ ████
█████▀ ▄██▄█▄ ▄▀█▀▀█▄█  ▀▄ █▄ ▄▄█ █ ▄▄ ▄█▄▄▄▄▀ ▄ ▄▄▄▀█▀█▀▀▄▀▄█▄█ ████
████▀▄ ▀█▄▄█ ▄▄█ █▀▀  ▄▄█▀▀ ▀▀█▀▄▀ ▄██ ▀▄   ▀█▀ ██ ▀ ▄▀ ▀▀▄  █ █ ████
█████▄███▄▄▄▀▄▄▄▀██▀██▄█ █ ██▀▄▄▄▀▄██▄ █▀ ▄ █▄ ▀█▄█▀███ ▄▄▄ █▄▄▄█████
█████ ▄ ▀▀▄ ▀▄▄ ▄█ █▄▄▄  ██▀▄▄▄  ▄ █ ▀█  ▀█▀ █▀█▄▄▄▀ █ ▄▄▄ ▄█▄  ▀████
████▀▀ ▄ ▄▄▄▄▄█▀█ ▀█▀█▄▄▄█▄▄ ▀▄ ▀▀ ▀█▄▀█▀▄▄ ▀█▄█▄█▄█ ▄▀▄▄█ █  ▀██████
████▄▄▄▄██▄▄ █▀▀██▄▄   ▀▄ ▀▄▄▄▄█ ▄▄▄ ▀▀▀▀ █ ▄ ▄▄ ██▀▄ ▄  ▄▄▄ ▀███████
████ ▄▄▄▄▄ █  ▀ ▀  █ ██▄▄▄▀█  ▄▀ █▄█ ▄▀▄▄██ ▄▄ █ █▄ ▀ █  █▄█  ▄  ████
████ █   █ ██▀▀  ▄▄▄ ▄▀▄▀▄▄▀█   ▄▄▄ ▄▀▀▀  █ ▄█ ▀▀▀███▀ ▄ ▄▄▄ ▄▄▄▀████
████ █▄▄▄█ █▀█  ▀ █▄ █▄▄█  ▄ ▀█ ▀█▄▀██▀▀██ ▄ ▄█  ▄ █▄█▄▀▀██  ▄██ ████
████▄▄▄▄▄▄▄█▄█▄▄███▄██▄▄██▄█▄█▄█▄██▄███▄████▄█▄█▄█▄███▄▄██▄▄█▄▄█▄████
█████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████
=====================================================================
Código QR generado para nuestro cliente Android

Dar de baja un cliente

Supongamos que nuestro dispositivo móvil ya no nos hace falta más, lo hemos cambiado por otro mejor, lo hemos perdido, nos lo han robado... Sea lo que sea, y queremos, por seguridad, dar de baja ese cliente. Será tan sencillo como usar el comando pivpn -r y listo.

Eliminar un cliente supone borrar su configuración por completo, por lo que si lo queremos volver a usar, habrá que dar de alta un cliente nuevo.

ubuntu@wireguard:~/configs$ pivpn -r
::  Client list  ::
1) Android
2) MovilViejo
Please enter the Index/Name of the Client to be removed from the list above: 2
Do you really want to delete MovilViejo? [y/N] y
::: Updated server config
::: Client config for MovilViejo removed
::: Client Keys for MovilViejo removed
::: Successfully deleted MovilViejo
::: WireGuard reloaded
Eliminando un cliente de nuestro servidor VPN

Habilitar o deshabilitar un cliente

En lugar de eliminarlo por completo, también podemos deshabilitar de manera temporal un usuario o un dispositivo. Para ello, usaremos el comando pivpn -off y automáticamente ese cliente no podrá conectarse a nuestro servidor hasta que volvamos a habilitarlo, mediante el comando pivpn -on.

Ver los clientes conectados

Para ver el listado de clientes que tenemos registrados y los que, actualmente, están conectados a nuestro servidor, podemos hacer uso de los comandos pivpn -l y pivpn -c, respectivamente:

ubuntu@wireguard:~/configs$ pivpn -l
::: Clients Summary :::
Client          Public key                                        Creation date
Android         QbsCOfEhnkhFtoggYrrlZ09X5gKvR8l/S8OxcO1bEh4=      19 Feb 2022, 20:55, CET
MovilViejo      IcEcohcd1EGBeYQV+QgJfND+S4TB4UPjepldxoV6pjE=      19 Feb 2022, 21:27, CET
::: Disabled clients :::
[disabled]   MovilViejo
Listado de clientes activos e inactivos
ubuntu@wireguard:~/configs$ pivpn -c
::: Connected Clients List :::
Name         Remote IP      Virtual IP      Bytes Received      Bytes Sent      Last Seen
Android      (none)         10.6.0.2        0B                  0B              (not yet)
::: Disabled clients :::
[disabled]   MovilViejo
Listado de clientes conectados en ese momento o última hora de conexión

Crear copias de seguridad de clientes y configuración

Por último, es útil tener una copia de seguridad de nuestros clientes , sus claves públicas y privadas, y de la configuración del servidor, ya que en caso de necesitar realizar una reinstalación o mover todo a un nuevo servidor, no querremos volver a configurar todo desde 0 y dar de alta todos los clientes de nuevo, ¿no?

Para hacer un backup de todo esto, PiVPN nos lo pone bastante fácil. Bastará con usar el comando pivpn -bk y automáticamente nos creará un ZIP con todo lo necesario para una migración de nuestro servidor VPN.

ubuntu@wireguard:~/configs$ pivpn -bk
Backup created in /home/ubuntu/pivpnbackup/20220219-213035-pivpnwgbackup.tgz
To restore the backup, follow instructions at:
https://docs.pivpn.io/wireguard/#migrating-pivpn-wireguard
Creación de la copia de seguridad de nuestro servidor WireGuard

Si accedemos a la ruta que nos muestra y descomprimimos dicho ZIP (que, por cierto, se genera para el usuario root, por temas de seguridad), veremos que contiene lo siguiente:

ubuntu@wireguard:~/pivpnbackup$ sudo tar xvzf 20220219-213035-pivpnwgbackup.tgz
etc/wireguard/
etc/wireguard/keys/
etc/wireguard/keys/Android_pub
etc/wireguard/keys/server_priv
etc/wireguard/keys/Android_priv
etc/wireguard/keys/Android_psk
etc/wireguard/keys/server_pub
etc/wireguard/configs/
etc/wireguard/configs/clients.txt
etc/wireguard/configs/Android.conf
etc/wireguard/wg0.conf
home/ubuntu/configs/
home/ubuntu/configs/Android.conf
Contenido de nuestro fichero de backup

Como podéis ver, están tanto las configuraciones del servidor de WireGuard (claves privadas, claves públicas de los peer, configuración del servidor en sí...) como las configuraciones de los clientes, cada una dentro de su directorio original. De forma que nos es muy sencillo migrar todo a un servidor nuevo sin necesidad de configurar todo de nuevo 😀.

¡Y hasta aquí la segunda parte del tutorial! Espero que os sea muy útil y si tenéis alguna duda, no dudéis en dejar un comentario o contactarme por cualquiera de las vías que tengo publicadas, que os responderé encantado (si tardo no os preocupéis, lo hago en cuanto puedo).

Si te ha gustado la entrada, o te ha sido útil y quieres ayudarme a pagar los gastos que conlleva el servidor y mantener así el blog libre completamente de anuncios, puedes hacer una donación en Bitcoin en la siguiente dirección: