WireGuard PersistentKeepalive 25 y PresharedKey en un VPS
PersistentKeepalive = 25 envía un keepalive cada 25 s para que el NAT mantenga abierto el túnel; configúralo en el cliente detrás de NAT. PresharedKey añade una protección simétrica frente a la computación cuántica.
Respuesta corta: `PersistentKeepalive = 25` indica a WireGuard que envíe un pequeño paquete autenticado al peer cada 25 segundos, lo que mantiene vivas las asignaciones del NAT y de los firewalls con estado para que el otro extremo pueda seguir llegando a ti. Normalmente solo se configura en el peer que está detrás de NAT (un portátil, un móvil o un router doméstico), no en un VPS con IP pública. `PresharedKey` es un secreto simétrico opcional adicional de 256 bits por cada par de peers, generado con `wg genpsk`, que se mezcla en el handshake como protección frente a futuros ataques cuánticos contra Curve25519.
Esta guía explica ambas opciones y ofrece una configuración funcional de servidor y cliente para un VPS con WireGuard. Para la configuración completa de la VPN con NAT y DNS, consulta la guía de VPN con WireGuard.
Qué hace realmente PersistentKeepalive = 25
WireGuard es silencioso por diseño: cuando no circulan datos, no envía nada. Eso es bueno para la privacidad y la batería, pero los routers que hacen NAT y seguimiento de conexiones descartan las asignaciones UDP inactivas, a menudo a los 30 segundos y a veces a los pocos minutos. Una vez desaparecida la asignación, los paquetes del servidor ya no pueden llegar a un cliente detrás de NAT hasta que el cliente vuelva a enviar algo.
`PersistentKeepalive` es un intervalo en segundos. Con `25`, el peer envía un keepalive vacío y cifrado siempre que lleve 25 segundos sin enviar nada. El valor 25 es el que recomienda la documentación de WireGuard porque queda con seguridad por debajo de los timeouts UDP habituales más cortos. La opción está desactivada por defecto (`0`), y el coste es un paquete pequeño aproximadamente cada 25 segundos por peer.
| Valor | Efecto | Cuándo usarlo |
|---|---|---|
| 0 o sin definir | Sin keepalives; el túnel está en silencio cuando no hay actividad | Ambos peers tienen IP pública, o el cliente es siempre quien inicia el tráfico |
| 25 | Keepalive cada 25 s de inactividad | Cliente detrás de NAT o CGNAT que debe seguir siendo accesible |
| 15–20 | Keepalives más frecuentes | Redes con timeouts UDP inusualmente agresivos |
| 60+ | Menos paquetes, más riesgo de perder la asignación | Rara vez útil; la mayoría de los dispositivos NAT caducan antes |
Qué extremo necesita PersistentKeepalive
Configura el keepalive en el peer al que no se puede llegar directamente, que es el que está detrás de NAT. Ese peer envía los paquetes hacia fuera y refresca su propia asignación NAT. Un VPS con una dirección IPv4 pública no tiene NAT delante, así que no necesita la opción para seguir siendo accesible, y tampoco puede mantener abierto por sí solo un NAT remoto, porque solo conoce el endpoint del cliente a partir de los paquetes del cliente.
Si el cliente solo navega a través del túnel, se reconecta al instante cada vez que envía tráfico, así que el keepalive es opcional. Lo necesitas cuando el servidor u otros peers deben iniciar conexiones hacia el cliente, por ejemplo para entrar por SSH a una máquina de casa, para monitorización o para un enlace site-to-site.
- ▹Portátil o móvil detrás de NAT hacia un VPS: configura `PersistentKeepalive = 25` solo en el cliente.
- ▹VPS a VPS, ambos con IP pública: normalmente déjalo sin definir; consulta [la guía de malla WireGuard](/guides/wireguard-mesh-vps-cluster).
- ▹Servidor doméstico detrás de CGNAT expuesto a través de un VPS: configúralo en el servidor doméstico, o el VPS perderá la ruta en cuestión de minutos.
- ▹Clientes móviles: un keepalive consume algo de batería; actívalo solo si el dispositivo debe ser accesible.
PresharedKey: la capa simétrica opcional
El handshake de WireGuard usa intercambio de claves Curve25519. Un ordenador cuántico lo bastante grande podría, en teoría, romper ese intercambio, y un adversario podría grabar el tráfico hoy y descifrarlo más adelante. `PresharedKey` mezcla una clave simétrica adicional de 256 bits en el handshake. No se considera que las claves simétricas de ese tamaño puedan romperse en la práctica con los algoritmos cuánticos conocidos, así que si la PSK sigue siendo secreta, el tráfico grabado sigue protegido aunque se rompa la parte de clave pública.
La PSK es por cada par de peers, debe ser idéntica en las secciones `[Peer]` de ambos y debería ser única para cada par. No sustituye a las claves privadas; es una capa adicional. Si las PSK no coinciden, el handshake falla sin avisar y no verás ningún `latest handshake` en `wg show`.
- ▹Genérala con `wg genpsk`, que devuelve una clave aleatoria de 32 bytes codificada en base64.
- ▹Transfiérela por un canal en el que ya confíes, como SSH, nunca por chat o email.
- ▹Usa una PSK por par: en una malla de cinco nodos, son diez PSK distintas.
- ▹Rótala como cualquier otro secreto cuando se pierda o se retire un dispositivo.
Genera las claves y una PresharedKey
Instala las herramientas en Debian 12/13 o Ubuntu 24.04 con `apt install wireguard` y genera las claves en la máquina donde vivirá cada clave privada. La PSK puede generarse en cualquiera de los dos extremos y copiarse al otro. `umask 077` garantiza que los archivos solo sean legibles por root.
umask 077
cd /etc/wireguard
# on the VPS
wg genkey | tee server.key | wg pubkey > server.pub
# on the client
wg genkey | tee client.key | wg pubkey > client.pub
# once, on either side; copy to the other over SSH
wg genpsk > client.pskConfiguración del servidor en el VPS: /etc/wireguard/wg0.conf
El servidor tiene un puerto de escucha fijo, sin keepalive y sin `Endpoint` para el cliente, porque conoce la dirección actual del cliente a partir de los paquetes autenticados.
[Interface]
Address = 10.8.0.1/24, fd08::1/64
ListenPort = 51820
PrivateKey = <contents of server.key>
[Peer]
# laptop
PublicKey = <contents of client.pub>
PresharedKey = <contents of client.psk>
AllowedIPs = 10.8.0.2/32, fd08::2/128Note · Abre el puerto UDP 51820 en el firewall del VPS y arranca el túnel con `systemctl enable --now wg-quick@wg0`. Protege SSH como se describe en la guía de hardening de SSH y revisa los permisos de las claves con la guía de StrictModes antes de exponer nada más.
Configuración del cliente detrás de NAT
El cliente apunta a la dirección pública del VPS y lleva el keepalive. Usa `AllowedIPs = 10.8.0.0/24, fd08::/64` solo para un túnel privado, o `0.0.0.0/0, ::/0` para enviar todo el tráfico a través del VPS.
[Interface]
Address = 10.8.0.2/32, fd08::2/128
PrivateKey = <contents of client.key>
[Peer]
PublicKey = <contents of server.pub>
PresharedKey = <contents of client.psk>
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.0/24, fd08::/64
PersistentKeepalive = 25Note · Un VPS Wisp de NoctisNode (1 vCPU, 1 GB de RAM, $6 por ciclo de 28 días) con una IPv4 dedicada basta para un endpoint WireGuard personal, y puede pagarse en Monero u otras cripto con solo un email y una contraseña al registrarte.
Verifica y soluciona problemas
Ejecuta `wg show` en ambos extremos. Un cliente sano muestra un `latest handshake` reciente, `persistent keepalive: every 25 seconds` y `preshared key: (hidden)` para el peer.
- 01.Ningún handshake: comprueba que el puerto UDP 51820 está abierto en el VPS y que `Endpoint` usa la IP y el puerto correctos.
- 02.El handshake funciona sin PSK pero no con ella: la PresharedKey es distinta en las dos configuraciones; cópiala de nuevo.
- 03.El túnel funciona, pero al minuto el servidor no llega al cliente: añade `PersistentKeepalive = 25` en el cliente.
- 04.Cambia el keepalive sin reiniciar: `wg set wg0 peer <server-public-key> persistent-keepalive 25`.
- 05.Añade una PSK desde un archivo en caliente: `wg set wg0 peer <public-key> preshared-key /etc/wireguard/client.psk`.
Preguntas frecuentes
Q¿Qué significa PersistentKeepalive 25 en WireGuard?
AHace que el peer envíe un paquete keepalive cifrado tras 25 segundos sin otro tráfico. Así se mantienen abiertas las asignaciones del NAT y del firewall y el túnel sigue siendo accesible desde el otro extremo.
Q¿PersistentKeepalive va en el servidor o en el cliente?
AEn el peer que está detrás de NAT, que casi siempre es el cliente. Un VPS con IP pública no lo necesita y no puede mantener abierta por sí solo la asignación NAT del cliente.
Q¿Es obligatoria una PresharedKey en WireGuard?
ANo, es opcional. Añade un secreto simétrico al handshake como protección frente a futuros ataques cuánticos contra Curve25519, así que es una buena opción por defecto para túneles de larga duración.
Q¿Cómo genero una PresharedKey de WireGuard?
AEjecuta `wg genpsk > peer.psk` y pon el mismo valor en la línea `PresharedKey` de las secciones `[Peer]` de ambos peers. Usa una PSK distinta para cada par de peers.
Q¿PersistentKeepalive consume mucho ancho de banda?
ANo. Envía un paquete pequeño aproximadamente cada 25 segundos de inactividad, lo que es insignificante en un VPS, aunque puede reducir ligeramente la autonomía de la batería en los móviles.