Tu propia VPN con WireGuard

Es posible que no tenga una IP fija en casa o en el trabajo, y que quieras filtrar los accesos a tu WordPress a una IP concreta. Y para esto tenemos las VPN.

Si bien es cierto que las VPN comerciales varían las direcciones IP por seguridad, es posible montar tu propia VPN profesional, con tu propio control, y de forma bastante barata. Una VPN puede costarte unos 10 euros mensuales (100 euros anuales) pero un servidor VPN en un VPS puede costarte unos 3 euros/mes, además de que será sólo para ti.

Este tutorial ha sido creado en un VPS de Clouding.io. Puedes crear tu propio VPS desde 3€/mes.

Además, tienes la posibilidad de crear tu VPS con la imagen de WordPress en un clic.

COLABORACIÓN

Para este ejemplo vamos a disponer de un servidor con Ubuntu 20, y nada más. En principio este sistema permitiría instalarse en cualquier servidor, incluso en uno que ya esté usándose para otros servicios.

IMPORTANTE: Algunos proveedores tienen un cortafuegos (firewall), por lo que si proveedor lo tiene, deberás abrir el puerto 51820 (UDP) para la conexión con WireGuard.

Configurando el servidor

Lo primero que haremos es poner al día el servidor con Ubuntu. Primero consfiguraremos la hora y la zona horaria universal.

timedatectl set-timezone UTC
timedatectl set-ntp on

Posteriormente haremos una actualización de todo el sistema.

apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove

Instalaremos algunas herramientas útiles.

apt -y install software-properties-common curl vim zip unzip apt-transport-https

Y la instalación de actualizaciones automáticas de seguridad.

apt -y install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

Como vamos a usar este servidor para reenviar tráfico, hemos de validar que esto esté permitido. En el fichero buscaremos estas líneas (vienen por defecto desactivadas). Si están, quitaremos la # de delante.

vim /etc/sysctl.conf

Dejando la configuración activada.

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Y activaremos la configuración.

sysctl -p

Instalando WireGuard

Por suerte, esta VPN viene de serie con Ubuntu 20, por lo que simplemente tendremos que instalarla.

apt -y install wireguard

Como requiere del control del kernel del sistema, validaremos que esté disponible.

modprobe wireguard
lsmod | grep wireguard

Si todo ha ido bien, veremos las siguientes líneas:

wireguard             212992  0
ip6_udp_tunnel         16384  1 wireguard
udp_tunnel             16384  1 wireguard

Configurando WireGuard

Antes de comenzar necesitamos conocer algunos datos.

Ahora deberemos ver qué interfaz de red tiene nuestro servidor. Por norma general veremos el «lo» (que es el que llama a la propia máquina) y algún otro de tipo broadcast que es el que se conecta de forma pública a internet. En nuestro caso es «eth0».

ip link show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
  link/ether fa:16:3e:1f:91:a2 brd ff:ff:ff:ff:ff:ff

Ahora que sabemos por dónde se ha de conectar, configuraremos WireGuard. Lo primero será acceder a la carpeta de configuración y establecer unos mínimos de seguridad para esos ficheros.

cd /etc/wireguard
umask 077

Y crearemos las claves de seguridad de este servidor.

wg genkey | tee server_private.key | wg pubkey | tee server_public.key

Esto generará dos ficheros que podemos ver si los listamos.

-rw-------   1 root root   45 Mar 20 11:04 server_private.key
-rw-------   1 root root   45 Mar 20 11:04 server_public.key

Para saber el <Server_Private_Key>:

cat server_private.key

Que nos devolverá un código parecido a este:

cBM+jwqXBH94Fyp5+qILQozfV7lEmnloZPWMdZY5KXQ=

Haremos lo mismo para saber el <Server_Public_Key>:

cat server_public.key

Que nos devolverá un código similar a este:

B+EXkrZs2xEQLrKskg+wlyWnN60kOnYTnwJTjZKlGjs=

Ahora que ya tenemos las claves públicas y privadas, montaremos la configuración del Wireguard. Para ello debemos crear el fichero de configuración.

vim /etc/wireguard/wg0.conf

E incluiremos el siguiente contenido:

[Interface]
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PrivateKey = cBM+jwqXBH94Fyp5+qILQozfV7lEmnloZPWMdZY5KXQ= # Aquí pondremos la <Server_Private_Key>

Lo siguiente que hemos de revisar es que el firewall de la máquina permita el tráfico:

ufw route allow in on wg0
ufw allow 51820/udp

Y ya podremos levantar el WireGuard y establecerlo como un servicio, de forma que aunque se reinicie la máquina, se vuelva a arrancar automáticamente.

wg-quick up wg0
systemctl enable wg-quick@wg0

Para saber si todo ha funcionado correctamente, podemos ejecutar un comando y validar que WireGuard está activo.

wg show wg0

Que nos mostrará algo parecido a esto:

interface: wg0
  public key: B+EXkrZs2xEQLrKskg+wlyWnN60kOnYTnwJTjZKlGjs=
  private key: (hidden)
  listening port: 51820

Configurando el cliente de WireGuard

Ahora que tenemos el servidor VPN funcionando, hemos de configurar los clientes.

En este caso voy a usar de ejemplo el de Windows. Una vez instalado, crearemos una nueva conexión en blanco. Esta conexión nos generará una clave pública y una privada.

Cliente de WireGuard con una nueva conexión.

Tenemos de ejemplo las claves generadas, que son:

cliente_private.key: IP3QLKKG4R2u/KO0Ek1WvBsUAhe099muBj+e6QviYF8=
cliente_public.key: FaEbJJcA0V/6E8Z9uPNsVVT4QanvOREXXLkVkQ2ncgI=

Con estos datos, y los datos del servidor, podremos configurar la cuenta:

Cliente de WireGuard con la conexión configurada.
[Interface]
PrivateKey = IP3QLKKG4R2u/KO0Ek1WvBsUAhe099muBj+e6QviYF8=
Address = 10.0.0.2/32
DNS = 8.8.8.8, 1.1.1.1

[Peer]
PublicKey = B+EXkrZs2xEQLrKskg+wlyWnN60kOnYTnwJTjZKlGjs=
AllowedIPs = 0.0.0.0/0
Endpoint = 185.253.153.43:51820
PersistentKeepalive = 15

En el Address configuraremos la siguiente IP de la lista de las del servidor (en el servidor eran 10.0.0.1/24) y aquí configuraremos exclusivamente 1 IP, que será la siguiente, 10.0.0.2/32. Si creamos otro usuario, aplicaríamos la misma fórmula, por lo que sería 10.0.0.3/32 y así sucesivamente.

En la PublicKey configuraremos la clave pública del servidor, y en el Endpoint pondremos la IP pública del servidor y el puerto. Esta dirección IP será con la que una vez estemos conectados navegaremos, y será nuestra IP fija.

Guardaremos esta configuración y nos volveremos al servidor a conectar este nuevo usuario.

Configurando el cliente en el servidor

Iremos de nuevo al servidor y, lo primero, apagaremos el WireGuard.

wg-quick down wg0

Abriremos el fichero de configuración para añadir al final los nuevos datos.

vim /etc/wireguard/wg0.conf

En este caso pondremos la clave pública del cliente y la misma dirección IP.

[Peer]
PublicKey = FaEbJJcA0V/6E8Z9uPNsVVT4QanvOREXXLkVkQ2ncgI=
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 15

Una vez guardado, podremos volver a encender el WireGuard.

wg-quick up wg0

Para validar que todo funciona correctamente, mostraremos la configuración de la VPN.

wg show wg0

Ahora ya no sólo nos mostrará los datos del servidor, sino también del primer usuario.

interface: wg0
  public key: B+EXkrZs2xEQLrKskg+wlyWnN60kOnYTnwJTjZKlGjs=
  private key: (hidden)
  listening port: 51820
peer: FaEbJJcA0V/6E8Z9uPNsVVT4QanvOREXXLkVkQ2ncgI=
  allowed ips: 10.0.0.2/32
  persistent keepalive: every 15 seconds

Activar y validar

Volveremos al cliente y lo conectaremos.

Cliente de WireGuard conectado.

Si todo tiene luz verde, podremos conectarnos a DuckDuckGo y validar nuestra nueva IP.

Your IP address is 185.253.153.43 in Europe, Spain, Spain

A partir de este momento puedes utilizar esta configuración para cualquier dispositivo, y navegar con esta IP fija que sólos erá tuya.

Podrás configurar en tu servidor los filtros de conexión sólo por IP y de esta forma que nadie más pueda conectarse.


Sobre este documento

Este documento está regulado por la licencia EUPL v1.2, publicado en WP SysAdmin y creado por Javier Casares. Por favor, si utilizas este contenido en tu sitio web, tu presentación o cualquier material que distribuyas, recuerda hacer una mención a este sitio o a su autor, y teniendo que poner el material que crees bajo licencia EUPL.