Tu propia VPN con WireGuard
Intermedio
Los pasos marcados en azul cambian según tu sistema.
Las VPN comerciales prometen privacidad, pero lo que hacen es cambiar de manos tu confianza: en lugar de tu operador, ve tu tráfico una empresa que gana dinero con él o con tus datos. Con una VPN propia, el otro extremo del túnel es un servidor tuyo.
Sirve para dos cosas. La primera, llegar a tus servicios sin exponerlos a internet: el panel de administración, SSH, tu Pi-hole o cualquier cosa que solo uses tú puede quedarse cerrada al mundo y abierta dentro del túnel. La segunda, navegar tranquilo en la wifi del hotel, la biblioteca o el aeropuerto: nadie en esa red verá qué haces.
Lo que no te da es anonimato. Tu tráfico saldrá a internet con la IP de tu servidor, que está a tu nombre.
WireGuard es la forma más sencilla y rápida de montarlo. Va integrado en el núcleo de Linux, tiene una fracción del código de OpenVPN o IPsec y usa criptografía moderna sin opciones que configurar mal. Hay apps oficiales para todos los sistemas.
Lo que necesitas
- Un servidor con IP pública, un usuario con
sudoy el cortafuegos activo. Si partes de cero, sigue antes los primeros pasos de un servidor Linux. - El nombre de su interfaz de red pública. Averígualo así:
ip route show default
default via 203.0.113.1 dev eth0 proto static
Lo que va detrás de dev es tu interfaz: aquí, eth0. Puede llamarse ens3, enp1s0 u otra cosa; donde en este tutorial ponga eth0, escribe la tuya.
Paso 1: instalar
Ubuntu
Instala WireGuard y qrencode, que te servirá para pasar la configuración al móvil con un código QR:
sudo apt update
sudo apt install wireguard qrencode
Debian
Instala WireGuard y qrencode, que te servirá para pasar la configuración al móvil con un código QR:
sudo apt update
sudo apt install wireguard qrencode
AlmaLinux / Rocky
WireGuard ya viene en el núcleo de AlmaLinux y Rocky; solo faltan las herramientas. qrencode, que te servirá para pasar la configuración al móvil con un código QR, está en EPEL:
sudo dnf install epel-release
sudo dnf install wireguard-tools qrencode
Paso 2: las claves del servidor
Cada extremo del túnel tiene una pareja de claves: una privada, que nunca sale de su máquina, y una pública, que se da al otro extremo. Genera las del servidor:
wg genkey | sudo tee /etc/wireguard/servidor.key | wg pubkey | sudo tee /etc/wireguard/servidor.pub
sudo chmod 600 /etc/wireguard/servidor.key
La segunda línea que aparece en pantalla es la clave pública. Ten las dos a mano; puedes volver a verlas con sudo cat seguido del nombre del archivo.
Paso 3: la configuración del servidor
El túnel será una red privada propia, 10.8.0.0/24. El servidor tendrá la dirección 10.8.0.1 y cada aparato que conectes, la siguiente libre. Crea el archivo:
sudo nano /etc/wireguard/wg0.conf
Ubuntu
/etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = (el contenido de servidor.key)
# Lo que salga del túnel hacia internet lo hace con la IP del servidor
PostUp = iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Las líneas PostUp y PostDown añaden y quitan la regla que hace de «router»: el tráfico de tus aparatos sale a internet como si fuera del propio servidor.
Debian
/etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = (el contenido de servidor.key)
# Lo que salga del túnel hacia internet lo hace con la IP del servidor
PostUp = iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Las líneas PostUp y PostDown añaden y quitan la regla que hace de «router»: el tráfico de tus aparatos sale a internet como si fuera del propio servidor.
AlmaLinux / Rocky
/etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = (el contenido de servidor.key)
En AlmaLinux y Rocky, la parte de «router» (que el tráfico de tus aparatos salga a internet como si fuera del servidor) la hará firewalld en el paso siguiente.
Paso 4: dejar pasar el tráfico
Para que el servidor reenvíe el tráfico del túnel hacia internet, el núcleo tiene que permitirlo. Actívalo de forma permanente:
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
Y abre el cortafuegos:
Ubuntu
sudo ufw allow 51820/udp
sudo ufw route allow in on wg0 out on eth0
sudo ufw allow in on wg0
- La primera regla abre el puerto de WireGuard. Es UDP: si no tienes la clave correcta, el servidor ni siquiera contesta, así que para un escáner de puertos parece cerrado.
- La segunda deja que lo que entra por el túnel salga hacia internet.
- La tercera deja que tus aparatos lleguen a los servicios del propio servidor a través del túnel. Así podrás cerrar al público lo que solo usas tú.
Debian
sudo ufw allow 51820/udp
sudo ufw route allow in on wg0 out on eth0
sudo ufw allow in on wg0
- La primera regla abre el puerto de WireGuard. Es UDP: si no tienes la clave correcta, el servidor ni siquiera contesta, así que para un escáner de puertos parece cerrado.
- La segunda deja que lo que entra por el túnel salga hacia internet.
- La tercera deja que tus aparatos lleguen a los servicios del propio servidor a través del túnel. Así podrás cerrar al público lo que solo usas tú.
AlmaLinux / Rocky
sudo firewall-cmd --permanent --zone=public --add-port=51820/udp
sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --reload
La primera regla abre el puerto de WireGuard. Es UDP: si no tienes la clave correcta, el servidor ni siquiera contesta, así que para un escáner de puertos parece cerrado. La segunda hace de «router». Como la interfaz del túnel no tiene zona asignada, cae en la zona public, la misma que la interfaz de internet, y firewalld deja pasar el tráfico entre ellas.
Paso 5: arrancar
sudo systemctl enable --now wg-quick@wg0
sudo wg
interface: wg0
public key: 7mXz...Qk8=
private key: (hidden)
listening port: 51820
El túnel está levantado y esperando. Aún no tiene a nadie con quien hablar.
Paso 6: tu primer aparato
Para el móvil, lo más cómodo es generar sus claves en el servidor y pasárselas con un código QR. Crea una carpeta para los clientes y las claves del móvil:
sudo mkdir -m 700 /etc/wireguard/clientes
wg genkey | sudo tee /etc/wireguard/clientes/movil.key | wg pubkey | sudo tee /etc/wireguard/clientes/movil.pub
Primero, presenta el móvil al servidor. Añade al final de wg0.conf un bloque [Peer] con su clave pública y la dirección que tendrá dentro del túnel:
/etc/wireguard/wg0.conf
[Peer]
# Móvil
PublicKey = (el contenido de movil.pub)
AllowedIPs = 10.8.0.2/32
Reinicia el túnel para que lo lea:
sudo systemctl restart wg-quick@wg0
Después, escribe la configuración que se llevará el móvil:
sudo nano /etc/wireguard/clientes/movil.conf
/etc/wireguard/clientes/movil.conf
[Interface]
PrivateKey = (el contenido de movil.key)
Address = 10.8.0.2/32
DNS = 9.9.9.9
[Peer]
PublicKey = (el contenido de servidor.pub)
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Endpointes la IP pública de tu servidor (o su dominio) y el puerto.AllowedIPsdecide qué tráfico entra en el túnel. Con0.0.0.0/0, ::/0va todo: es lo que quieres en una wifi pública, y así nada se escapa por IPv6. Si solo quieres llegar a tus servicios y navegar por tu conexión de siempre, pon10.8.0.0/24.DNSes el servidor que resolverá los nombres mientras el túnel esté activo. Aquí, Quad9, un servicio sin ánimo de lucro con sede en Suiza. Si tienes un Pi-hole accesible desde el servidor, pon su dirección y te llevarás el bloqueo de anuncios a cualquier sitio.PersistentKeepalivemanda una señal cada 25 segundos para que el router de la red en la que estés no cierre el túnel por inactividad.
Saca el código QR en la terminal:
sudo qrencode -t ansiutf8 -r /etc/wireguard/clientes/movil.conf
En el móvil, instala la app WireGuard (en F-Droid, Google Play o la App Store), pulsa +, elige escanear un código QR y apunta a la pantalla. Cuando lo tengas importado, borra del servidor la clave privada del móvil, que ya no pinta nada allí:
sudo rm /etc/wireguard/clientes/movil.key /etc/wireguard/clientes/movil.conf
Paso 7: comprobar que funciona
Activa el túnel en el móvil, desconéctate de la wifi y busca «cuál es mi IP» en el navegador: debería salir la de tu servidor. En el servidor, sudo wg muestra ahora al móvil, con la hora de su último saludo y lo que ha transferido:
peer: Hk2p...fA0=
endpoint: 198.51.100.23:40112
allowed ips: 10.8.0.2/32
latest handshake: 12 seconds ago
transfer: 1.24 MiB received, 8.91 MiB sent
Si no aparece ningún saludo (handshake), revisa por este orden: el puerto 51820/udp en el cortafuegos (y en el del proveedor, si tiene uno aparte), la IP del Endpoint y que cada clave pública esté en el lado que le toca.
Más aparatos
Cada aparato necesita sus propias claves y su propia dirección: 10.8.0.3, 10.8.0.4, etc. Nunca compartas una misma configuración entre dos.
- Android e iPhone: como el móvil de este tutorial, con un código QR.
- Windows y macOS: la app oficial (para Windows, en wireguard.com; para macOS, en la App Store) genera las claves ella misma. Crea un túnel vacío, copia su clave pública al bloque
[Peer]del servidor y completa el resto de la configuración en la app. - Linux con escritorio: guarda la configuración en un archivo e impórtala en NetworkManager con
nmcli connection import type wireguard file wg-portatil.conf. Aparecerá en el menú de red como cualquier otra conexión.
Para echar a un aparato (porque lo has perdido o ya no lo usas), borra su bloque [Peer] de wg0.conf y reinicia el túnel.
Listo
Tienes un túnel cifrado hasta tu servidor, a un toque desde el móvil. Ahora puedes cerrar al público lo que solo usas tú: por ejemplo, permitir SSH solo desde la red del túnel (en UFW, sudo ufw allow from 10.8.0.0/24 to any port 22 y después borrar la regla general), que es la protección más fuerte que hay contra los bots que describe Frena a los bots con Fail2Ban. Antes de borrar la regla general, comprueba que entras por el túnel; si no, te quedarás fuera.
