Instalar y configurar WireGuard VPN en Debian 10

Aprendemos a instalar y configurar WireGuard VPN en una distribución con Debian 10. La verdad es que a raíz de los últimos acontecimientos que están afectando a todos los países del mundo, a causa de la pandemia del nuevo coronavirus, la creación y gestión de VPN esta al orden del día. Con esta esta entrada pretendo aportar mi granito de arena, facilitando la instalación y configuración de esta popular herramienta.

Para la ocasión, como viene siendo habitual en los últimos meses, utilizaré un VPS en mi proveedor de confianza Clouding.io. Además, utilizaremos una imagen con Debian 10, que ha sido unas de las últimas en incorporarse en la familia de distribuciones ofrecidas por este proveedor, ubicado en mi ciudad, Barcelona. Pero empecemos por el principio.

¿Qué es una VPN?

Una VPN, esto es, una red privada virtual, permite crear una conexión a otra red, a través de Internet. Se utilizan, por ejemplo, para acceder a la red de un cliente que gestionemos, a la red de nuestra propia oficina, si trabajamos desde casa, para proteger nuestra navegación de miradas indiscretas o para saltarse las restricciones que podamos tener en el lugar donde vivamos.

A nivel un poco más técnico, permite que el ordenador en la red envíe y reciba datos sobre redes compartidas o públicas como si fuera una red privada con toda la funcionalidad, seguridad y políticas de gestión de una red privada. Esto se realiza estableciendo una conexión virtual punto a punto mediante el uso de conexiones dedicadas, cifrado o la combinación de ambos métodos.

Funcionamiento VPN (Créditos Wikipedia)

¿Qué es WireGuard?

WireGuard es una VPN simple, rápida y segura que utiliza una tecnología de criptografía avanzada. Su intención es ser más rápida y ágil que otros protocolos VPN como OpenVPN e IPSec. WireGuard todavía está en desarrollo, pero incluso en su estado no optimizado es más rápido que el popular protocolo OpenVPN.

Su configuración, si la comparamos con otros productos similares, es realmente simple, similar a lo que sería configurar SSH. La conexión se establece mediante un intercambio de llaves públicas entre el servidor y el cliente. Solo un cliente que tenga su clave pública en el archivo de configuración del servidor puede conectarse.

WireGuard se encarga de configurar las interfaces de red, como por ejemplo wg0 o wg1, que se comportan de manera similar a la interfaz más típica eth0. Esto hace posible configurar y administrar interfaces WireGuard utilizando herramientas comunes como ifconfig e ip.

Instalación de WireGuard en Debian 10

Una vez ya hemos accedido a nuestro VPS con Debian 10 y contando que tenemos acceso de ‘root’ o bien contamos con un usuario con privilegios de ‘sudo’, añadimos el repositorio oficial, siguiendo las instrucciones del proveedor, que podemos consultar: https://www.wireguard.com/install/

Esto es:

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
apt update
apt install wireguard

Ahora, como comentamos en párrafos anteriores, debemos crear la nuevas llaves, tanto la pública como la privada.

cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

Una vez hecho esto debemos crear el fichero /etc/wireguard/wg0.conf, con la siguiente configuración:

[Interface]
Address = 192.168.x.y
PrivateKey =
ListenPort = 51820
 
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0

Además, si es necesario:

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; \
ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; \
ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Ojo, que las reglas de iptables deben estar justo después de la sección «[Interface]» y justo antes de «[Peer]»

Esta configuración la debemos adaptar a nuestras necesidades, esto es, debemos añadir nuestra llave privada, la dirección que queramos utilizar para la VPN y el puerto de escucha, todo esto dentro de la primera sección llamada «[Interface]». Justo después, en la sección «[Peer]», debemos agregar la lleva pública del cliente que se va conectar, esto es imprescindible!!!

Habilitamos el forwarding:

sysctl -w net.ipv4.ip_forward=1

Añadimos las reglas del cortafuegos, imprescindible para tener salida a Internet desde el servidor:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 51820 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.10.0/24 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.10.0/24 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT

Si utilizamos algún gestor de cortafuegos, como por ejemplo UFW, debemos habilitar los siguientes puertos:

ufw allow 22/tcp
ufw allow 51820/udp
ufw enable

Hacemo que los cambios sean permanentes:

apt install iptables-persistent -y
systemctl enable netfilter-persistent
netfilter-persistent save

Encender el servicio en el servidor

Ahora ya podemos encender el servicio:

wg-quick up wg0

En mi caso en esta parte me ha aparecido este error:

[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported

Lo he solventado instalando los siguientes paquetes:

apt install wireguard-dkms wireguard-tools linux-headers-$(uname -r)

Si todo ha ido bien:

root@servplaton:/etc/wireguard# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.10.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0

Habilitamos el servicio al arranque:

systemctl enable wg-quick@wg0

Comprobamos que la VPN efectivamente está habilitada:

wg show

Configurar la parte del cliente

Aprendemos a configurar la VPN desde la parte del cliente. Contando que también estamos utilizando una distribución GNU/Linux. Esta parte es bastante similar a la parte del servidor. Esto es, debemos habilitar el repositorio e instalar la herramienta, tal y como hemos indicado en pasos anteriores. Os podéis seguir de las instrucciones del enlace a la web oficial, si utilizáis otra distribución.

En este caso también tenemos que crear el par de llaves:

umask 077
wg genkey | tee privatekey | wg pubkey > publickey

Y crear el fichero de configuración en /etc/wireguard/wg0.conf , en este caso sensiblemente diferente al del servidor:

[Interface]
Address = 192.168.2.2
PrivateKey =
ListenPort = 21841
 
[Peer]
PublicKey = 
Endpoint = :51820
AllowedIPs = 192.168.2.0/24

Lo mismo, debemos añadir la llave privada correspondiente e indicar la llave pública del servidor al cuál queremos conectarnos.

En el apartado llamado «EndPoint», añadimos la IP del servidor VPN más el puerto correspondiente.

Ahora solo nos falta arrancar el servicio, para así realizar la conexión:

wg-quick up wg0

Y si queremos habilitar la conexión al arranque:

systemctl enable wg-quick@wg0

Comprobamos que se produce la conexión entre los hosts:

root@servdebian10:/# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=32.8 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=36.4 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=44.7 ms

Os recomiendo el vídeo del amigo Eduardo Collado, donde explica muy bien justo lo que os he contado yo, pero mejor 🙂

También podéis echar un vistazo a su magnífica web: Eduardocollado.com

Y esto es todo, espero que esta entrada os pueda ser de utilidad en algún momento. Nos vamos leyendo.

Para más info podemos consultar la configuración en la página de documentación de WireGuard en Github.