Como crear un VPN con wireguard

Wireguard es un VPN moderno, seguro y ultra rápido que funciona en una multitud de sistemas operativos y que opera especialmente bien con el kernel de linux.

De manera general nos da conexiones mucho mas rápidas que las de OpenVPN y es ademas mucho mas facil de configurar

Instalar wireguard

El primer paso que debemos dar es instalar wireguard, recuerda que debes tener el wireguard instalado tanto en el servidor como en el cliente. El proceso para instalar es sencillo pero es dependiente de tu sistema operativo y en cada uno se instala de forma diferente:

Windows

Descargar la utilidad de wireguard desde el enlace oficial

MacOS

Para la instalación en MacOS solo debemos descargar la aplicación desde la App Store, puedes buscarla directamente o ir al link de descarga, Si tienes MacPorts o Homebrew también puedes instalar con esos métodos con:

$ brew install wireguard-tools
$ port install wireguard-tools

Android

Descargar en la PlayStore Descargar en F-Droid Pero si usas termux también puedes descargarlo con:

$ pkg install wireguard-tools

iOS

Descargar en la App Store

BSD

OpenBSD:

$ doas pkg install wireguard-tools

FreeBSD:

$ doas pkg_add wireguard-tools

Linux

Arch:

$ sudo pacman -S wireguard-tools

Debian:

$ sudo apt install wireguard

Fedora:

$ sudo dnf install wireguard-tools

Gentoo:

$ doas emerge wireguard-tools

En la pagina oficial se listan las instalaciones para: Mageia, SUSE, Slackware, Alpine, Exherbo, NixOs, Darwin, OpenWRT, Oracle linux 8, RHEL 8, Centos 8 (RIP), Oracle linux 7, RHEL 7, Centos 7, Void, Adelie Linux, Source Mage, Buildroot, EdgeOS, LinuxKit, AstLinux y Millis por si te parecían ya pocas las opciones anteriores, todo en este link.

Generar las llaves

El siguiente paso es generar las llaves publicas y privadas que se necesitaran para poder configurar de manera adecuada todos los equipos que se conectaran en esta VPN.

Primero creamos la carpeta /etc/wireguard/ en cada ordenador que sera parte de la red y luego vamos a generar las llaves

$ wg genkey | tee privatekey | wg pubkey > publickey

Esto nos generara los archivos privatekey y publickey, el publico se utiliza en la configuración que tendremos en cada maquina, mientras el privado se queda solo en el ordenador donde lo hemos generado.

Configurando la red

Normalmente la red la configuraremos en el archivo que debemos crear, /etc/wireguard/wg0.conf, y hacer las configuraciones de paso que nos hagan falta. Estas configuraciones van a depender del la necesidad que tengamos y como utilizaremos la red.

Una sola conexión

En el caso de que solo queremos una conexión privada entre una maquina y un servidor entonces la configuración quedaría muy sencilla, solo hay que agregar las IP y las llaves correspondientes en cada parte.

El wg0.conf en el servidor quedaría así:

[Interface]
Address = 10.0.1.1
PrivateKey = <server's privatekey>
ListenPort = 51820

[Peer]
PublicKey = <client's publickey>
AllowedIPs = 10.0.1.2/32

Mientras que en el cliente quedaría de la siguiente manera:

[Interface]
Address = 10.0.1.2
PrivateKey = <client's privatekey>
ListenPort = 21841

[Peer]
PublicKey = <server's publickey>
Endpoint = <server's ip>:51820
AllowedIPs = 10.0.1.0/24

# Usamos un keepalive si estamos detras de un NAT
# Y queremos mantener la conexion viva
PersistentKeepalive = 25

Una vez tengamos esto listo ya podemos iniciar la conexión de cada lado, esto es mediante el comando wg-quick up wg0 en los sistemas operativos unix-like o presionando el botón de conectar en los casos que contemos con interfaces de usuario. Se debe correr el comando de inicialización en ambos equipos

En la configuración anterior se eligieron las IP internas de 10.0.1.1 y 10.0.1.2 , y por ello, en caso de que nuestros IP reales estén en esa misma subred se tendrá que cambias estas IP internas a algo como por ejemplo 11.1.1.x.

Acceder a la LAN de tu casa o empresa

En caso de que queramos acceder a la LAN del lado del servidor entonces vamos a necesita agregar algo extra de configuración al final de la sección [Interface] en la configuración del servidor:

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

Esto es asumiendo que la conexión a la LAN de nuestro server es la eth0, lo que debemos cambiar en caso de no ser así. También debemos agregar la subred de la LAN del servidor en la parte de AllowedIPs del cliente:

AllowedIPs = 10.0.1.0/24, 192.168.1.0/24

En este ejemplo la LAN del servidor es 192.168.1.0/24, y la agregamos acá para que nuestro cliente pueda saber que si vamos a conectarnos a una de estas IP las puede buscar mediante la conexión VPN, mientras que el resto de nuestro uso de red seguirá pasando por fuera de la VPN.

Enviar todo tu trafico a traves del VPN

Esta para muchos seria la opción mas interesante, y utilizar la VPN como se le conoce tradicionalmente, para hacer que toda nuestra conexión pase a través de la VPN y así poder aparentar una locación diferente, ya sea por privacidad o para alcanzar a un servicio no disponible en nuestro país.

Para esta configuración la única parte diferente sera que cambiaremos la parte de AllowedIPs del cliente para que en lugar de solo incluir la LAN pueda incluir también toda la navegación, y esa linea quedaría así:

AllowedIPs = 0.0.0.0/0, ::/0

Esto nos permitirá enrutar todas las peticiones a través de nuestro servidor VPN creado por nosotros mismos. Y en el servidor en la parte de [INTERFACE] vamos a cambiar la parte de PostUp y PostDown por la siguiente:

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

Configuraciones extra del sistema para IP forwarding

vamos a activar el IP forwarding descomentando la linea net.ipv4.ip_forward=1 del archivo etc/sysctl.conf y luego ejecutando el comando de control de sistema sysctl -p /etc/sysctl.conf

Configurando la seguridad del VPN

Una ultima nota es que deberíamos cambiar los permisos del directorio de config de wireguard, en este caso nos bastara con correr los comandos:

$ sudo chown -R root:root /etc/wireguard/
$ sudo chmod -R og-rwx /etc/wireguard/*

Y si tu sistema operativo linux utiliza systemd (Como es el caso de la gran mayoría de distribuciones linux) entonces para que esto sea permanente al reiniciar el equipo solo debemos correr sudo systemctl enable wg-quick@wg0.service

Listo

Ahora que ya configuramos todo, podemos disfrutar de nuestra nueva VPN y probar su efectividad mediante herramientas de red o paginas que te muestran tu IP externa.

Esto ha sido todo en esta guía, espero les sea de provecho.

Adaptado al idioma espanol de esta guia

Creado por Oscar J. Rodriguez B. (2023)