Laboratorio
Intermedio
cableando
Tu propia VPN con WireGuard

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 sudo y 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
  • Endpoint es la IP pública de tu servidor (o su dominio) y el puerto.
  • AllowedIPs decide qué tráfico entra en el túnel. Con 0.0.0.0/0, ::/0 va 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, pon 10.8.0.0/24.
  • DNS es 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.
  • PersistentKeepalive manda 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.

X LinkedIn
¿Te ha resultado útil?

Sigue leyendo

Que tu servidor se parchee solo

Tutorial / Sistemas

Que tu servidor se parchee solo

Las vulnerabilidades graves se aprovechan en horas. Activa las actualizaciones de seguridad automáticas, con reinicio de madrugada solo cuando haga falta.

/8 min

Cifra el disco de tu ordenador

Tutorial / Sistemas

Cifra el disco de tu ordenador

Si te roban el portátil, que solo se lleven el aparato: cifrado completo con LUKS, FileVault o BitLocker, y dónde guardar la llave de recuperación.

/12 min

Copias de seguridad cifradas con restic

Tutorial / Sistemas

Copias de seguridad cifradas con restic

Copias diarias, cifradas antes de salir de tu equipo y sin duplicados, a otro servidor, un disco o la nube. Y una restauración que hayas probado.

/16 min