WireGuard
WireGuard es un protocolo y programa de VPN libre, moderno y muy rápido. Lo creó Jason A. Donenfeld y se presentó en 2016 con una idea clara: que una VPN fuera tan sencilla de configurar como SSH, con un código pequeño y fácil de auditar. Está integrado en el kernel de Linux desde la versión 5.6 (2020) y tiene clientes oficiales para Windows, macOS, Android e iOS. Muchos servicios VPN comerciales y routers domésticos ya lo usan como protocolo principal.
Ficha del programa
- Web oficial: wireguard.com/install.
- Autor: Jason A. Donenfeld (proyecto WireGuard).
- Sistemas: Linux (integrado en el kernel desde la 5.6), Windows 10 y 11, macOS, FreeBSD, OpenBSD, Android e iOS.
- Licencia: libre y gratuito (GPLv2 en Linux).
- Idioma: inglés. Se configura con un archivo de texto muy corto.
Por qué WireGuard
- Código pequeño: unas 4.000 líneas en Linux, frente a los cientos de miles de OpenVPN o IPsec. Menos código significa menos fallos posibles y una auditoría mucho más sencilla. Linus Torvalds llegó a llamarlo «una obra de arte» comparado con las alternativas.
- Cifrado fijo y moderno: no hay que elegir algoritmos. Usa siempre ChaCha20-Poly1305, Curve25519 y BLAKE2s, así que no existen configuraciones débiles por error ni ataques de «degradación» a cifrados antiguos.
- Rápido: funciona dentro del kernel (en Windows, con el controlador WireGuardNT), con menos latencia y menos consumo de CPU que OpenVPN.
- Ideal en el móvil: si no hay tráfico no envía nada, así que gasta poca batería, y al pasar de Wi-Fi a datos móviles el túnel sigue funcionando sin reconectar.
Conceptos básicos
- Claves como en SSH: cada equipo tiene una clave privada (que nunca sale de él) y una clave pública (que se da a los demás). No hay certificados ni usuarios y contraseñas.
- Peers, no clientes y servidores: todos los equipos son «pares» (peers). Llamamos «servidor» al que tiene una IP pública y espera conexiones, pero técnicamente son iguales.
- AllowedIPs: indica qué direcciones van por el túnel hacia un peer y, a la vez, qué direcciones se aceptan de él. En el cliente,
AllowedIPs = 0.0.0.0/0manda todo el tráfico por la VPN;AllowedIPs = 10.0.0.0/24manda solo el de la red de la VPN (túnel dividido). - Solo UDP: usa un puerto UDP, por defecto el 51820.
Montar un servidor WireGuard en Linux (Ubuntu/Debian)
Esto es para un VPS o un equipo con Linux que haga de servidor. Todos los comandos van en la terminal del servidor, conectado por SSH (por ejemplo con PuTTY).
- Instala WireGuard:
sudo apt update && sudo apt install wireguard - Genera las claves del servidor con permisos seguros:
sudo -i
cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey publickey
- Averigua el nombre de la tarjeta de red que sale a Internet con
ip route | grep default. Aparece detrás dedev(por ejemploeth0,ens3oenp1s0). - Crea el archivo
/etc/wireguard/wg0.conf(por ejemplo connano /etc/wireguard/wg0.conf), poniendo tu clave privada y cambiandoeth0por el nombre del paso anterior:
[Interface]
PrivateKey = <clave-privada-del-servidor>
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = sysctl -w net.ipv4.ip_forward=1; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -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
Las líneas PostUp y PostDown activan el reenvío y el NAT para que los clientes puedan salir a Internet a través del servidor. Si solo quieres acceder a la red del servidor y no navegar a través de él, puedes quitarlas.
- Abre el puerto UDP 51820 en el cortafuegos del servidor (y en el del proveedor del VPS, si tiene uno en su panel). Con ufw:
ufw allow 51820/udp - Arranca el túnel y haz que se inicie solo:
systemctl enable --now wg-quick@wg0
Conectar un cliente
En Windows
- Descarga e instala WireGuard desde la web oficial.
- Ábrelo y pulsa la flecha junto a Add Tunnel > Add empty tunnel. La aplicación genera sola las claves del cliente: copia la clave pública (Public key) que aparece arriba.
- Ponle un nombre y completa la configuración debajo de la línea
PrivateKey, con la clave pública del servidor y su IP pública:
[Interface]
PrivateKey = (la que generó la aplicación)
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <clave-publica-del-servidor>
Endpoint = <ip-publica-del-servidor>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
- Pulsa Save. Si alguien te ha pasado ya un archivo
.conf, puedes usar directamente Import tunnel(s) from file.
En Linux
Instala WireGuard igual que en el servidor, genera sus claves con el mismo comando y crea /etc/wireguard/wg0.conf con el contenido del ejemplo de Windows (poniendo su propia clave privada). Para conectar: sudo wg-quick up wg0; para desconectar: sudo wg-quick down wg0.
En Android e iOS
Instala la app oficial de WireGuard desde Google Play o la App Store y pulsa +. Puedes escanear un código QR con la configuración, importar un archivo .conf o crearla desde cero (la app genera las claves). Activa el interruptor del túnel para conectar.
Un truco cómodo: en el servidor, instala qrencode y ejecuta qrencode -t ansiutf8 < cliente.conf para mostrar en la terminal el QR de un archivo de configuración de cliente y escanearlo con el móvil.
Dar de alta el cliente en el servidor
En el servidor, añade al final de /etc/wireguard/wg0.conf una sección por cada cliente, con su clave pública y su IP dentro de la VPN (cada cliente una distinta:.2,.3,.4…):
[Peer]
PublicKey = <clave-publica-del-cliente>
AllowedIPs = 10.0.0.2/32
Reinicia el túnel del servidor con systemctl restart wg-quick@wg0 y activa el túnel en el cliente.
Nunca compartas ni pegues en foros o chats una clave privada. Solo se intercambian las claves públicas.
Comprobar que funciona
- En el servidor o en un cliente Linux,
sudo wg showmuestra cada peer con su último latest handshake (debe ser de hace pocos segundos o minutos) y los datos transferidos. En Windows, la misma información aparece en la ventana del túnel. - Desde el cliente,
ping 10.0.0.1debe responder. - Si usas
AllowedIPs = 0.0.0.0/0, busca «cuál es mi IP» en el navegador: debe salir la IP del servidor.
Problemas frecuentes
No hay handshake
Revisa en este orden: que el Endpoint del cliente tiene la IP pública y el puerto correctos; que el puerto UDP 51820 está abierto en el cortafuegos del servidor y del proveedor del VPS; y que las claves públicas están bien copiadas en los dos extremos (un solo carácter mal y no conecta). Recuerda que la clave pública del cliente va en el servidor y la del servidor en el cliente.
Conecta, pero no hay Internet
Falla el reenvío o el NAT del servidor. Comprueba que tienes las líneas PostUp/PostDown con el nombre correcto de la tarjeta de red (no siempre es eth0) y que sysctl net.ipv4.ip_forward devuelve 1. Si en el cliente no resuelve nombres, revisa la línea DNS.
Se corta en Wi-Fi públicas o en el móvil
Añade PersistentKeepalive = 25 en la sección [Peer] del cliente: envía un pequeño paquete cada 25 segundos para que el router no cierre la conexión.
La red bloquea UDP
Algunas redes de empresa, hoteles o colegios solo dejan salir tráfico web. WireGuard no puede ir por TCP 443 como OpenVPN, así que ahí no funcionará sin herramientas extra que encapsulen el tráfico.
Limitaciones
- Solo UDP: no atraviesa redes que bloquean UDP.
- IPs fijas: no reparte direcciones automáticamente; cada cliente tiene la suya en la configuración.
- Gestión manual de claves: para dar de baja a un cliente hay que borrar su
[Peer]del servidor. Con muchos clientes conviene un panel de gestión como wg-easy, o un servicio como Tailscale, que usa WireGuard por debajo y lo automatiza todo (claves, NAT, sin abrir puertos).
Preguntas frecuentes
¿Es más seguro que OpenVPN?
Los dos son seguros bien configurados. La ventaja de WireGuard es que es muy difícil configurarlo mal: no hay cifrados que elegir y el código es pequeño y muy revisado. OpenVPN sigue siendo útil cuando necesitas TCP o el puerto 443.
¿Tengo que abrir puertos en el router?
Solo en el lado del servidor, el UDP 51820 (o el que elijas). Los clientes no necesitan abrir nada.
¿Y si el servidor está en casa, sin IP fija?
Usa un servicio de DNS dinámico (DDNS) y pon el nombre en el Endpoint en lugar de la IP. Muchos routers traen ya un servidor WireGuard integrado; revisa su menú de VPN.
¿Gasta mucha batería en el móvil?
No. Al no enviar nada cuando no hay tráfico, consume menos que OpenVPN. Si usas PersistentKeepalive, el gasto sube un poco, pero sigue siendo bajo.